From c293c76bd71cb1ab843ef00e7afda963d06cb5b4 Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Mon, 4 Aug 2025 19:10:07 -0700 Subject: [PATCH] Remove hardcoded row/column values in some controller menus --- apps/openmw/mwgui/class.cpp | 53 +++++++++++++++++++++-------- apps/openmw/mwgui/class.hpp | 3 ++ apps/openmw/mwgui/levelupdialog.cpp | 23 +++++-------- apps/openmw/mwgui/levelupdialog.hpp | 1 + 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index efd2872408..9573d22377 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -1047,6 +1047,7 @@ namespace MWGui skillWidget->eventClicked += MyGUI::newDelegate(this, &SelectSkillDialog::onSkillClicked); ToolTips::createSkillToolTip(skillWidget, skill.mId); mSkillButtons.emplace_back(skillWidget); + mNumSkillsPerSpecialization[skill.mData.mSpecialization]++; } for (const auto& [widget, coord] : specializations) { @@ -1115,28 +1116,52 @@ namespace MWGui mControllerFocus = wrap(mControllerFocus + 1, mSkillButtons.size()); mSkillButtons[mControllerFocus]->setStateSelected(true); } - else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) + else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { mSkillButtons[mControllerFocus]->setStateSelected(false); - if (mControllerFocus < 9) - mControllerFocus += 18; - else - mControllerFocus -= 9; - mSkillButtons[mControllerFocus]->setStateSelected(true); - } - else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) - { - mSkillButtons[mControllerFocus]->setStateSelected(false); - if (mControllerFocus >= 18) - mControllerFocus -= 18; - else - mControllerFocus += 9; + selectNextColumn(arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT ? -1 : 1); mSkillButtons[mControllerFocus]->setStateSelected(true); } return true; } + void SelectSkillDialog::selectNextColumn(int direction) + { + // Find which column (specialization) the current index is in. + size_t specialization = 0; + size_t nextSpecializationIndex = 0; + for (; specialization < mNumSkillsPerSpecialization.size(); ++specialization) + { + nextSpecializationIndex += mNumSkillsPerSpecialization[specialization]; + if (mControllerFocus < nextSpecializationIndex) + break; + } + + if (direction < 0) + { + if (mControllerFocus < mNumSkillsPerSpecialization[0]) + { + // Wrap around to the right column + for (size_t i = 0; i < mNumSkillsPerSpecialization.size() - 1; ++i) + mControllerFocus += mNumSkillsPerSpecialization[i]; + } + else + mControllerFocus -= mNumSkillsPerSpecialization[specialization]; + } + else + { + if (mControllerFocus + mNumSkillsPerSpecialization.back() >= mSkillButtons.size()) + { + // Wrap around to the left column + for (size_t i = 0; i < mNumSkillsPerSpecialization.size() - 1; ++i) + mControllerFocus -= mNumSkillsPerSpecialization[i]; + } + else + mControllerFocus += mNumSkillsPerSpecialization[specialization]; + } + } + /* DescriptionDialog */ DescriptionDialog::DescriptionDialog() diff --git a/apps/openmw/mwgui/class.hpp b/apps/openmw/mwgui/class.hpp index 2f394af9c0..5a769e15bd 100644 --- a/apps/openmw/mwgui/class.hpp +++ b/apps/openmw/mwgui/class.hpp @@ -257,6 +257,9 @@ namespace MWGui private: ESM::RefId mSkillId; + std::array mNumSkillsPerSpecialization; + + void selectNextColumn(int direction); }; class DescriptionDialog : public WindowModal diff --git a/apps/openmw/mwgui/levelupdialog.cpp b/apps/openmw/mwgui/levelupdialog.cpp index 6186401d0a..708fc7b02f 100644 --- a/apps/openmw/mwgui/levelupdialog.cpp +++ b/apps/openmw/mwgui/levelupdialog.cpp @@ -49,13 +49,12 @@ namespace MWGui { const auto& store = MWBase::Environment::get().getESMStore()->get(); - const size_t perCol - = static_cast(std::ceil(store.getSize() / static_cast(std::size(sColumnOffsets)))); + mPerCol = static_cast(std::ceil(store.getSize() / static_cast(std::size(sColumnOffsets)))); size_t i = 0; for (const ESM::Attribute& attribute : store) { - const int offset = sColumnOffsets[i / perCol]; - const int row = static_cast(i % perCol); + const int offset = sColumnOffsets[i / mPerCol]; + const int row = static_cast(i % mPerCol); Widgets widgets; widgets.mMultiplier = mAssignWidget->createWidget( "SandTextVCenter", { offset, 20 * row, 100, 20 }, MyGUI::Align::Default); @@ -79,7 +78,7 @@ namespace MWGui mAssignWidget->setVisibleVScroll(false); mAssignWidget->setCanvasSize(MyGUI::IntSize( - mAssignWidget->getWidth(), std::max(mAssignWidget->getHeight(), static_cast(20 * perCol)))); + mAssignWidget->getWidth(), std::max(mAssignWidget->getHeight(), static_cast(20 * mPerCol)))); mAssignWidget->setVisibleVScroll(true); mAssignWidget->setViewOffset(MyGUI::IntPoint()); } @@ -397,10 +396,8 @@ namespace MWGui else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP) { setControllerFocus(mAttributeButtons, mControllerFocus, false); - if (mControllerFocus == 0) - mControllerFocus = 3; - else if (mControllerFocus == 4) - mControllerFocus = 7; + if (mControllerFocus % mPerCol == 0) + mControllerFocus += mPerCol - 1; else mControllerFocus--; setControllerFocus(mAttributeButtons, mControllerFocus, true); @@ -408,10 +405,8 @@ namespace MWGui else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { setControllerFocus(mAttributeButtons, mControllerFocus, false); - if (mControllerFocus == 3) - mControllerFocus = 0; - else if (mControllerFocus == 7) - mControllerFocus = 4; + if (mControllerFocus % mPerCol == mPerCol - 1) + mControllerFocus -= mPerCol - 1; else mControllerFocus++; setControllerFocus(mAttributeButtons, mControllerFocus, true); @@ -419,7 +414,7 @@ namespace MWGui else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { setControllerFocus(mAttributeButtons, mControllerFocus, false); - mControllerFocus = (mControllerFocus + 4) % mAttributeButtons.size(); + mControllerFocus = (mControllerFocus + mPerCol) % mAttributeButtons.size(); setControllerFocus(mAttributeButtons, mControllerFocus, true); } diff --git a/apps/openmw/mwgui/levelupdialog.hpp b/apps/openmw/mwgui/levelupdialog.hpp index 05048b3e8f..70bd2839f2 100644 --- a/apps/openmw/mwgui/levelupdialog.hpp +++ b/apps/openmw/mwgui/levelupdialog.hpp @@ -37,6 +37,7 @@ namespace MWGui std::vector mSpentAttributes; + size_t mPerCol; unsigned int mCoinCount; void onOkButtonClicked(MyGUI::Widget* sender);