From 344a00089dd582ca0ac72971192c738d1dd45fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Sun, 7 Feb 2016 21:23:17 +0200 Subject: [PATCH] UI|Home: Improved click-to-focus behavior in the game/save lists --- .../include/ui/home/drawerbuttonwidget.h | 2 +- .../client/include/ui/home/savelistwidget.h | 4 +-- .../client/src/ui/home/drawerbuttonwidget.cpp | 34 +++++++++++++++++-- .../client/src/ui/home/gamedrawerbutton.cpp | 2 +- .../client/src/ui/home/savelistwidget.cpp | 30 +++++++++++++--- .../apps/libdoomsday/include/doomsday/game.h | 2 ++ doomsday/apps/libdoomsday/src/game.cpp | 9 +++-- 7 files changed, 69 insertions(+), 14 deletions(-) diff --git a/doomsday/apps/client/include/ui/home/drawerbuttonwidget.h b/doomsday/apps/client/include/ui/home/drawerbuttonwidget.h index be971e4a8b..b231fe3502 100644 --- a/doomsday/apps/client/include/ui/home/drawerbuttonwidget.h +++ b/doomsday/apps/client/include/ui/home/drawerbuttonwidget.h @@ -44,7 +44,7 @@ class DrawerButtonWidget : public de::GuiWidget // Events. //bool handleEvent(de::Event const &event); - bool dispatchEvent(de::Event const &event, bool (de::Widget::*memberFunc)(de::Event const &)); + //bool dispatchEvent(de::Event const &event, bool (de::Widget::*memberFunc)(de::Event const &)); signals: void mouseActivity(); diff --git a/doomsday/apps/client/include/ui/home/savelistwidget.h b/doomsday/apps/client/include/ui/home/savelistwidget.h index c425d12624..b16ed07395 100644 --- a/doomsday/apps/client/include/ui/home/savelistwidget.h +++ b/doomsday/apps/client/include/ui/home/savelistwidget.h @@ -21,12 +21,12 @@ #include -class SavedSessionListData; +class GameDrawerButton; class SaveListWidget : public de::MenuWidget { public: - SaveListWidget(); + SaveListWidget(GameDrawerButton &owner); private: DENG2_PRIVATE(d) diff --git a/doomsday/apps/client/src/ui/home/drawerbuttonwidget.cpp b/doomsday/apps/client/src/ui/home/drawerbuttonwidget.cpp index cff7cababb..7fd91e007e 100644 --- a/doomsday/apps/client/src/ui/home/drawerbuttonwidget.cpp +++ b/doomsday/apps/client/src/ui/home/drawerbuttonwidget.cpp @@ -26,6 +26,28 @@ using namespace de; DENG_GUI_PIMPL(DrawerButtonWidget) { + struct ClickHandler : public GuiWidget::IEventHandler + { + DrawerButtonWidget &owner; + + ClickHandler(DrawerButtonWidget &owner) + : owner(owner) {} + + bool handleEvent(GuiWidget &, Event const &event) + { + if(event.type() == Event::MouseButton) + { + MouseEvent const &mouse = event.as(); + if(owner.hitTest(event) && mouse.state() == MouseEvent::Pressed) + { + owner.root().setFocus(owner.d->background); + emit owner.mouseActivity(); + } + } + return false; + } + }; + LabelWidget *background; LabelWidget *icon; LabelWidget *label; @@ -50,8 +72,11 @@ DENG_GUI_PIMPL(DrawerButtonWidget) icon->set(Background(style().colors().colorf("text"))); - drawer->set(Background(Vector4f(0, 0, 0, .3f))); + drawer->set(Background(Vector4f(0, 0, 0, .15f))); //drawer->margins().setZero(); + + background->setBehavior(Focusable); + background->addEventHandler(new ClickHandler(self)); } ~Instance() @@ -139,11 +164,13 @@ void DrawerButtonWidget::setSelected(bool selected) d->selected = selected; if(selected) { + d->drawer->set(Background(Vector4f(0, 0, 0, .4f))); d->background->set(Background(style().colors().colorf("background"))); d->showButtons(true); } else { + d->drawer->set(Background(Vector4f(0, 0, 0, .15f))); d->background->set(Background()); d->showButtons(false); } @@ -182,14 +209,14 @@ void DrawerButtonWidget::addButton(ButtonWidget *button) } return false; }*/ - +/* bool DrawerButtonWidget::dispatchEvent(Event const &event, bool (Widget::*memberFunc)(Event const &)) { // Observe mouse clicks occurring in the column. if(isEnabled() && event.isMouse() && event.type() == Event::MouseButton) { MouseEvent const &mouse = event.as(); - if(mouse.state() == MouseEvent::Pressed && + if(mouse.state() == MouseEvent::Released && contentRect().contains(mouse.pos())) { root().setFocus(d->background); @@ -199,3 +226,4 @@ bool DrawerButtonWidget::dispatchEvent(Event const &event, bool (Widget::*member return GuiWidget::dispatchEvent(event, memberFunc); } +*/ diff --git a/doomsday/apps/client/src/ui/home/gamedrawerbutton.cpp b/doomsday/apps/client/src/ui/home/gamedrawerbutton.cpp index aa36eaf807..9c78f4ff0a 100644 --- a/doomsday/apps/client/src/ui/home/gamedrawerbutton.cpp +++ b/doomsday/apps/client/src/ui/home/gamedrawerbutton.cpp @@ -52,7 +52,7 @@ DENG_GUI_PIMPL(GameDrawerButton) self.addButton(playButton); // List of saved games. - saves = new SaveListWidget; + saves = new SaveListWidget(self); saves->rule().setInput(Rule::Width, self.rule().width()); // - self.margins().width()); saves->organizer().setFilter(*this); saves->setItems(savedItems); diff --git a/doomsday/apps/client/src/ui/home/savelistwidget.cpp b/doomsday/apps/client/src/ui/home/savelistwidget.cpp index da0d4cad46..29c46a255f 100644 --- a/doomsday/apps/client/src/ui/home/savelistwidget.cpp +++ b/doomsday/apps/client/src/ui/home/savelistwidget.cpp @@ -17,14 +17,21 @@ */ #include "ui/home/savelistwidget.h" +#include "ui/home/gamedrawerbutton.h" #include "ui/savedsessionlistdata.h" +#include + +#include + using namespace de; DENG_GUI_PIMPL(SaveListWidget) , DENG2_OBSERVES(ChildWidgetOrganizer, WidgetUpdate) { - Instance(Public *i) : Base(i) + GameDrawerButton &owner; + + Instance(Public *i, GameDrawerButton &owner) : Base(i), owner(owner) { self.organizer().audienceForWidgetUpdate() += this; } @@ -40,13 +47,28 @@ DENG_GUI_PIMPL(SaveListWidget) button.margins().set("dialog.gap"); button.set(Background(Vector4f())); + button.setAction(new CallbackAction([this, &button] () + { + if(button.isUsingInfoStyle()) + { + button.useNormalStyle(); + button.set(Background()); + } + else + { + button.useInfoStyle(); + button.set(Background(style().colors().colorf("inverted.background"))); + } + emit owner.mouseActivity(); + })); + auto const &saveItem = item.as(); - button.setImage(style().images().image("logo.game.libdoom")); //saveItem.image()); + button.setImage(style().images().image(Game::logoImageForId(saveItem.gameId()))); } }; -SaveListWidget::SaveListWidget() - : d(new Instance(this)) +SaveListWidget::SaveListWidget(GameDrawerButton &owner) + : d(new Instance(this, owner)) { setGridSize(1, ui::Filled, 0, ui::Expand); enableScrolling(false); diff --git a/doomsday/apps/libdoomsday/include/doomsday/game.h b/doomsday/apps/libdoomsday/include/doomsday/game.h index 4d2620f6ce..0a3f6daec5 100644 --- a/doomsday/apps/libdoomsday/include/doomsday/game.h +++ b/doomsday/apps/libdoomsday/include/doomsday/game.h @@ -271,6 +271,8 @@ class LIBDOOMSDAY_PUBLIC Game : public de::IObject /// Register the console commands, variables, etc..., of this module. static void consoleRegister(); + static de::String logoImageForId(de::String const &id); + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/apps/libdoomsday/src/game.cpp b/doomsday/apps/libdoomsday/src/game.cpp index 5034b9ae01..3922c38dce 100644 --- a/doomsday/apps/libdoomsday/src/game.cpp +++ b/doomsday/apps/libdoomsday/src/game.cpp @@ -231,15 +231,18 @@ void Game::setPluginId(pluginid_t newId) String Game::logoImageId() const { - String idKey = id(); + return logoImageForId(id()); +} +String Game::logoImageForId(String const &id) +{ /// @todo The name of the plugin should be accessible via the plugin loader. String plugName; - if(idKey.contains("heretic")) + if(id.contains("heretic")) { plugName = "libheretic"; } - else if(idKey.contains("hexen")) + else if(id.contains("hexen")) { plugName = "libhexen"; }