From 5e3a49ade5ebe93e1e2ef91643a310401bc88bd8 Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Tue, 20 May 2025 22:41:17 -0700 Subject: [PATCH] Make right stick scroll dialog history --- apps/openmw/mwgui/dialogue.cpp | 2 ++ apps/openmw/mwgui/scrollwindow.cpp | 1 + apps/openmw/mwgui/windowbase.hpp | 2 ++ apps/openmw/mwinput/controllermanager.cpp | 9 +++++++-- apps/openmw/mwinput/mousemanager.cpp | 13 +++++++++++++ apps/openmw/mwinput/mousemanager.hpp | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index a76e793d81..1dd3f051ef 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -380,8 +380,10 @@ namespace MWGui mMainWidget->castType()->eventWindowChangeCoord += MyGUI::newDelegate(this, &DialogueWindow::onWindowResize); + mControllerScrollWidget = mHistory->getParent(); mControllerButtons.a = "#{sAsk}"; mControllerButtons.b = "#{sGoodbye}"; + mControllerButtons.rStick = "#{sScrollup}"; } void DialogueWindow::onTradeComplete() diff --git a/apps/openmw/mwgui/scrollwindow.cpp b/apps/openmw/mwgui/scrollwindow.cpp index ae47a361a2..d032963417 100644 --- a/apps/openmw/mwgui/scrollwindow.cpp +++ b/apps/openmw/mwgui/scrollwindow.cpp @@ -39,6 +39,7 @@ namespace MWGui mCloseButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); mTakeButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); + mControllerScrollWidget = mTextView; mControllerButtons.b = "#{sClose}"; mControllerButtons.rStick = "#{sScrolldown}"; diff --git a/apps/openmw/mwgui/windowbase.hpp b/apps/openmw/mwgui/windowbase.hpp index 2b1afbda85..8fb499ec7e 100644 --- a/apps/openmw/mwgui/windowbase.hpp +++ b/apps/openmw/mwgui/windowbase.hpp @@ -77,6 +77,7 @@ namespace MWGui static void clampWindowCoordinates(MyGUI::Window* window); virtual ControllerButtonStr* getControllerButtons() { return &mControllerButtons; } + MyGUI::Widget* getControllerScrollWidget() { return mControllerScrollWidget; } bool isGamepadCursorAllowed() { return !mDisableGamepadCursor; } virtual bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { return true; }; virtual bool onControllerThumbstickEvent(const SDL_ControllerAxisEvent& arg) { return true; }; @@ -88,6 +89,7 @@ namespace MWGui ControllerButtonStr mControllerButtons; bool mActiveControllerWindow = false; bool mDisableGamepadCursor = false; + MyGUI::Widget* mControllerScrollWidget = nullptr; private: void onDoubleClick(MyGUI::Widget* _sender); diff --git a/apps/openmw/mwinput/controllermanager.cpp b/apps/openmw/mwinput/controllermanager.cpp index d1deef5011..48034cae01 100644 --- a/apps/openmw/mwinput/controllermanager.cpp +++ b/apps/openmw/mwinput/controllermanager.cpp @@ -353,10 +353,15 @@ namespace MWInput if (mGamepadGuiCursorEnabled && (arg.axis == SDL_CONTROLLER_AXIS_LEFTX || arg.axis == SDL_CONTROLLER_AXIS_LEFTY)) { - // Treat the left stick like a cursor. Fall through. + // Treat the left stick like a cursor, which is the default behavior. return false; } - else if (topWin->onControllerThumbstickEvent(arg)) + + // On some windows, treat right stick like a scroll wheel. + if (arg.axis == SDL_CONTROLLER_AXIS_RIGHTY && topWin->getControllerScrollWidget() != nullptr) + mMouseManager->warpMouseToWidget(topWin->getControllerScrollWidget()); + + if (topWin->onControllerThumbstickEvent(arg)) { // Window handled the event. return true; diff --git a/apps/openmw/mwinput/mousemanager.cpp b/apps/openmw/mwinput/mousemanager.cpp index eed95cf1c9..2c6798406b 100644 --- a/apps/openmw/mwinput/mousemanager.cpp +++ b/apps/openmw/mwinput/mousemanager.cpp @@ -263,4 +263,17 @@ namespace MWInput mInputWrapper->warpMouse( static_cast(mGuiCursorX * guiUiScale), static_cast(mGuiCursorY * guiUiScale)); } + + void MouseManager::warpMouseToWidget(MyGUI::Widget* widget) + { + float widgetX = widget->getAbsoluteCoord().left + 4; + float widgetY = widget->getAbsoluteCoord().top + 4; + if (std::abs(mGuiCursorX - widgetX) > 1 || std::abs(mGuiCursorY - widgetY) > 1) + { + mGuiCursorX = widgetX; + mGuiCursorY = widgetY; + warpMouse(); + } + } + } diff --git a/apps/openmw/mwinput/mousemanager.hpp b/apps/openmw/mwinput/mousemanager.hpp index 5de8a8f3bc..0a9c4eccd7 100644 --- a/apps/openmw/mwinput/mousemanager.hpp +++ b/apps/openmw/mwinput/mousemanager.hpp @@ -32,6 +32,7 @@ namespace MWInput bool injectMouseButtonRelease(Uint8 button); void injectMouseMove(float xMove, float yMove, float mouseWheelMove); void warpMouse(); + void warpMouseToWidget(MyGUI::Widget* widget); void setMouseLookEnabled(bool enabled) { mMouseLookEnabled = enabled; } void setGuiCursorEnabled(bool enabled) { mGuiCursorEnabled = enabled; }