From e3a9b71bb9b5b2872c14018c43d7136e414a8026 Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Sat, 31 May 2025 19:43:28 -0700 Subject: [PATCH] Add helper function for toggling controller focus on lists --- apps/openmw/mwgui/class.cpp | 16 ++++++++-------- apps/openmw/mwgui/dialogue.cpp | 8 ++++---- apps/openmw/mwgui/messagebox.cpp | 8 ++++---- apps/openmw/mwgui/review.cpp | 20 +++++++------------- apps/openmw/mwgui/trainingwindow.cpp | 8 ++++---- apps/openmw/mwgui/travelwindow.cpp | 8 ++++---- apps/openmw/mwgui/windowbase.cpp | 6 ++++++ apps/openmw/mwgui/windowbase.hpp | 1 + 8 files changed, 38 insertions(+), 37 deletions(-) diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index c0660b5f02..700c431246 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -488,9 +488,9 @@ namespace MWGui if (mButtons.size() == 2 && mControllerFocus == 0) return true; - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { @@ -499,9 +499,9 @@ namespace MWGui if (mButtons.size() == 2 && mControllerFocus == mButtons.size() - 1) return true; - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } return true; @@ -709,15 +709,15 @@ namespace MWGui } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) { - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } return true; } diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index 1dd3f051ef..1a8808c8dc 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -182,15 +182,15 @@ namespace MWGui onCancel(mCancelButton); else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP) { - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } return true; diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 5f074a67c6..492ac30052 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -461,9 +461,9 @@ namespace MWGui if (mButtons.size() == 2 && mControllerFocus == 0) return true; - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { @@ -472,9 +472,9 @@ namespace MWGui if (mButtons.size() == 2 && mControllerFocus == mButtons.size() - 1) return true; - mButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mButtons.size()); - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); } return true; diff --git a/apps/openmw/mwgui/review.cpp b/apps/openmw/mwgui/review.cpp index 19dcda90e4..dda00bd33a 100644 --- a/apps/openmw/mwgui/review.cpp +++ b/apps/openmw/mwgui/review.cpp @@ -121,7 +121,7 @@ namespace MWGui if (Settings::gui().mControllerMenus) { - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, true); mControllerButtons.a = "#{sSelect}"; mControllerButtons.b = "#{sBack}"; mControllerButtons.x = "#{sDone}"; @@ -574,22 +574,16 @@ namespace MWGui else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP || arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) { - mButtons[mControllerFocus]->setStateSelected(false); - if (mControllerFocus == 0) - mControllerFocus = mButtons.size() - 1; - else - mControllerFocus--; - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, false); + mControllerFocus = wrap(mControllerFocus - 1, mButtons.size()); + setControllerFocus(mButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { - mButtons[mControllerFocus]->setStateSelected(false); - if (mControllerFocus == mButtons.size() - 1) - mControllerFocus = 0; - else - mControllerFocus++; - mButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mButtons, mControllerFocus, false); + mControllerFocus = wrap(mControllerFocus + 1, mButtons.size()); + setControllerFocus(mButtons, mControllerFocus, true); } return true; diff --git a/apps/openmw/mwgui/trainingwindow.cpp b/apps/openmw/mwgui/trainingwindow.cpp index fcead9d543..65e468ebd4 100644 --- a/apps/openmw/mwgui/trainingwindow.cpp +++ b/apps/openmw/mwgui/trainingwindow.cpp @@ -263,18 +263,18 @@ namespace MWGui if (mTrainingButtons.size() <= 1) return true; - mTrainingButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mTrainingButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mTrainingButtons.size()); - mTrainingButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mTrainingButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { if (mTrainingButtons.size() <= 1) return true; - mTrainingButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mTrainingButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mTrainingButtons.size()); - mTrainingButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mTrainingButtons, mControllerFocus, true); } return true; diff --git a/apps/openmw/mwgui/travelwindow.cpp b/apps/openmw/mwgui/travelwindow.cpp index 083bba391b..eeb2df868f 100644 --- a/apps/openmw/mwgui/travelwindow.cpp +++ b/apps/openmw/mwgui/travelwindow.cpp @@ -270,18 +270,18 @@ namespace MWGui if (mDestinationButtons.size() <= 1) return true; - mDestinationButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mDestinationButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus - 1, mDestinationButtons.size()); - mDestinationButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mDestinationButtons, mControllerFocus, true); } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { if (mDestinationButtons.size() <= 1) return true; - mDestinationButtons[mControllerFocus]->setStateSelected(false); + setControllerFocus(mDestinationButtons, mControllerFocus, false); mControllerFocus = wrap(mControllerFocus + 1, mDestinationButtons.size()); - mDestinationButtons[mControllerFocus]->setStateSelected(true); + setControllerFocus(mDestinationButtons, mControllerFocus, true); } // Scroll the list to keep the active item in view diff --git a/apps/openmw/mwgui/windowbase.cpp b/apps/openmw/mwgui/windowbase.cpp index 995731a775..4ecc26449f 100644 --- a/apps/openmw/mwgui/windowbase.cpp +++ b/apps/openmw/mwgui/windowbase.cpp @@ -25,6 +25,12 @@ int MWGui::wrap(int index, int max) return index; } +void MWGui::setControllerFocus(std::vector buttons, int index, bool focused) +{ + if (index >= 0 && index < buttons.size()) + buttons[index]->setStateSelected(focused); +} + WindowBase::WindowBase(std::string_view parLayout) : Layout(parLayout) { diff --git a/apps/openmw/mwgui/windowbase.hpp b/apps/openmw/mwgui/windowbase.hpp index 8fb499ec7e..87bea55e38 100644 --- a/apps/openmw/mwgui/windowbase.hpp +++ b/apps/openmw/mwgui/windowbase.hpp @@ -15,6 +15,7 @@ namespace MWGui class DragAndDrop; int wrap(int index, int max); + void setControllerFocus(std::vector buttons, int index, bool selected); struct ControllerButtonStr {