diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 3a7c84c384..0197f490a0 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -394,6 +394,8 @@ namespace MWBase virtual void setActiveControllerWindow(MWGui::GuiMode mode, int activeIndex) = 0; virtual bool getControllerTooltip() const = 0; virtual void setControllerTooltip(bool enabled) = 0; + virtual bool getControllerTooltipUserPreference() const = 0; + virtual void setControllerTooltipUserPreference(bool enabled) = 0; virtual void updateControllerButtonsOverlay() = 0; // Used in Lua bindings diff --git a/apps/openmw/mwgui/itemview.cpp b/apps/openmw/mwgui/itemview.cpp index ba43082d42..26cf54de00 100644 --- a/apps/openmw/mwgui/itemview.cpp +++ b/apps/openmw/mwgui/itemview.cpp @@ -205,6 +205,7 @@ namespace MWGui return; int prevFocus = mControllerFocus; + MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager(); switch (button) { @@ -218,27 +219,34 @@ namespace MWGui break; case SDL_CONTROLLER_BUTTON_RIGHTSTICK: // Toggle info tooltip - MWBase::Environment::get().getWindowManager()->setControllerTooltip( - !MWBase::Environment::get().getWindowManager()->getControllerTooltip()); + winMgr->setControllerTooltipUserPreference(!winMgr->getControllerTooltip()); updateControllerFocus(-1, mControllerFocus); break; case SDL_CONTROLLER_BUTTON_DPAD_UP: + if (winMgr->getControllerTooltipUserPreference() && !winMgr->getControllerTooltip()) + winMgr->setControllerTooltip(true); if (mControllerFocus % mRows == 0) mControllerFocus = std::min(mControllerFocus + mRows - 1, mItemCount - 1); else mControllerFocus--; break; case SDL_CONTROLLER_BUTTON_DPAD_DOWN: + if (winMgr->getControllerTooltipUserPreference() && !winMgr->getControllerTooltip()) + winMgr->setControllerTooltip(true); if (mControllerFocus % mRows == mRows - 1 || mControllerFocus == mItemCount - 1) mControllerFocus -= mControllerFocus % mRows; else mControllerFocus++; break; case SDL_CONTROLLER_BUTTON_DPAD_LEFT: + if (winMgr->getControllerTooltipUserPreference() && !winMgr->getControllerTooltip()) + winMgr->setControllerTooltip(true); if (mControllerFocus >= mRows) mControllerFocus -= mRows; break; case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: + if (winMgr->getControllerTooltipUserPreference() && !winMgr->getControllerTooltip()) + winMgr->setControllerTooltip(true); if (mControllerFocus + mRows < mItemCount) mControllerFocus += mRows; else if (mControllerFocus / mRows != (mItemCount - 1) / mRows) diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 960933ed51..9e0acff7b4 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -519,6 +519,8 @@ namespace MWGui auto inventoryTabsOverlay = std::make_unique(); mInventoryTabsOverlay = inventoryTabsOverlay.get(); mWindows.push_back(std::move(inventoryTabsOverlay)); + + mControllerTooltipUserPreference = Settings::gui().mControllerTooltips; mActiveControllerWindows[GM_Inventory] = 1; // Start on Inventory page mInputBlocker = MyGUI::Gui::getInstance().createWidget( @@ -2648,6 +2650,15 @@ namespace MWGui mControllerTooltip = enabled; } + void WindowManager::setControllerTooltipUserPreference(bool enabled) + { + if (!Settings::gui().mControllerMenus) + return; + + mControllerTooltipUserPreference = enabled; + mControllerTooltip = enabled; + } + void WindowManager::updateControllerButtonsOverlay() { if (!Settings::gui().mControllerMenus || !mControllerButtonsOverlay) diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index a62432e687..8eaf171d0d 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -397,6 +397,8 @@ namespace MWGui void setActiveControllerWindow(GuiMode mode, int activeIndex) override; bool getControllerTooltip() const override { return mControllerTooltip; } void setControllerTooltip(bool enabled) override; + bool getControllerTooltipUserPreference() const override { return mControllerTooltipUserPreference; } + void setControllerTooltipUserPreference(bool enabled) override; void updateControllerButtonsOverlay() override; // Used in Lua bindings @@ -511,7 +513,10 @@ namespace MWGui std::vector mGuiModes; // The active window for controller mode for each GUI mode. std::map mActiveControllerWindows; + // Current tooltip state (can be disabled by mouse movement) bool mControllerTooltip = false; + // Toggleable preference. Restores tooltips on controller input after pointer movement + bool mControllerTooltipUserPreference = false; void reapplyActiveControllerWindow();