Skip to content

Commit

Permalink
UI: Have scroll views directly remember their pos.
Browse files Browse the repository at this point in the history
Kinda like checkboxes, cleaner this way.
  • Loading branch information
unknownbrackets committed Sep 28, 2021
1 parent 4d5a63a commit fc78b40
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 16 deletions.
8 changes: 3 additions & 5 deletions Common/UI/ViewGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1017,17 +1017,13 @@ void ScrollView::PersistData(PersistStatus status, std::string anonId, PersistMa
void ScrollView::SetVisibility(Visibility visibility) {
ViewGroup::SetVisibility(visibility);

if (visibility == V_GONE && !rememberPosition_) {
if (visibility == V_GONE && !rememberPos_) {
// Since this is no longer shown, forget the scroll position.
// For example, this happens when switching tabs.
ScrollTo(0.0f);
}
}

float ScrollView::GetScrollPosition() {
return scrollPos_;
}

void ScrollView::ScrollTo(float newScrollPos) {
scrollTarget_ = newScrollPos;
scrollToTarget_ = true;
Expand Down Expand Up @@ -1141,6 +1137,8 @@ void ScrollView::Update() {

if (oldPos != scrollPos_)
orientation_ == ORIENT_HORIZONTAL ? lastScrollPosX = scrollPos_ : lastScrollPosY = scrollPos_;
if (rememberPos_)
*rememberPos_ = scrollPos_;
}

void AnchorLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) {
Expand Down
12 changes: 8 additions & 4 deletions Common/UI/ViewGroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,8 @@ class GridLayoutList : public GridLayout {
// A scrollview usually contains just a single child - a linear layout or similar.
class ScrollView : public ViewGroup {
public:
ScrollView(Orientation orientation, LayoutParams *layoutParams = 0, bool rememberPosition = false)
: ViewGroup(layoutParams), orientation_(orientation), rememberPosition_(rememberPosition) {}
ScrollView(Orientation orientation, LayoutParams *layoutParams = 0)
: ViewGroup(layoutParams), orientation_(orientation) {}
~ScrollView();

void Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) override;
Expand All @@ -277,10 +277,14 @@ class ScrollView : public ViewGroup {
void ScrollTo(float newScrollPos);
void ScrollToBottom();
void ScrollRelative(float distance);
float GetScrollPosition();
bool CanScroll() const;
void Update() override;

void RememberPosition(float *pos) {
rememberPos_ = pos;
ScrollTo(*pos);
}

// Get the last moved scroll view position
static void GetLastScrollPosition(float &x, float &y);

Expand Down Expand Up @@ -309,7 +313,7 @@ class ScrollView : public ViewGroup {
float pull_ = 0.0f;
float lastViewSize_ = 0.0f;
bool scrollToTopOnSizeChange_ = false;
bool rememberPosition_;
float *rememberPos_ = nullptr;

static float lastScrollPosX;
static float lastScrollPosY;
Expand Down
3 changes: 1 addition & 2 deletions UI/CwCheatScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ void CwCheatScreen::CreateViews() {
rightScroll_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 0.5f));
rightScroll_->SetTag("CwCheats");
rightScroll_->SetScrollToTop(false);
rightScroll_->ScrollTo(g_Config.fCwCheatScrollPosition);
rightScroll_->RememberPosition(&g_Config.fCwCheatScrollPosition);
LinearLayout *rightColumn = new LinearLayoutList(ORIENT_VERTICAL, new LinearLayoutParams(200, FILL_PARENT, actionMenuMargins));
rightScroll_->Add(rightColumn);

Expand Down Expand Up @@ -140,7 +140,6 @@ void CwCheatScreen::onFinish(DialogResult result) {
if (MIPSComp::jit) {
MIPSComp::jit->ClearCache();
}
g_Config.fCwCheatScrollPosition = rightScroll_->GetScrollPosition();
}

UI::EventReturn CwCheatScreen::OnEnableAll(UI::EventParams &params) {
Expand Down
7 changes: 2 additions & 5 deletions UI/MainScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,7 @@ void MainScreen::CreateViews() {

Button *focusButton = nullptr;
if (hasStorageAccess) {
scrollAllGames_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT), true);
scrollAllGames_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT));
scrollAllGames_->SetTag("MainScreenAllGames");
ScrollView *scrollHomebrew = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT));
scrollHomebrew->SetTag("MainScreenHomebrew");
Expand All @@ -1026,7 +1026,7 @@ void MainScreen::CreateViews() {

tabHolder_->AddTab(mm->T("Games"), scrollAllGames_);
tabHolder_->AddTab(mm->T("Homebrew & Demos"), scrollHomebrew);
scrollAllGames_->ScrollTo(g_Config.fGameListScrollPosition);
scrollAllGames_->RememberPosition(&g_Config.fGameListScrollPosition);

tabAllGames->OnChoice.Handle(this, &MainScreen::OnGameSelectedInstant);
tabHomebrew->OnChoice.Handle(this, &MainScreen::OnGameSelectedInstant);
Expand Down Expand Up @@ -1248,9 +1248,6 @@ void MainScreen::update() {
RecreateViews();
lastVertical_ = vertical;
}
if (scrollAllGames_) {
g_Config.fGameListScrollPosition = scrollAllGames_->GetScrollPosition();
}
}

bool MainScreen::UseVerticalLayout() const {
Expand Down

0 comments on commit fc78b40

Please sign in to comment.