From 5d15985e69edde7743f3f0d9865cb7488c4bea82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Sat, 23 Apr 2016 22:45:46 +0300 Subject: [PATCH] UI|Home: Fixed scrolling to newly selected package; cleanup --- .../include/ui/widgets/homemenuwidget.h | 4 +- .../client/src/ui/dialogs/packagesdialog.cpp | 15 ++-- .../client/src/ui/home/gamecolumnwidget.cpp | 8 +- .../client/src/ui/widgets/homemenuwidget.cpp | 79 +++++++------------ 4 files changed, 43 insertions(+), 63 deletions(-) diff --git a/doomsday/apps/client/include/ui/widgets/homemenuwidget.h b/doomsday/apps/client/include/ui/widgets/homemenuwidget.h index be9fb02d6f..0ea7e92688 100644 --- a/doomsday/apps/client/include/ui/widgets/homemenuwidget.h +++ b/doomsday/apps/client/include/ui/widgets/homemenuwidget.h @@ -39,7 +39,7 @@ class HomeMenuWidget : public de::MenuWidget /** * Returns the selected widget's index number in the list of menu children. */ - int selectedIndex() const; + de::ui::DataPos selectedIndex() const; /** * @brief setSelectedIndex @@ -47,7 +47,7 @@ class HomeMenuWidget : public de::MenuWidget * * @return The highlighted widget, if one was highlighted. Otherwise, returns nullptr. */ - void setSelectedIndex(int index); + void setSelectedIndex(de::ui::DataPos index); signals: void selectedIndexChanged(int index); diff --git a/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp b/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp index 0ab3067e10..5294358035 100644 --- a/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp +++ b/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp @@ -202,7 +202,6 @@ DENG_GUI_PIMPL(PackagesDialog) QObject::connect(menu, &HomeMenuWidget::itemClicked, [this] (int index) { - // Update the remove button position. if(index >= 0) { browser->scrollToPackage(menu->items().at(index) @@ -297,13 +296,12 @@ DENG_GUI_PIMPL(PackagesDialog) { selectedPackages.append(packageId); menu->items() << new SelectedPackageItem(packageId); + updateNothingIndicator(); } else { removePackage(packageId); } - - updateNothingIndicator(); } void removePackage(String const &packageId) @@ -312,12 +310,19 @@ DENG_GUI_PIMPL(PackagesDialog) auto pos = menu->items().findData(packageId); DENG2_ASSERT(pos != ui::Data::InvalidPos); menu->items().remove(pos); + updateNothingIndicator(); } void widgetChildAdded(Widget &child) { - menu->setSelectedIndex(menu->items().find( - *menu->organizer().findItemForWidget(child.as()))); + ui::DataPos pos = menu->findItem(child.as()); + // We use a delay here because ScrollAreaWidget does scrolling based on + // the current geometry of the widget and HomeItemWidget uses an animation + // for its height. + Loop::get().timer(0.3, [this, pos] () + { + menu->setSelectedIndex(pos); + }); } }; diff --git a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp index cf39bdbc99..b566da38c7 100644 --- a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp +++ b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp @@ -421,17 +421,13 @@ DENG_GUI_PIMPL(GameColumnWidget) new CallbackAction([this, button, profileItem, popup] () { popup->detachAnchor(); -#ifdef DENG2_QT_5_4_OR_NEWER // Animate the widget to fade it away. TimeDelta const SPAN = 0.2; button->setOpacity(0, SPAN); - QTimer::singleShot(SPAN.asMilliSeconds(), [profileItem] () { + Loop::get().timer(SPAN, [profileItem] () + { delete profileItem->profile; }); -#else - // Oh well. - delete profileItem->profile; -#endif })) << new ui::ActionItem(tr("Cancel"), new Action); diff --git a/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp b/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp index c63dde622b..7c22008e39 100644 --- a/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp +++ b/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp @@ -25,8 +25,8 @@ DENG_GUI_PIMPL(HomeMenuWidget) , DENG2_OBSERVES(ChildWidgetOrganizer, WidgetCreation) , DENG2_OBSERVES(Asset, StateChange) { - int selectedIndex = -1; - int previousSelectedIndex = 0; + ui::DataPos selectedIndex = ui::Data::InvalidPos; + ui::DataPos previousSelectedIndex = 0; Instance(Public *i) : Base(i) { @@ -46,7 +46,6 @@ DENG_GUI_PIMPL(HomeMenuWidget) thisPublic, SLOT(mouseActivityInItem())); QObject::connect(&widget, SIGNAL(selected()), thisPublic, SLOT(itemSelectionChanged())); - //QObject::connect(&widget, SIGNAL(deselected()), thisPublic, SLOT(itemSelectionChanged())); } } @@ -61,10 +60,12 @@ DENG_GUI_PIMPL(HomeMenuWidget) void scrollToSelected() { - if(selectedIndex >= 0 && self.hasRoot()) + if(self.hasRoot()) { - self.findTopmostScrollable().scrollToWidget( - self.childWidgets().at(selectedIndex)->as()); + if(auto *widget = self.itemWidget(selectedIndex)) + { + self.findTopmostScrollable().scrollToWidget(*widget); + } } } }; @@ -84,7 +85,7 @@ void HomeMenuWidget::unselectAll() { if(d->selectedIndex >= 0) { - d->selectedIndex = -1; + d->selectedIndex = ui::Data::InvalidPos; // Unselect all items. for(auto *w : childWidgets()) @@ -106,73 +107,51 @@ void HomeMenuWidget::restorePreviousSelection() setSelectedIndex(d->previousSelectedIndex); } -int HomeMenuWidget::selectedIndex() const +ui::DataPos HomeMenuWidget::selectedIndex() const { return d->selectedIndex; } -void HomeMenuWidget::setSelectedIndex(int index) +void HomeMenuWidget::setSelectedIndex(ui::DataPos index) { - if(index >= 0 && index < childWidgets().size()) + if(auto *widget = itemWidget(index)) { - if(HomeItemWidget *widget = childWidgets().at(index)->maybeAs()) - { - widget->acquireFocus(); + widget->acquireFocus(); - // Check if we can scroll to the selected widget right away. - // If not, we are observing the asset and will scroll when it is ready. - if(assets().isReady()) - { - d->scrollToSelected(); - } - else - { - assets().audienceForStateChange() += d; - } + // Check if we can scroll to the selected widget right away. + // If not, we are observing the asset and will scroll when it is ready. + if(assets().isReady()) + { + d->scrollToSelected(); + } + else + { + assets().audienceForStateChange() += d; } } } void HomeMenuWidget::mouseActivityInItem() { - auto *clickedItem = dynamic_cast(sender()); - - emit itemClicked(childWidgets().indexOf(clickedItem)); -/* - // Radio button behavior: other items will be deselected. - for(int i = 0; i < childWidgets().size(); ++i) + if(auto *clickedWidget = dynamic_cast(sender())) { - if(auto *item = childWidgets().at(i)->maybeAs()) - { - item->setSelected(item == clickedItem); - - if(item == clickedItem) - { - d->selectedIndex = i; - } - } - }*/ + emit itemClicked(findItem(*clickedWidget)); + } } void HomeMenuWidget::itemSelectionChanged() { if(auto *clickedItem = dynamic_cast(sender())) { - int const newSelection = childWidgets().indexOf(clickedItem); + ui::DataPos const newSelection = findItem(*clickedItem); if(d->selectedIndex != newSelection) { - if(d->selectedIndex >= 0) + // Deselect the previous selection. + if(auto *item = itemWidget(d->selectedIndex)) { - auto children = childWidgets(); - if(d->selectedIndex < children.size()) - { - // Deselect the previous selection. - if(auto *item = children.at(d->selectedIndex)->maybeAs()) - { - item->setSelected(false); - } - } + item->setSelected(false); } + d->selectedIndex = d->previousSelectedIndex = newSelection; emit selectedIndexChanged(d->selectedIndex);