From 07be682b885940ad80b244de8f5b7a323b984223 Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Mon, 12 May 2025 20:10:13 -0700 Subject: [PATCH] Better controller support for journal; mouse for topic index A-Z --- apps/openmw/mwgui/journalwindow.cpp | 163 +++++++++++++++++++++++----- apps/openmw/mwgui/journalwindow.hpp | 4 + 2 files changed, 139 insertions(+), 28 deletions(-) diff --git a/apps/openmw/mwgui/journalwindow.cpp b/apps/openmw/mwgui/journalwindow.cpp index 7fd6e3d995..3dc46459b4 100644 --- a/apps/openmw/mwgui/journalwindow.cpp +++ b/apps/openmw/mwgui/journalwindow.cpp @@ -248,6 +248,8 @@ namespace } updateShowingPages(); + mSelectedQuest = 0; + MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget(CloseBTN)); } @@ -469,6 +471,20 @@ namespace MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page")); } + void addControllerButtons(Gui::MWList* _list, int _selectedIndex) + { + mButtons.clear(); + for (int i = 0; i < _list->getItemCount(); i++) + { + MyGUI::Button* listItem = _list->getItemWidget(_list->getItemNameAt(i)); + if (listItem) + { + listItem->setStateSelected(mButtons.size() == _selectedIndex); + mButtons.push_back(listItem); + } + } + } + void notifyIndexLinkClicked(MWGui::TypesetBook::InteractiveId index) { setVisible(LeftTopicIndex, false); @@ -487,6 +503,9 @@ namespace list->adjustSize(); + if (Settings::gui().mControllerMenus) + addControllerButtons(list, mSelectedQuest); + MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page")); } @@ -554,6 +573,9 @@ namespace list->sort(); list->adjustSize(); + if (Settings::gui().mControllerMenus) + addControllerButtons(list, mSelectedQuest); + if (mAllQuests) { SetNamesInactive setInactive(list); @@ -642,64 +664,149 @@ namespace bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override { - if (arg.button == SDL_CONTROLLER_BUTTON_A) + if (arg.button == SDL_CONTROLLER_BUTTON_A) // A: Mouse click or Select { // Fall through to mouse click - return false; - } - else if (arg.button == SDL_CONTROLLER_BUTTON_B) - { - if (mOptionsMode) - notifyCancel(getWidget(CancelBTN)); - else if (mStates.size() > 1) - notifyJournal(getWidget(JournalBTN)); - else - notifyClose(getWidget(CloseBTN)); - return true; - } - else if (arg.button == SDL_CONTROLLER_BUTTON_X) - { - if (mQuestMode) + if (mUsingGamepadGuiCursor) + return false; + + if (mOptionsMode && mQuestMode) { - if (!mOptionsMode) - notifyOptions(getWidget(OptionsBTN)); - notifyTopics(getWidget(TopicsBTN)); + // Choose a quest + Gui::MWList* list = getWidget(QuestsList); + notifyQuestClicked(list->getItemNameAt(mSelectedQuest), 0); + } + else if (mOptionsMode && mTopicsMode) + { + // Choose a topic + Gui::MWList* list = getWidget(TopicsList); + notifyTopicSelected(list->getItemNameAt(mSelectedQuest), 0); } return true; } - else if (arg.button == SDL_CONTROLLER_BUTTON_Y) + else if (arg.button == SDL_CONTROLLER_BUTTON_B) // B: Back { - if (!mQuestMode) + if (mOptionsMode) { + // Hide the options overlay + notifyCancel(getWidget(CancelBTN)); + mQuestMode = false; + } + else if (mStates.size() > 1) + { + // Pop the current book. If in quest mode, reopen the quest list. + notifyJournal(getWidget(JournalBTN)); + if (mQuestMode) + { + notifyOptions(getWidget(OptionsBTN)); + notifyQuests(getWidget(QuestsBTN)); + } + } + else + { + // Close the journal window + notifyClose(getWidget(CloseBTN)); + } + return true; + } + else if (arg.button == SDL_CONTROLLER_BUTTON_Y) // Y: Quests + { + if (mOptionsMode && mQuestMode) + { + // Hide the quest overlay if visible + notifyCancel(getWidget(CancelBTN)); + mQuestMode = false; + } + else { + // Show the quest overlay if viewing a journal entry or the topics if (!mOptionsMode) notifyOptions(getWidget(OptionsBTN)); - notifyQuests(getWidget(QuestsBTN)); + if (!mQuestMode) + notifyQuests(getWidget(QuestsBTN)); + } + return true; + } + else if (arg.button == SDL_CONTROLLER_BUTTON_X) // X: Topics + { + if (mOptionsMode && !mQuestMode) + { + // Hide the topics overlay if visible + notifyCancel(getWidget(CancelBTN)); + mQuestMode = false; + } + else { + // Show the topics overlay if viewing a journal entry or the quest list + if (!mOptionsMode) + notifyOptions(getWidget(OptionsBTN)); + if (mQuestMode) + notifyTopics(getWidget(TopicsBTN)); } return true; } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP) { + if (mOptionsMode && (mQuestMode || mTopicsMode)) + { + // Scroll through the list of quests or topics + mButtons[mSelectedQuest]->setStateSelected(false); + mSelectedQuest--; + if (mSelectedQuest < 0) + mSelectedQuest = mButtons.size() - 1; + mButtons[mSelectedQuest]->setStateSelected(true); + } + mUsingGamepadGuiCursor = false; return true; } else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN) { + if (mOptionsMode && (mQuestMode || mTopicsMode)) + { + // Scroll through the list of quests or topics + mButtons[mSelectedQuest]->setStateSelected(false); + mSelectedQuest++; + if (mSelectedQuest > mButtons.size() - 1) + mSelectedQuest = 0; + mButtons[mSelectedQuest]->setStateSelected(true); + } + mUsingGamepadGuiCursor = false; return true; } - else if (arg.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER || - arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) + else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) { - notifyPrevPage(getWidget(PrevPageBTN)); + if (!mOptionsMode) + notifyPrevPage(getWidget(PrevPageBTN)); + mUsingGamepadGuiCursor = false; return true; } - else if (arg.button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER || - arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) + else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { - notifyNextPage(getWidget(NextPageBTN)); + if (!mOptionsMode) + notifyNextPage(getWidget(NextPageBTN)); + mUsingGamepadGuiCursor = false; + return true; + } + else if (arg.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER) // LB: Previous Page + { + if (!mOptionsMode) + notifyPrevPage(getWidget(PrevPageBTN)); + return true; + } + else if (arg.button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER) // RB: Next Page + { + if (!mOptionsMode) + notifyNextPage(getWidget(NextPageBTN)); return true; } return false; } + + bool onControllerThumbstickEvent(const SDL_ControllerAxisEvent& arg) override + { + if (arg.axis == SDL_CONTROLLER_AXIS_LEFTX || arg.axis == SDL_CONTROLLER_AXIS_LEFTY) + mUsingGamepadGuiCursor = true; + return false; + } }; } diff --git a/apps/openmw/mwgui/journalwindow.hpp b/apps/openmw/mwgui/journalwindow.hpp index 22e7048acf..5da2038575 100644 --- a/apps/openmw/mwgui/journalwindow.hpp +++ b/apps/openmw/mwgui/journalwindow.hpp @@ -31,6 +31,10 @@ namespace MWGui void setVisible(bool newValue) override = 0; std::string_view getWindowIdForLua() const override { return "Journal"; } + + std::vector mButtons; + int mSelectedQuest = 0; + bool mUsingGamepadGuiCursor = false; }; }