Skip to content

Commit

Permalink
UI|Home: Persistent state for the selected game item
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Feb 27, 2016
1 parent 27f528e commit 6b6914f
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 18 deletions.
8 changes: 7 additions & 1 deletion doomsday/apps/client/include/ui/home/gamecolumnwidget.h
Expand Up @@ -21,9 +21,11 @@

#include "columnwidget.h"

#include <de/IPersistent>

class SavedSessionListData;

class GameColumnWidget : public ColumnWidget
class GameColumnWidget : public ColumnWidget, public de::IPersistent
{
Q_OBJECT

Expand All @@ -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)
};
Expand Down
7 changes: 7 additions & 0 deletions doomsday/apps/client/include/ui/home/homemenuwidget.h
Expand Up @@ -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();

Expand Down
34 changes: 27 additions & 7 deletions doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp
Expand Up @@ -26,6 +26,7 @@

#include <de/ChildWidgetOrganizer>
#include <de/MenuWidget>
#include <de/PersistentState>
#include <de/App>

using namespace de;
Expand All @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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(),
Expand All @@ -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());
Expand Down Expand Up @@ -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);
}
9 changes: 5 additions & 4 deletions doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp
Expand Up @@ -22,10 +22,11 @@
#include "dd_main.h"

#include <doomsday/console/exec.h>
#include <de/App>
#include <de/CallbackAction>
#include <de/ChildWidgetOrganizer>
#include <de/PopupMenuWidget>
#include <de/App>
#include <de/StyleProceduralImage>

using namespace de;

Expand All @@ -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(); });
Expand All @@ -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());
Expand Down
39 changes: 33 additions & 6 deletions doomsday/apps/client/src/ui/home/homemenuwidget.cpp
Expand Up @@ -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;
Expand All @@ -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<HomeItemWidget>())
d->selectedIndex = -1;

// Unselect all items.
for(auto *w : childWidgets())
{
item->setSelected(false);
if(auto *item = w->maybeAs<HomeItemWidget>())
{
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<HomeItemWidget>().setSelected(true);
d->selectedIndex = index;
}
}

void HomeMenuWidget::mouseActivityInItem()
{
auto *clickedItem = dynamic_cast<HomeItemWidget *>(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<HomeItemWidget>())
if(auto *item = childWidgets().at(i)->maybeAs<HomeItemWidget>())
{
item->setSelected(item == clickedItem);

if(item == clickedItem)
{
d->selectedIndex = i;
}
}
}
}

0 comments on commit 6b6914f

Please sign in to comment.