1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-02 19:34:34 +00:00

Remove hardcoded row/column values in some controller menus

This commit is contained in:
Andrew Lanzone 2025-08-04 19:10:07 -07:00
parent 8e76a0ab06
commit c293c76bd7
4 changed files with 52 additions and 28 deletions

View file

@ -1047,6 +1047,7 @@ namespace MWGui
skillWidget->eventClicked += MyGUI::newDelegate(this, &SelectSkillDialog::onSkillClicked); skillWidget->eventClicked += MyGUI::newDelegate(this, &SelectSkillDialog::onSkillClicked);
ToolTips::createSkillToolTip(skillWidget, skill.mId); ToolTips::createSkillToolTip(skillWidget, skill.mId);
mSkillButtons.emplace_back(skillWidget); mSkillButtons.emplace_back(skillWidget);
mNumSkillsPerSpecialization[skill.mData.mSpecialization]++;
} }
for (const auto& [widget, coord] : specializations) for (const auto& [widget, coord] : specializations)
{ {
@ -1115,28 +1116,52 @@ namespace MWGui
mControllerFocus = wrap(mControllerFocus + 1, mSkillButtons.size()); mControllerFocus = wrap(mControllerFocus + 1, mSkillButtons.size());
mSkillButtons[mControllerFocus]->setStateSelected(true); 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); mSkillButtons[mControllerFocus]->setStateSelected(false);
if (mControllerFocus < 9) selectNextColumn(arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT ? -1 : 1);
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;
mSkillButtons[mControllerFocus]->setStateSelected(true); mSkillButtons[mControllerFocus]->setStateSelected(true);
} }
return 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::DescriptionDialog() DescriptionDialog::DescriptionDialog()

View file

@ -257,6 +257,9 @@ namespace MWGui
private: private:
ESM::RefId mSkillId; ESM::RefId mSkillId;
std::array<size_t, 3> mNumSkillsPerSpecialization;
void selectNextColumn(int direction);
}; };
class DescriptionDialog : public WindowModal class DescriptionDialog : public WindowModal

View file

@ -49,13 +49,12 @@ namespace MWGui
{ {
const auto& store = MWBase::Environment::get().getESMStore()->get<ESM::Attribute>(); const auto& store = MWBase::Environment::get().getESMStore()->get<ESM::Attribute>();
const size_t perCol mPerCol = static_cast<size_t>(std::ceil(store.getSize() / static_cast<float>(std::size(sColumnOffsets))));
= static_cast<size_t>(std::ceil(store.getSize() / static_cast<float>(std::size(sColumnOffsets))));
size_t i = 0; size_t i = 0;
for (const ESM::Attribute& attribute : store) for (const ESM::Attribute& attribute : store)
{ {
const int offset = sColumnOffsets[i / perCol]; const int offset = sColumnOffsets[i / mPerCol];
const int row = static_cast<int>(i % perCol); const int row = static_cast<int>(i % mPerCol);
Widgets widgets; Widgets widgets;
widgets.mMultiplier = mAssignWidget->createWidget<MyGUI::TextBox>( widgets.mMultiplier = mAssignWidget->createWidget<MyGUI::TextBox>(
"SandTextVCenter", { offset, 20 * row, 100, 20 }, MyGUI::Align::Default); "SandTextVCenter", { offset, 20 * row, 100, 20 }, MyGUI::Align::Default);
@ -79,7 +78,7 @@ namespace MWGui
mAssignWidget->setVisibleVScroll(false); mAssignWidget->setVisibleVScroll(false);
mAssignWidget->setCanvasSize(MyGUI::IntSize( mAssignWidget->setCanvasSize(MyGUI::IntSize(
mAssignWidget->getWidth(), std::max(mAssignWidget->getHeight(), static_cast<int>(20 * perCol)))); mAssignWidget->getWidth(), std::max(mAssignWidget->getHeight(), static_cast<int>(20 * mPerCol))));
mAssignWidget->setVisibleVScroll(true); mAssignWidget->setVisibleVScroll(true);
mAssignWidget->setViewOffset(MyGUI::IntPoint()); mAssignWidget->setViewOffset(MyGUI::IntPoint());
} }
@ -397,10 +396,8 @@ namespace MWGui
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP) else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP)
{ {
setControllerFocus(mAttributeButtons, mControllerFocus, false); setControllerFocus(mAttributeButtons, mControllerFocus, false);
if (mControllerFocus == 0) if (mControllerFocus % mPerCol == 0)
mControllerFocus = 3; mControllerFocus += mPerCol - 1;
else if (mControllerFocus == 4)
mControllerFocus = 7;
else else
mControllerFocus--; mControllerFocus--;
setControllerFocus(mAttributeButtons, mControllerFocus, true); setControllerFocus(mAttributeButtons, mControllerFocus, true);
@ -408,10 +405,8 @@ namespace MWGui
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN)
{ {
setControllerFocus(mAttributeButtons, mControllerFocus, false); setControllerFocus(mAttributeButtons, mControllerFocus, false);
if (mControllerFocus == 3) if (mControllerFocus % mPerCol == mPerCol - 1)
mControllerFocus = 0; mControllerFocus -= mPerCol - 1;
else if (mControllerFocus == 7)
mControllerFocus = 4;
else else
mControllerFocus++; mControllerFocus++;
setControllerFocus(mAttributeButtons, mControllerFocus, true); 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) else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
{ {
setControllerFocus(mAttributeButtons, mControllerFocus, false); setControllerFocus(mAttributeButtons, mControllerFocus, false);
mControllerFocus = (mControllerFocus + 4) % mAttributeButtons.size(); mControllerFocus = (mControllerFocus + mPerCol) % mAttributeButtons.size();
setControllerFocus(mAttributeButtons, mControllerFocus, true); setControllerFocus(mAttributeButtons, mControllerFocus, true);
} }

View file

@ -37,6 +37,7 @@ namespace MWGui
std::vector<ESM::Attribute::AttributeID> mSpentAttributes; std::vector<ESM::Attribute::AttributeID> mSpentAttributes;
size_t mPerCol;
unsigned int mCoinCount; unsigned int mCoinCount;
void onOkButtonClicked(MyGUI::Widget* sender); void onOkButtonClicked(MyGUI::Widget* sender);