From 6b6914fd79690610620c4249bf0150c0c76dbf54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Sat, 27 Feb 2016 19:58:55 +0200 Subject: [PATCH] UI|Home: Persistent state for the selected game item --- .../client/include/ui/home/gamecolumnwidget.h | 8 +++- .../client/include/ui/home/homemenuwidget.h | 7 ++++ .../client/src/ui/home/gamecolumnwidget.cpp | 34 ++++++++++++---- .../src/ui/home/gamepanelbuttonwidget.cpp | 9 +++-- .../client/src/ui/home/homemenuwidget.cpp | 39 ++++++++++++++++--- 5 files changed, 79 insertions(+), 18 deletions(-) diff --git a/doomsday/apps/client/include/ui/home/gamecolumnwidget.h b/doomsday/apps/client/include/ui/home/gamecolumnwidget.h index dfebd2ca6a..1f7199e439 100644 --- a/doomsday/apps/client/include/ui/home/gamecolumnwidget.h +++ b/doomsday/apps/client/include/ui/home/gamecolumnwidget.h @@ -21,9 +21,11 @@ #include "columnwidget.h" +#include + class SavedSessionListData; -class GameColumnWidget : public ColumnWidget +class GameColumnWidget : public ColumnWidget, public de::IPersistent { Q_OBJECT @@ -35,6 +37,10 @@ class GameColumnWidget : public ColumnWidget de::String configVariableName() const override; void setHighlighted(bool highlighted) override; + // Implements IPersistent. + void operator >> (de::PersistentState &toState) const; + void operator << (de::PersistentState const &fromState); + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/apps/client/include/ui/home/homemenuwidget.h b/doomsday/apps/client/include/ui/home/homemenuwidget.h index 6d41515280..963c2ab134 100644 --- a/doomsday/apps/client/include/ui/home/homemenuwidget.h +++ b/doomsday/apps/client/include/ui/home/homemenuwidget.h @@ -35,6 +35,13 @@ class HomeMenuWidget : public de::MenuWidget void unselectAll(); + /** + * Returns the selected widget's index number in the list of menu children. + */ + int selectedIndex() const; + + void setSelectedIndex(int index); + protected slots: void mouseActivityInItem(); diff --git a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp index b72bdf02e1..cee97b9aa1 100644 --- a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp +++ b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp @@ -26,6 +26,7 @@ #include #include +#include #include using namespace de; @@ -50,7 +51,7 @@ DENG_GUI_PIMPL(GameColumnWidget) String gameFamily; SavedSessionListData const &savedItems; HomeMenuWidget *menu; - //Image bgImage; + int restoredSelected = -1; Instance(Public *i, String const &gameFamily, @@ -67,8 +68,7 @@ DENG_GUI_PIMPL(GameColumnWidget) menu->rule() .setInput(Rule::Width, area.contentRule().width()) .setInput(Rule::Left, area.contentRule().left()) - .setInput(Rule::Top, self.header().rule().bottom()/* + - rule("gap")*/); + .setInput(Rule::Top, self.header().rule().bottom()); DoomsdayApp::games().audienceForReadiness() += this; App::config("home.showUnplayableGames").audienceForChange() += this; @@ -134,11 +134,17 @@ DENG_GUI_PIMPL(GameColumnWidget) void gameReadinessUpdated() { populateItems(); + + // Restore earlier selection? + if(restoredSelected >= 0) + { + menu->setSelectedIndex(restoredSelected); + restoredSelected = -1; + } } - void variableValueChanged(Variable &var, Value const &) + void variableValueChanged(Variable &, Value const &) { - qDebug() << var.name() << "changed"; populateItems(); } @@ -168,7 +174,8 @@ DENG_GUI_PIMPL(GameColumnWidget) GameColumnWidget::GameColumnWidget(String const &gameFamily, SavedSessionListData const &savedItems) - : ColumnWidget(gameFamily.toLower() + "-column") + : ColumnWidget(gameFamily.isEmpty()? "other-column" + : (gameFamily.toLower() + "-column")) , d(new Instance(this, gameFamily.toLower(), savedItems)) { scrollArea().setContentSize(maximumContentWidth(), @@ -179,7 +186,8 @@ GameColumnWidget::GameColumnWidget(String const &gameFamily, header().title().setText(String(_E(s) "%1\n" _E(.)_E(w) "%2") .arg( gameFamily == "DOOM"? "id Software" : !gameFamily.isEmpty()? "Raven Software" : "") - .arg(!gameFamily.isEmpty()? QString(gameFamily) : tr("Other Games"))); + .arg(!gameFamily.isEmpty()? QString(gameFamily) + : tr("Other Games"))); if(!gameFamily.isEmpty()) { header().setLogoImage("logo.game." + gameFamily.toLower()); @@ -249,3 +257,15 @@ void GameColumnWidget::setHighlighted(bool highlighted) d->menu->unselectAll(); } } + +void GameColumnWidget::operator >> (PersistentState &toState) const +{ + Record &rec = toState.objectNamespace(); + rec.set(name().concatenateMember("selected"), d->menu->selectedIndex()); +} + +void GameColumnWidget::operator << (PersistentState const &fromState) +{ + Record const &rec = fromState.objectNamespace(); + d->restoredSelected = rec.geti(name().concatenateMember("selected"), -1); +} diff --git a/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp b/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp index e21bdafd9e..20079aba6f 100644 --- a/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp +++ b/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp @@ -22,10 +22,11 @@ #include "dd_main.h" #include +#include #include #include #include -#include +#include using namespace de; @@ -44,14 +45,14 @@ DENG_GUI_PIMPL(GamePanelButtonWidget) , savedItems(savedItems) { ButtonWidget *packages = new ButtonWidget; - packages->setImage(style().images().image("package")); + packages->setImage(new StyleProceduralImage("package", self)); packages->setOverrideImageSize(style().fonts().font("default").height().value()); packages->setSizePolicy(ui::Expand, ui::Expand); self.addButton(packages); playButton = new ButtonWidget; playButton->useInfoStyle(); - playButton->setImage(style().images().image("play")); + playButton->setImage(new StyleProceduralImage("play", self)); playButton->setImageColor(style().colors().colorf("inverted.text")); playButton->setOverrideImageSize(style().fonts().font("default").height().value()); playButton->setAction([this] () { playButtonPressed(); }); @@ -65,7 +66,7 @@ DENG_GUI_PIMPL(GamePanelButtonWidget) saves->setItems(savedItems); deleteSaveButton = new ButtonWidget; - deleteSaveButton->setImage(style().images().image("close.ring")); + deleteSaveButton->setImage(new StyleProceduralImage("close.ring", self)); deleteSaveButton->setOverrideImageSize(style().fonts().font("default").height().value()); deleteSaveButton->setSizePolicy(ui::Expand, ui::Expand); deleteSaveButton->set(Background()); diff --git a/doomsday/apps/client/src/ui/home/homemenuwidget.cpp b/doomsday/apps/client/src/ui/home/homemenuwidget.cpp index 1d6dae5728..a81a6f2ef1 100644 --- a/doomsday/apps/client/src/ui/home/homemenuwidget.cpp +++ b/doomsday/apps/client/src/ui/home/homemenuwidget.cpp @@ -24,6 +24,8 @@ using namespace de; DENG_GUI_PIMPL(HomeMenuWidget) , DENG2_OBSERVES(ChildWidgetOrganizer, WidgetCreation) { + int selectedIndex = -1; + Instance(Public *i) : Base(i) { self.organizer().audienceForWidgetCreation() += this; @@ -49,26 +51,51 @@ HomeMenuWidget::HomeMenuWidget(String const &name) void HomeMenuWidget::unselectAll() { - // Unselect all items. - for(auto *w : childWidgets()) + if(d->selectedIndex >= 0) { - if(auto *item = w->maybeAs()) + d->selectedIndex = -1; + + // Unselect all items. + for(auto *w : childWidgets()) { - item->setSelected(false); + if(auto *item = w->maybeAs()) + { + item->setSelected(false); + } } } } +int HomeMenuWidget::selectedIndex() const +{ + return d->selectedIndex; +} + +void HomeMenuWidget::setSelectedIndex(int index) +{ + if(index >= 0 && index < childWidgets().size()) + { + unselectAll(); + childWidgets().at(index)->as().setSelected(true); + d->selectedIndex = index; + } +} + void HomeMenuWidget::mouseActivityInItem() { auto *clickedItem = dynamic_cast(sender()); // Radio button behavior: other items will be deselected. - for(auto *w : childWidgets()) + for(int i = 0; i < childWidgets().size(); ++i) { - if(auto *item = w->maybeAs()) + if(auto *item = childWidgets().at(i)->maybeAs()) { item->setSelected(item == clickedItem); + + if(item == clickedItem) + { + d->selectedIndex = i; + } } } }