1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-02 10:04:31 +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);
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()

View file

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

View file

@ -49,13 +49,12 @@ namespace MWGui
{
const auto& store = MWBase::Environment::get().getESMStore()->get<ESM::Attribute>();
const size_t perCol
= static_cast<size_t>(std::ceil(store.getSize() / static_cast<float>(std::size(sColumnOffsets))));
mPerCol = static_cast<size_t>(std::ceil(store.getSize() / static_cast<float>(std::size(sColumnOffsets))));
size_t i = 0;
for (const ESM::Attribute& attribute : store)
{
const int offset = sColumnOffsets[i / perCol];
const int row = static_cast<int>(i % perCol);
const int offset = sColumnOffsets[i / mPerCol];
const int row = static_cast<int>(i % mPerCol);
Widgets widgets;
widgets.mMultiplier = mAssignWidget->createWidget<MyGUI::TextBox>(
"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<int>(20 * perCol))));
mAssignWidget->getWidth(), std::max(mAssignWidget->getHeight(), static_cast<int>(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);
}

View file

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