Skip to content

Commit

Permalink
UI|Home: Selecting packages persistently using the Packages dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Mar 24, 2016
1 parent 86b4642 commit fa41069
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 21 deletions.
6 changes: 6 additions & 0 deletions doomsday/apps/client/include/ui/dialogs/packagesdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,15 @@ class PackagesDialog : public de::DialogWidget
public:
PackagesDialog(de::String const &titleText = "");

void setSelectedPackages(de::StringList const &packages);
de::StringList selectedPackages() const;

public slots:
void refreshPackages();

protected:
void preparePanelForOpening() override;

private:
DENG2_PRIVATE(d)
};
Expand Down
6 changes: 3 additions & 3 deletions doomsday/apps/client/include/ui/home/gamepanelbuttonwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#include "panelbuttonwidget.h"

#include <doomsday/game.h>
#include <doomsday/gameprofiles.h>

class SavedSessionListData;

Expand All @@ -33,8 +33,8 @@ class GamePanelButtonWidget : public PanelButtonWidget
Q_OBJECT

public:
GamePanelButtonWidget(Game const &game,
SavedSessionListData const &savedItems);
GamePanelButtonWidget(GameProfile &game,
SavedSessionListData const &savedItems);

void setSelected(bool selected) override;

Expand Down
6 changes: 4 additions & 2 deletions doomsday/apps/client/include/ui/widgets/packageswidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#ifndef DENG_CLIENT_UI_HOME_PACKAGESWIDGET_H
#define DENG_CLIENT_UI_HOME_PACKAGESWIDGET_H

#include <de/GuiWidget>
#include <de/ButtonWidget>
#include <de/IPersistent>

class HomeItemWidget;
Expand All @@ -44,7 +44,7 @@ class PackagesWidget : public de::GuiWidget, public de::IPersistent
{
public:
virtual ~IButtonHandler();
virtual void packageButtonClicked(HomeItemWidget &itemWidget, de::String const &packageId) = 0;
virtual void packageButtonClicked(de::ButtonWidget &button, de::String const &packageId) = 0;
};

public:
Expand All @@ -58,6 +58,8 @@ class PackagesWidget : public de::GuiWidget, public de::IPersistent
void setColorTheme(ColorTheme unselectedItem, ColorTheme selectedItem,
ColorTheme loadedUnselectedItem, ColorTheme loadedSelectedItem);

void populate();

// Implements IPersistent.
void operator >> (de::PersistentState &toState) const;
void operator << (de::PersistentState const &fromState);
Expand Down
19 changes: 18 additions & 1 deletion doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ DENG_GUI_PIMPL(PackagesDialog)
return selectedPackages.contains(packageId);
}

void packageButtonClicked(HomeItemWidget &, String const &packageId) override
void packageButtonClicked(ButtonWidget &, String const &packageId) override
{
if(!selectedPackages.contains(packageId))
{
Expand Down Expand Up @@ -386,8 +386,25 @@ PackagesDialog::PackagesDialog(String const &titleText)
refreshPackages();
}

void PackagesDialog::setSelectedPackages(StringList const &packages)
{
d->selectedPackages = packages;
d->browser->populate();
}

StringList PackagesDialog::selectedPackages() const
{
return d->selectedPackages;
}

void PackagesDialog::refreshPackages()
{
App::fileSystem().refresh();
d->populate();
}

void PackagesDialog::preparePanelForOpening()
{
DialogWidget::preparePanelForOpening();
d->populate();
}
8 changes: 4 additions & 4 deletions doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ DENG_GUI_PIMPL(GameColumnWidget)
, DENG2_OBSERVES(Deletable, Deletion)
{
GameColumnWidget::Instance *d;
GameProfile const *profile;
GameProfile *profile;

MenuItem(GameColumnWidget::Instance *d, GameProfile const &gameProfile)
MenuItem(GameColumnWidget::Instance *d, GameProfile &gameProfile)
: d(d)
, profile(&gameProfile)
{
Expand Down Expand Up @@ -131,7 +131,7 @@ DENG_GUI_PIMPL(GameColumnWidget)
return menu->itemWidget<GamePanelButtonWidget>(item);
}

void addItemForProfile(GameProfile const &profile)
void addItemForProfile(GameProfile &profile)
{
auto const &games = DoomsdayApp::games();
if(games.contains(profile.game()))
Expand Down Expand Up @@ -209,7 +209,7 @@ DENG_GUI_PIMPL(GameColumnWidget)

GuiWidget *makeItemWidget(ui::Item const &item, GuiWidget const *)
{
auto *button = new GamePanelButtonWidget(item.as<MenuItem>().game(), savedItems);
auto *button = new GamePanelButtonWidget(*item.as<MenuItem>().profile, savedItems);
return button;
}

Expand Down
38 changes: 29 additions & 9 deletions doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include "dd_main.h"

#include <doomsday/console/exec.h>
#include <doomsday/doomsdayapp.h>
#include <doomsday/games.h>
#include <de/App>
#include <de/CallbackAction>
#include <de/ChildWidgetOrganizer>
Expand All @@ -34,23 +36,27 @@ using namespace de;
DENG_GUI_PIMPL(GamePanelButtonWidget)
, public ChildWidgetOrganizer::IFilter
{
GameProfile &gameProfile;
Game const &game;
SavedSessionListData const &savedItems;
SaveListWidget *saves;
ButtonWidget *packagesButton;
ButtonWidget *playButton;
ButtonWidget *deleteSaveButton;

Instance(Public *i, Game const &game, SavedSessionListData const &savedItems)
Instance(Public *i, GameProfile &profile, SavedSessionListData const &savedItems)
: Base(i)
, game(game)
, gameProfile(profile)
, game(DoomsdayApp::games()[profile.game()])
, savedItems(savedItems)
{
packagesButton = new ButtonWidget;
packagesButton->setImage(new StyleProceduralImage("package", self));
packagesButton->setOverrideImageSize(style().fonts().font("default").height().value());
packagesButton->setSizePolicy(ui::Expand, ui::Expand);
packagesButton->setTextAlignment(ui::AlignLeft);
packagesButton->setActionFn([this] () { packagesButtonPressed(); });
updatePackagesButton();
self.addButton(packagesButton);

playButton = new ButtonWidget;
Expand Down Expand Up @@ -87,16 +93,30 @@ DENG_GUI_PIMPL(GamePanelButtonWidget)
// which order. One can also browse the available packages.
auto *dlg = new PackagesDialog(game.title());
dlg->setDeleteAfterDismissed(true);
/*if(self.rule().midX().value() < root().viewWidth().value()/2)
dlg->setSelectedPackages(gameProfile.packages());
dlg->setAcceptanceAction(new CallbackAction([this, dlg] ()
{
dlg->setAnchorAndOpeningDirection(packagesButton->rule(), ui::Right);
gameProfile.setPackages(dlg->selectedPackages());
updatePackagesButton();
}));
root().addOnTop(dlg);
dlg->open();
}

void updatePackagesButton()
{
if(gameProfile.packages().isEmpty())
{
packagesButton->setText("");
packagesButton->setTextColor("text");
packagesButton->setImageColor(style().colors().colorf("text"));
}
else
{
dlg->setAnchorAndOpeningDirection(packagesButton->rule(), ui::Left);
}*/
root().addOnTop(dlg);
dlg->open();
packagesButton->setText(String::format("%i", gameProfile.packages().count()));
packagesButton->setTextColor("accent");
packagesButton->setImageColor(style().colors().colorf("accent"));
}
}

void playButtonPressed()
Expand Down Expand Up @@ -165,7 +185,7 @@ DENG_GUI_PIMPL(GamePanelButtonWidget)
}
};

GamePanelButtonWidget::GamePanelButtonWidget(Game const &game, SavedSessionListData const &savedItems)
GamePanelButtonWidget::GamePanelButtonWidget(GameProfile &game, SavedSessionListData const &savedItems)
: d(new Instance(this, game, savedItems))
{
connect(d->saves, SIGNAL(selectionChanged(de::ui::DataPos)), this, SLOT(saveSelected(de::ui::DataPos)));
Expand Down
19 changes: 19 additions & 0 deletions doomsday/apps/client/src/ui/home/packagescolumnwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,41 @@
#include "ui/home/packagescolumnwidget.h"
#include "ui/widgets/packageswidget.h"

#include <de/PopupMenuWidget>

using namespace de;

DENG_GUI_PIMPL(PackagesColumnWidget)
, public PackagesWidget::IButtonHandler
{
PackagesWidget *packages;

Instance(Public *i) : Base(i)
{
ScrollAreaWidget &area = self.scrollArea();
area.add(packages = new PackagesWidget("home-packages"));
packages->setButtonHandler(*this);
packages->setButtonLabels(tr("..."), tr("..."));
packages->rule()
.setInput(Rule::Width, area.contentRule().width())
.setInput(Rule::Top, self.header().rule().bottom() +
rule("gap"))
.setInput(Rule::Left, area.contentRule().left());
}

void packageButtonClicked(ButtonWidget &button, de::String const &packageId) override
{
auto *popMenu = new PopupMenuWidget;
popMenu->setDeleteAfterDismissed(true);
popMenu->setColorTheme(Inverted);
popMenu->setAnchorAndOpeningDirection(button.rule(), ui::Down);
popMenu->items()
<< new ui::ActionItem(tr("Info"))
<< new ui::Item(ui::Item::Separator)
<< new ui::ActionItem(style().images().image("close.ring"), tr("Uninstall..."));
root().addOnTop(popMenu);
popMenu->open();
}
};

PackagesColumnWidget::PackagesColumnWidget()
Expand Down
9 changes: 7 additions & 2 deletions doomsday/apps/client/src/ui/widgets/packageswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ struct PackageLoadStatus : public PackagesWidget::IPackageStatus

struct LoadOrUnloadPackage : public PackagesWidget::IButtonHandler
{
void packageButtonClicked(HomeItemWidget &, de::String const &packageId)
void packageButtonClicked(ButtonWidget &, de::String const &packageId) override
{
auto &loader = App::packageLoader();

Expand Down Expand Up @@ -135,7 +135,7 @@ DENG_GUI_PIMPL(PackagesWidget)
_loadButton = new ButtonWidget;
_loadButton->setActionFn([this] ()
{
_owner.d->buttonHandler->packageButtonClicked(*this, packageId());
_owner.d->buttonHandler->packageButtonClicked(*_loadButton, packageId());
updateContents();
});
connect(this, &HomeItemWidget::doubleClicked, [this] () {
Expand Down Expand Up @@ -490,6 +490,11 @@ void PackagesWidget::setColorTheme(ColorTheme unselectedItem, ColorTheme selecte
d->populate();
}

void PackagesWidget::populate()
{
d->populate();
}

void PackagesWidget::operator >> (PersistentState &toState) const
{
if(name().isEmpty()) return;
Expand Down

0 comments on commit fa41069

Please sign in to comment.