Skip to content

Commit

Permalink
UI|Home: Working on the PackagesDialog; HomeItemWidget coloring
Browse files Browse the repository at this point in the history
HomeItemWidgets can be color-themed separately for loaded and
non-loaded packages.

Also the Multiplayer column is updated with a master server query.
  • Loading branch information
skyjake committed Mar 13, 2016
1 parent a02e0b5 commit 4a6cf3a
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 96 deletions.
4 changes: 3 additions & 1 deletion doomsday/apps/client/include/ui/widgets/homeitemwidget.h
Expand Up @@ -40,8 +40,10 @@ class HomeItemWidget : public de::GuiWidget
virtual void setSelected(bool selected);
bool isSelected() const;

void useInvertedStyle();
void useNormalStyle();
void useInvertedStyle();
void useColorTheme(ColorTheme style);
void useColorTheme(ColorTheme unselected, ColorTheme selected);

signals:
void mouseActivity();
Expand Down
3 changes: 3 additions & 0 deletions doomsday/apps/client/include/ui/widgets/packageswidget.h
Expand Up @@ -32,6 +32,9 @@ class PackagesWidget : public de::GuiWidget, public de::IPersistent
public:
PackagesWidget(de::String const &name = "");

void setColorTheme(ColorTheme unselectedItem, ColorTheme selectedItem,
ColorTheme loadedUnselectedItem, ColorTheme loadedSelectedItem);

// Implements IPersistent.
void operator >> (de::PersistentState &toState) const;
void operator << (de::PersistentState const &fromState);
Expand Down
142 changes: 59 additions & 83 deletions doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp
Expand Up @@ -18,6 +18,8 @@

#include "ui/dialogs/packagesdialog.h"
#include "ui/widgets/packageswidget.h"
#include "ui/widgets/homeitemwidget.h"
#include "ui/widgets/homemenuwidget.h"
#include "clientapp.h"

#include <de/FileSystem>
Expand All @@ -26,18 +28,21 @@
#include <de/SequentialLayout>
#include <de/DocumentPopupWidget>
#include <de/PopupButtonWidget>
#include <de/PopupMenuWidget>
#include <de/CallbackAction>
#include <de/SignalAction>
#include <de/ui/SubwidgetItem>

using namespace de;

DENG_GUI_PIMPL(PackagesDialog)
, public ChildWidgetOrganizer::IWidgetFactory
{
MenuWidget *menu;
HomeMenuWidget *menu;
PackagesWidget *browser;

/**
* Information about an available package.
* Information about a selected package.
*/
struct PackageItem : public ui::Item
{
Expand All @@ -51,6 +56,11 @@ DENG_GUI_PIMPL(PackagesDialog)
setData(QString(info->gets("ID")));
}

String packageId() const
{
return data().toString();
}

void setFile(File const &packFile)
{
file = &packFile;
Expand All @@ -60,47 +70,34 @@ DENG_GUI_PIMPL(PackagesDialog)
};

/**
* Widget showing information about a package and containing buttons for manipulating
* the package.
* Widget showing information about a selected package, with a button for dragging
* the item up and down.
*/
class Widget : public GuiWidget
class Widget : public HomeItemWidget
{
private:
/// Action to load or unload a package.
struct LoadAction : public Action
public:
Widget(PackageItem const &item)
: _item(&item)
{
Widget &owner;

LoadAction(Widget &widget) : owner(widget) {}
useColorTheme(Normal, Inverted);

void trigger()
_infoButton = new PopupButtonWidget;
_infoButton->setText(tr("..."));
_infoButton->setFont("small");
_infoButton->margins().setTopBottom("unit");
_infoButton->setPopup([this] (PopupButtonWidget const &)
{
Action::trigger();
auto &loader = App::packageLoader();
if(loader.isLoaded(owner.packageId()))
{
loader.unload(owner.packageId());
}
else
{
try
{
loader.load(owner.packageId());
}
catch(Error const &er)
{
LOG_RES_ERROR("Package \"" + owner.packageId() +
"\" could not be loaded: " + er.asText());
}
}
owner.updateContents();
auto *pop = new PopupMenuWidget;
pop->useInfoStyle();
pop->items() << new ui::SubwidgetItem(
tr("Info"), ui::Down,
[this] () -> PopupWidget * { return makeInfoPopup(); });
return pop;
}
};
, ui::Down);
addButton(_infoButton);

public:
Widget(PackageItem const &item)
: _item(&item)
{
/*
add(_title = new LabelWidget);
_title->setSizePolicy(ui::Fixed, ui::Expand);
_title->setAlignment(ui::AlignLeft);
Expand Down Expand Up @@ -152,8 +149,9 @@ DENG_GUI_PIMPL(PackagesDialog)
rule().setInput(Rule::Width, rule("dialog.packages.width"))
.setInput(Rule::Height, _title->rule().height() +
_subtitle->rule().height() + _tags.at(0)->rule().height());
*/
}

/*
void createTagButtons()
{
SequentialLayout layout(_subtitle->rule().left(),
Expand All @@ -180,11 +178,13 @@ DENG_GUI_PIMPL(PackagesDialog)
tag->setFont("small");
tag->setTextColor(color);
tag->set(Background(Background::Rounded, style().colors().colorf(color), 6));
}
}*/

void updateContents()
{
_title->setText(_item->info->gets("title"));
label().setText(_item->info->gets("title"));

/*
_subtitle->setText(packageId());
String auxColor = "accent";
Expand All @@ -209,17 +209,12 @@ DENG_GUI_PIMPL(PackagesDialog)
for(ButtonWidget *b : _tags)
{
updateTagButtonStyle(b, auxColor);
}
}

bool isLoaded() const
{
return App::packageLoader().isLoaded(packageId());
}*/
}

String packageId() const
{
return _item->info->gets("ID");
return _item->packageId();
}

PopupWidget *makeInfoPopup() const
Expand All @@ -239,65 +234,46 @@ DENG_GUI_PIMPL(PackagesDialog)

private:
PackageItem const *_item;
LabelWidget *_title;
LabelWidget *_subtitle;
QList<ButtonWidget *> _tags;
ButtonWidget *_loadButton;
//LabelWidget *_title;
//LabelWidget *_subtitle;
//QList<ButtonWidget *> _tags;
PopupButtonWidget *_infoButton;
//ButtonWidget *_loadButton;
//PopupButtonWidget *_infoButton;
};

Instance(Public *i) : Base(i)
{
// Currently selected packages.
self.leftArea().add(menu = new MenuWidget);
menu->enableScrolling(false); // dialog content already scrolls
menu->enablePageKeys(false);
menu->setGridSize(1, ui::Expand, 0, ui::Expand);
self.leftArea().add(menu = new HomeMenuWidget);
menu->layout().setRowPadding(Const(0));
menu->rule()
.setInput(Rule::Left, self.leftArea().contentRule().left())
.setInput(Rule::Top, self.leftArea().contentRule().top());
.setInput(Rule::Left, self.leftArea().contentRule().left())
.setInput(Rule::Top, self.leftArea().contentRule().top())
.setInput(Rule::Width, rule("dialog.packages.width"));
menu->organizer().setWidgetFactory(*this);
self.leftArea().enableIndicatorDraw(true);

// Package browser.
self.rightArea().add(browser = new PackagesWidget);
browser->setColorTheme(Normal, Inverted, Normal, Inverted);
browser->rule()
.setInput(Rule::Left, self.rightArea().contentRule().left())
.setInput(Rule::Top, self.rightArea().contentRule().top())
.setInput(Rule::Width, menu->rule().width());
self.rightArea().enableIndicatorDraw(true);
}

void populate()
{
StringList packages = App::packageLoader().findAllPackages();
qSort(packages);
menu->items().clear();

// Remove from the list those packages that are no longer listed.
for(ui::DataPos i = 0; i < menu->items().size(); ++i)
{
if(!packages.contains(menu->items().at(i).data().toString()))
{
menu->items().remove(i--);
}
}
auto loaded = App::packageLoader().loadedPackagesAsFilesInPackageOrder();

// Add/update the listed packages.
for(String const &path : packages)
// Remove from the list those packages that are no longer listed.
for(File const *packFile : loaded)
{
File const &pack = App::rootFolder().locate<File>(path);

// Core packages are mandatory and thus omitted.
if(Package::tags(pack).contains("core")) continue;

// Is this already in the list?
ui::DataPos pos = menu->items().findData(pack.objectNamespace().gets("package.ID"));
if(pos != ui::Data::InvalidPos)
{
menu->items().at(pos).as<PackageItem>().setFile(pack);
}
else
{
menu->items() << new PackageItem(pack);
}
menu->items() << new PackageItem(*packFile);
}
}

Expand Down
3 changes: 3 additions & 0 deletions doomsday/apps/client/src/ui/home/multiplayercolumnwidget.cpp
Expand Up @@ -218,6 +218,9 @@ MultiplayerColumnWidget::MultiplayerColumnWidget()
: ColumnWidget("multiplayer-column")
, d(new Instance(this))
{
d->mode = DiscoverUsingMaster;
d->link().discoverUsingMaster();

scrollArea().setContentSize(maximumContentWidth(),
header().rule().height() +
rule("gap") +
Expand Down
44 changes: 34 additions & 10 deletions doomsday/apps/client/src/ui/widgets/homeitemwidget.cpp
Expand Up @@ -205,21 +205,45 @@ bool HomeItemWidget::isSelected() const
return d->selected;
}

void HomeItemWidget::useNormalStyle()
{
useColorTheme(Normal);
}

void HomeItemWidget::useInvertedStyle()
{
d->bgColor = "accent";
d->textColor = "inverted.accent";
d->selectedBgColor = "accent";
d->selectedTextColor = "inverted.text";
d->updateColors();
useColorTheme(Inverted);
}

void HomeItemWidget::useNormalStyle()
void HomeItemWidget::useColorTheme(ColorTheme style)
{
d->bgColor = "transparent";
d->textColor = "text";
d->selectedBgColor = "background";
d->selectedTextColor = "text";
useColorTheme(style, style);
}

void HomeItemWidget::useColorTheme(ColorTheme unselected, ColorTheme selected)
{
if(unselected == Inverted)
{
d->bgColor = "accent";
d->textColor = "inverted.accent";
}
else
{
d->bgColor = "transparent";
d->textColor = "text";
}

if(selected == Inverted)
{
d->selectedBgColor = "accent";
d->selectedTextColor = "inverted.text";
}
else
{
d->selectedBgColor = "background";
d->selectedTextColor = "text";
}

d->updateColors();
}

Expand Down
21 changes: 19 additions & 2 deletions doomsday/apps/client/src/ui/widgets/packageswidget.cpp
Expand Up @@ -45,6 +45,10 @@ DENG_GUI_PIMPL(PackagesWidget)
ButtonWidget *clearSearch;
HomeMenuWidget *menu;
QStringList filterTerms;
GuiWidget::ColorTheme unselectedItem = GuiWidget::Normal;
GuiWidget::ColorTheme selectedItem = GuiWidget::Normal;
GuiWidget::ColorTheme loadedUnselectedItem = GuiWidget::Inverted;
GuiWidget::ColorTheme loadedSelectedItem = GuiWidget::Inverted;

/**
* Information about an available package.
Expand Down Expand Up @@ -228,7 +232,8 @@ DENG_GUI_PIMPL(PackagesWidget)
_loadButton->setText(tr("Unload"));
_loadButton->useNormalStyle();
icon().setImageColor(style().colors().colorf("accent"));
useInvertedStyle();
//useInvertedStyle();
useColorTheme(_owner.d->loadedUnselectedItem, _owner.d->loadedSelectedItem);
//_loadButton->setTextColor("altaccent");
//_loadButton->setBorderColor("altaccent");
//_title->setFont("choice.selected");
Expand All @@ -239,7 +244,8 @@ DENG_GUI_PIMPL(PackagesWidget)
_loadButton->setText(tr("Load"));
_loadButton->useInfoStyle();
icon().setImageColor(style().colors().colorf("text"));
useNormalStyle();
//useNormalStyle();
useColorTheme(_owner.d->unselectedItem, _owner.d->selectedItem);
//_loadButton->setTextColor("text");
//_loadButton->setBorderColor("text");
//_title->setFont("default");
Expand Down Expand Up @@ -446,6 +452,17 @@ PackagesWidget::PackagesWidget(String const &name)
refreshPackages();
}

void PackagesWidget::setColorTheme(ColorTheme unselectedItem, ColorTheme selectedItem,
ColorTheme loadedUnselectedItem, ColorTheme loadedSelectedItem)
{
d->unselectedItem = unselectedItem;
d->selectedItem = selectedItem;
d->loadedUnselectedItem = loadedUnselectedItem;
d->loadedSelectedItem = loadedSelectedItem;

d->populate();
}

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

0 comments on commit 4a6cf3a

Please sign in to comment.