From 68a6f8186daea3f7504116a17aef1d2fa29b5cbc Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Jan 2016 10:52:16 -0800 Subject: [PATCH] UI: Avoid scroll to top on tab restore. Oops, missed this case. Fixes #7975, savedata manager scrolling on delete. --- ext/native/ui/viewgroup.cpp | 45 ++++++++++++++++++++++++++----------- ext/native/ui/viewgroup.h | 1 + 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/ext/native/ui/viewgroup.cpp b/ext/native/ui/viewgroup.cpp index e67f55f79e..79f67a06fc 100644 --- a/ext/native/ui/viewgroup.cpp +++ b/ext/native/ui/viewgroup.cpp @@ -1095,9 +1095,13 @@ TabHolder::TabHolder(Orientation orientation, float stripSize, LayoutParams *lay } EventReturn TabHolder::OnTabClick(EventParams &e) { - tabs_[currentTab_]->SetVisibility(V_GONE); - currentTab_ = e.a; - tabs_[currentTab_]->SetVisibility(V_VISIBLE); + // We have e.b set when it was an explicit click action. + // In that case, we make the view gone and then visible - this scrolls scrollviews to the top. + if (currentTab_ != e.a || e.b) { + tabs_[currentTab_]->SetVisibility(V_GONE); + currentTab_ = e.a; + tabs_[currentTab_]->SetVisibility(V_VISIBLE); + } return EVENT_DONE; } @@ -1155,7 +1159,7 @@ EventReturn ChoiceStrip::OnChoiceClick(EventParams &e) { // Unstick the other choices that weren't clicked. for (int i = 0; i < (int)views_.size(); i++) { if (views_[i] != e.v) { - static_cast(views_[i])->Release(); + Choice(i)->Release(); } else { selected_ = i; } @@ -1164,27 +1168,36 @@ EventReturn ChoiceStrip::OnChoiceClick(EventParams &e) { EventParams e2; e2.v = views_[selected_]; e2.a = selected_; + // Set to 1 to indicate an explicit click. + e2.b = 1; // Dispatch immediately (we're already on the UI thread as we're in an event handler). return OnChoice.Dispatch(e2); } void ChoiceStrip::SetSelection(int sel) { int prevSelected = selected_; - if (selected_ < (int)views_.size()) - static_cast(views_[selected_])->Release(); + StickyChoice *prevChoice = Choice(selected_); + if (prevChoice) + prevChoice->Release(); selected_ = sel; - if (selected_ < (int)views_.size()) - static_cast(views_[selected_])->Press(); - if (topTabs_ && prevSelected != selected_) { - EventParams e; - e.v = views_[selected_]; - static_cast(views_[selected_])->OnClick.Trigger(e); + StickyChoice *newChoice = Choice(selected_); + if (newChoice) { + newChoice->Press(); + + if (topTabs_ && prevSelected != selected_) { + EventParams e; + e.v = views_[selected_]; + e.a = selected_; + // Set to 0 to indicate a selection change (not a click.) + e.b = 0; + OnChoice.Trigger(e); + } } } void ChoiceStrip::HighlightChoice(unsigned int choice){ if (choice < (unsigned int)views_.size()){ - static_cast(views_[choice])->HighlightChanged(true); + Choice(choice)->HighlightChanged(true); } }; @@ -1212,6 +1225,12 @@ void ChoiceStrip::Draw(UIContext &dc) { } } +StickyChoice *ChoiceStrip::Choice(int index) { + if ((size_t)index < views_.size()) + return static_cast(views_[index]); + return nullptr; +} + ListView::ListView(ListAdaptor *a, LayoutParams *layoutParams) : ScrollView(ORIENT_VERTICAL, layoutParams), adaptor_(a), maxHeight_(0) { diff --git a/ext/native/ui/viewgroup.h b/ext/native/ui/viewgroup.h index e5cac7a176..6f28f2b31a 100644 --- a/ext/native/ui/viewgroup.h +++ b/ext/native/ui/viewgroup.h @@ -293,6 +293,7 @@ public: Event OnChoice; private: + StickyChoice *Choice(int index); EventReturn OnChoiceClick(EventParams &e); int selected_;