UI: Have scroll views directly remember their pos.

Kinda like checkboxes, cleaner this way.
This commit is contained in:
Unknown W. Brackets 2021-09-27 23:25:41 -07:00
parent 4d5a63a74e
commit fc78b408b2
4 changed files with 14 additions and 16 deletions

View file

@ -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;
@ -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) {

View file

@ -262,8 +262,8 @@ public:
// 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;
@ -277,10 +277,14 @@ public:
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);
@ -309,7 +313,7 @@ private:
float pull_ = 0.0f;
float lastViewSize_ = 0.0f;
bool scrollToTopOnSizeChange_ = false;
bool rememberPosition_;
float *rememberPos_ = nullptr;
static float lastScrollPosX;
static float lastScrollPosY;

View file

@ -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);
@ -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) {

View file

@ -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");
@ -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);
@ -1248,9 +1248,6 @@ void MainScreen::update() {
RecreateViews();
lastVertical_ = vertical;
}
if (scrollAllGames_) {
g_Config.fGameListScrollPosition = scrollAllGames_->GetScrollPosition();
}
}
bool MainScreen::UseVerticalLayout() const {