diff --git a/doomsday/apps/client/src/ui/home/columnwidget.cpp b/doomsday/apps/client/src/ui/home/columnwidget.cpp index 0c6f56eac7..02ae5159f6 100644 --- a/doomsday/apps/client/src/ui/home/columnwidget.cpp +++ b/doomsday/apps/client/src/ui/home/columnwidget.cpp @@ -96,16 +96,11 @@ DENG_GUI_PIMPL(ColumnWidget) HeaderWidget *header; Rule const *maxContentWidth = nullptr; Vector4f backTintColor; - - //GLProgram bgProgram; - //GLUniform uSaturation { "uSaturation", GLUniform::Float }; // background saturation - //GLUniform uBgColor { "uColor", GLUniform::Vec4 }; Animation backSaturation { 0.f, Animation::Linear }; Impl(Public *i) : Base(i) { back = new LabelWidget; - //back->setCustomShader(&bgProgram); back->margins().setZero(); scrollArea = new ScrollAreaWidget; @@ -125,19 +120,6 @@ DENG_GUI_PIMPL(ColumnWidget) { releaseRef(maxContentWidth); } - - /*void glInit() - { - root().shaders().build(bgProgram, "generic.textured.hsv.color_ucolor") - << uSaturation - << uBgColor - << root().uAtlas(); - } - - void glDeinit() - { - bgProgram.clear(); - }*/ }; ColumnWidget::ColumnWidget(String const &name) @@ -225,20 +207,8 @@ void ColumnWidget::update() GuiWidget::update(); d->back->setSaturation(d->backSaturation); - /*d->uSaturation = d->backSaturation; - d->uBgColor = Vector4f(1, 1, 1, visibleOpacity());*/ } -/*void ColumnWidget::glInit() -{ - d->glInit(); -} - -void ColumnWidget::glDeinit() -{ - d->bgProgram.clear(); -}*/ - void ColumnWidget::updateStyle() { GuiWidget::updateStyle(); diff --git a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp index 63965d3d41..7a1f1cb574 100644 --- a/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp +++ b/doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp @@ -624,7 +624,7 @@ void GameColumnWidget::setHighlighted(bool highlighted) } else { - //root().setFocus(nullptr); + root().setFocus(nullptr); d->menu->unselectAll(); } d->showActions(highlighted); diff --git a/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp b/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp index bc1750c6ca..940c708317 100644 --- a/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp +++ b/doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp @@ -20,6 +20,8 @@ #include "ui/widgets/homeitemwidget.h" #include "ui/home/columnwidget.h" +#include + using namespace de; DENG_GUI_PIMPL(HomeMenuWidget) @@ -113,19 +115,28 @@ ui::DataPos HomeMenuWidget::selectedIndex() const void HomeMenuWidget::setSelectedIndex(ui::DataPos index) { + DENG2_ASSERT(hasRoot()); + + root().setFocus(nullptr); + unselectAll(); + if (auto *widget = itemWidget(index)) { widget->acquireFocus(); - // Check if we can scroll to the selected widget right away. - // If not, we are observing the asset and will scroll when it is ready. - if (assets().isReady()) - { - d->scrollToSelected(); - } - else + // Focus-based scrolling is only enabled when keyboard focus is in use. + if (root().focusIndicator().isKeyboardFocusActive()) { - assets().audienceForStateChange() += d; + // Check if we can scroll to the selected widget right away. + // If not, we are observing the asset and will scroll when it is ready. + if (assets().isReady()) + { + d->scrollToSelected(); + } + else + { + assets().audienceForStateChange() += d; + } } } } diff --git a/doomsday/sdk/libappfw/include/de/widgets/focuswidget.h b/doomsday/sdk/libappfw/include/de/widgets/focuswidget.h index 835360ff72..791cd30824 100644 --- a/doomsday/sdk/libappfw/include/de/widgets/focuswidget.h +++ b/doomsday/sdk/libappfw/include/de/widgets/focuswidget.h @@ -42,6 +42,11 @@ class LIBAPPFW_PUBLIC FocusWidget : public LabelWidget void fadeIn(); void fadeOut(); + /** + * Determines whether the focus widget is active and flashing. + */ + bool isKeyboardFocusActive() const; + // Events. void update() override; diff --git a/doomsday/sdk/libappfw/src/guirootwidget.cpp b/doomsday/sdk/libappfw/src/guirootwidget.cpp index 75f46ebfa9..18896befc0 100644 --- a/doomsday/sdk/libappfw/src/guirootwidget.cpp +++ b/doomsday/sdk/libappfw/src/guirootwidget.cpp @@ -343,8 +343,9 @@ bool GuiRootWidget::processEvent(Event const &event) { window().glActivate(); - if (event.type() == Event::MouseButton && - event.as().state() != MouseEvent::Released) + if ((event.type() == Event::MouseButton && + event.as().state() != MouseEvent::Released) || + event.type() == Event::MouseWheel) { d->focusIndicator->fadeOut(); } diff --git a/doomsday/sdk/libappfw/src/widgets/focuswidget.cpp b/doomsday/sdk/libappfw/src/widgets/focuswidget.cpp index 84ee44a388..084a127100 100644 --- a/doomsday/sdk/libappfw/src/widgets/focuswidget.cpp +++ b/doomsday/sdk/libappfw/src/widgets/focuswidget.cpp @@ -96,6 +96,11 @@ void FocusWidget::fadeOut() d->fadeOpacity = 0.f; } +bool FocusWidget::isKeyboardFocusActive() const +{ + return d->fadeOpacity > 0 && d->reference; +} + void FocusWidget::update() { setOpacity(d->fadeOpacity * (d->reference? d->reference->visibleOpacity() : 0.f));