1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-18 12:16:41 +00:00

Reset controller focus when reopening container and quest menus

This commit is contained in:
Andrew Lanzone 2025-06-22 14:47:54 -07:00
parent 5777a3cc3f
commit 88b43cabec
3 changed files with 33 additions and 32 deletions

View file

@ -252,7 +252,8 @@ namespace
} }
updateShowingPages(); updateShowingPages();
mSelectedQuest = 0; if (Settings::gui().mControllerMenus)
setControllerFocusedQuest(0);
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget<MyGUI::Widget>(CloseBTN)); MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget<MyGUI::Widget>(CloseBTN));
} }
@ -524,7 +525,7 @@ namespace
if (Settings::gui().mControllerMenus) if (Settings::gui().mControllerMenus)
{ {
mSelectedQuest = 0; setControllerFocusedQuest(0);
addControllerButtons(list, mSelectedQuest); addControllerButtons(list, mSelectedQuest);
} }
@ -823,21 +824,7 @@ namespace
return true; return true;
// Scroll through the list of quests or topics // Scroll through the list of quests or topics
mButtons[mSelectedQuest]->setTextColour(MyGUI::Colour::Black); setControllerFocusedQuest(MWGui::wrap(mSelectedQuest - 1, mButtons.size()));
mSelectedQuest = MWGui::wrap(mSelectedQuest - 1, mButtons.size());
mButtons[mSelectedQuest]->setTextColour(MWGui::journalHeaderColour);
// Scroll the list to keep the active item in view
Gui::MWList* list = getWidget<Gui::MWList>(mQuestMode ? QuestsList : TopicsList);
if (mSelectedQuest <= 3)
list->setViewOffset(0);
else
{
int offset = 0;
for (int i = 0; i < mSelectedQuest - 3; i++)
offset += mButtons[i]->getHeight() + 3;
list->setViewOffset(-offset);
}
} }
else if (mOptionsMode) else if (mOptionsMode)
{ {
@ -877,21 +864,7 @@ namespace
return true; return true;
// Scroll through the list of quests or topics // Scroll through the list of quests or topics
mButtons[mSelectedQuest]->setTextColour(MyGUI::Colour::Black); setControllerFocusedQuest(MWGui::wrap(mSelectedQuest + 1, mButtons.size()));
mSelectedQuest = MWGui::wrap(mSelectedQuest + 1, mButtons.size());
mButtons[mSelectedQuest]->setTextColour(MWGui::journalHeaderColour);
// Scroll the list to keep the active item in view
Gui::MWList* list = getWidget<Gui::MWList>(mQuestMode ? QuestsList : TopicsList);
if (mSelectedQuest <= 3)
list->setViewOffset(0);
else
{
int offset = 0;
for (int i = 0; i < mSelectedQuest - 3; i++)
offset += mButtons[i]->getHeight() + 3;
list->setViewOffset(-offset);
}
} }
else if (mOptionsMode) else if (mOptionsMode)
{ {
@ -982,6 +955,31 @@ namespace
return false; return false;
} }
void setControllerFocusedQuest(int index)
{
int listSize = static_cast<int>(mButtons.size());
if (mSelectedQuest >= 0 && mSelectedQuest < listSize)
mButtons[mSelectedQuest]->setTextColour(MyGUI::Colour::Black);
mSelectedQuest = index;
if (mSelectedQuest >= 0 && mSelectedQuest < listSize)
{
mButtons[mSelectedQuest]->setTextColour(MWGui::journalHeaderColour);
// Scroll the list to keep the active item in view
Gui::MWList* list = getWidget<Gui::MWList>(mQuestMode ? QuestsList : TopicsList);
if (mSelectedQuest <= 3)
list->setViewOffset(0);
else
{
int offset = 0;
for (int i = 0; i < mSelectedQuest - 3; i++)
offset += mButtons[i]->getHeight() + 3;
list->setViewOffset(-offset);
}
}
}
}; };
} }

View file

@ -36,6 +36,7 @@ namespace MWGui
int mSelectedQuest = 0; int mSelectedQuest = 0;
int mSelectedIndex = 0; int mSelectedIndex = 0;
void setIndexControllerFocus(int index, bool focused); void setIndexControllerFocus(int index, bool focused);
void setControllerFocusedQuest(int index);
}; };
} }

View file

@ -1407,6 +1407,8 @@ namespace MWGui
if (Settings::gui().mControllerMenus) if (Settings::gui().mControllerMenus)
{ {
if (mode == GM_Container)
mActiveControllerWindows[mode] = 0; // Ensure controller focus is on container
// Activate first visible window. This needs to be called after updateVisible. // Activate first visible window. This needs to be called after updateVisible.
mActiveControllerWindows[mode] = std::max(mActiveControllerWindows[mode] - 1, -1); mActiveControllerWindows[mode] = std::max(mActiveControllerWindows[mode] - 1, -1);
cycleActiveControllerWindow(true); cycleActiveControllerWindow(true);