diff --git a/apps/openmw/mwgui/birth.cpp b/apps/openmw/mwgui/birth.cpp index bc6b37df50..53f0f9793b 100644 --- a/apps/openmw/mwgui/birth.cpp +++ b/apps/openmw/mwgui/birth.cpp @@ -59,7 +59,12 @@ namespace MWGui mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &BirthDialog::onOkClicked); if (Settings::gui().mControllerMenus) + { mOkButton->setStateSelected(true); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; + mControllerButtons.x = "#{sDone}"; + } updateBirths(); updateSpells(); @@ -273,11 +278,6 @@ namespace MWGui mSpellArea->setViewOffset(MyGUI::IntPoint(0, 0)); } - std::string BirthDialog::getButtonStr() - { - return "(A) #{sSelect} (X) #{sDone} (B) #{sBack}"; - } - bool BirthDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/birth.hpp b/apps/openmw/mwgui/birth.hpp index 841ff872b0..8a7190b934 100644 --- a/apps/openmw/mwgui/birth.hpp +++ b/apps/openmw/mwgui/birth.hpp @@ -38,8 +38,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onSelectBirth(MyGUI::ListBox* _sender, size_t _index); diff --git a/apps/openmw/mwgui/bookwindow.cpp b/apps/openmw/mwgui/bookwindow.cpp index 6f6a6187b9..c48493c1b4 100644 --- a/apps/openmw/mwgui/bookwindow.cpp +++ b/apps/openmw/mwgui/bookwindow.cpp @@ -70,6 +70,10 @@ namespace MWGui MyGUI::IntCoord(0, 0, (64 - 7) * scale, mNextPageButton->getSize().height * scale)); } + mControllerButtons.l1 = "#{sPrev}"; + mControllerButtons.r1 = "#{sNext}"; + mControllerButtons.b = "#{sClose}"; + center(); } @@ -222,12 +226,10 @@ namespace MWGui } } - std::string BookWindow::getButtonStr() + ControllerButtonStr* BookWindow::getControllerButtons() { - if (mTakeButton->getVisible()) - return "(A) #{sTake} (LB) #{sPrev} (RB) #{sNext} (B) #{sClose}"; - else - return "(LB) #{sPrev} (RB) #{sNext} (B) #{sClose}"; + mControllerButtons.a = mTakeButton->getVisible() ? "#{sTake}" : ""; + return &mControllerButtons; } bool BookWindow::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) diff --git a/apps/openmw/mwgui/bookwindow.hpp b/apps/openmw/mwgui/bookwindow.hpp index f6b1fa7bc9..0a1beb7342 100644 --- a/apps/openmw/mwgui/bookwindow.hpp +++ b/apps/openmw/mwgui/bookwindow.hpp @@ -21,7 +21,7 @@ namespace MWGui bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override; std::string_view getWindowIdForLua() const override { return "Book"; } - std::string getButtonStr() override; + ControllerButtonStr* getControllerButtons() override; protected: void onNextPageButtonClicked(MyGUI::Widget* sender); diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index 7c9d7c724e..0ac39e4bac 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -60,6 +60,8 @@ namespace MWGui mOkButton->setStateSelected(true); trackFocusEvents(mBackButton); trackFocusEvents(mOkButton); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; } center(); @@ -77,11 +79,6 @@ namespace MWGui center(); } - std::string GenerateClassResultDialog::getButtonStr() - { - return "(A) #{sSelect} (B) #{sBack}"; - } - bool GenerateClassResultDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) @@ -155,7 +152,12 @@ namespace MWGui mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &PickClassDialog::onOkClicked); if (Settings::gui().mControllerMenus) + { mOkButton->setStateSelected(true); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; + mControllerButtons.x = "#{sDone}"; + } updateClasses(); updateStats(); @@ -317,11 +319,6 @@ namespace MWGui setClassImage(mClassImage, mCurrentClassId); } - std::string PickClassDialog::getButtonStr() - { - return "(A) #{sSelect} (X) #{sDone} (B) #{sBack}"; - } - bool PickClassDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) @@ -419,6 +416,8 @@ namespace MWGui getWidget(mButtonBar, "ButtonBar"); center(); + + mControllerButtons.a = "#{sSelect}"; } void InfoBoxDialog::setText(const std::string& str) @@ -490,11 +489,6 @@ namespace MWGui } } - std::string InfoBoxDialog::getButtonStr() - { - return "(A) #{sSelect}"; - } - bool InfoBoxDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) @@ -623,7 +617,12 @@ namespace MWGui mButtons.push_back(okButton); if (Settings::gui().mControllerMenus) + { okButton->setStateSelected(true); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; + mControllerButtons.x = "#{sDone}"; + } // Set default skills, attributes @@ -718,11 +717,6 @@ namespace MWGui MyGUI::UString(MWBase::Environment::get().getWindowManager()->getGameSettingString("sOK", {}))); } - std::string CreateClassDialog::getButtonStr() - { - return "(A) #{sSelect} (X) #{sDone} (B) #{sCancel}"; - } - bool CreateClassDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) @@ -939,6 +933,9 @@ namespace MWGui MyGUI::Button* cancelButton; getWidget(cancelButton, "CancelButton"); cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onCancelClicked); + + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sCancel}"; } SelectSpecializationDialog::~SelectSpecializationDialog() {} @@ -970,11 +967,6 @@ namespace MWGui return true; } - std::string SelectSpecializationDialog::getButtonStr() - { - return "(A) #{sSelect} (B) #{sCancel}"; - } - bool SelectSpecializationDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_B) @@ -1016,6 +1008,9 @@ namespace MWGui MyGUI::Button* cancelButton; getWidget(cancelButton, "CancelButton"); cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectAttributeDialog::onCancelClicked); + + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sCancel}"; } // widget controls @@ -1037,11 +1032,6 @@ namespace MWGui return true; } - std::string SelectAttributeDialog::getButtonStr() - { - return "(A) #{sSelect} (B) #{sCancel}"; - } - bool SelectAttributeDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_B) @@ -1093,6 +1083,9 @@ namespace MWGui MyGUI::Button* cancelButton; getWidget(cancelButton, "CancelButton"); cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSkillDialog::onCancelClicked); + + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sCancel}"; } SelectSkillDialog::~SelectSkillDialog() {} @@ -1116,11 +1109,6 @@ namespace MWGui return true; } - std::string SelectSkillDialog::getButtonStr() - { - return "(A) #{sSelect} (B) #{sCancel}"; - } - bool SelectSkillDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_B) diff --git a/apps/openmw/mwgui/class.hpp b/apps/openmw/mwgui/class.hpp index af18e5d660..e2566ce6c0 100644 --- a/apps/openmw/mwgui/class.hpp +++ b/apps/openmw/mwgui/class.hpp @@ -40,8 +40,6 @@ namespace MWGui */ EventHandle_Int eventButtonSelected; - std::string getButtonStr() override; - protected: void onButtonClicked(MyGUI::Widget* _sender); bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override; @@ -93,8 +91,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onOkClicked(MyGUI::Widget* _sender); void onBackClicked(MyGUI::Widget* _sender); @@ -136,8 +132,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onSelectClass(MyGUI::ListBox* _sender, size_t _index); void onAccept(MyGUI::ListBox* _sender, size_t _index); @@ -189,8 +183,6 @@ namespace MWGui */ EventHandle_Void eventItemSelected; - std::string getButtonStr() override; - protected: void onSpecializationClicked(MyGUI::Widget* _sender); void onCancelClicked(MyGUI::Widget* _sender); @@ -225,8 +217,6 @@ namespace MWGui */ EventHandle_Void eventItemSelected; - std::string getButtonStr() override; - protected: void onAttributeClicked(Widgets::MWAttributePtr _sender); void onCancelClicked(MyGUI::Widget* _sender); @@ -259,8 +249,6 @@ namespace MWGui */ EventHandle_Void eventItemSelected; - std::string getButtonStr() override; - protected: void onSkillClicked(Widgets::MWSkillPtr _sender); void onCancelClicked(MyGUI::Widget* _sender); @@ -322,8 +310,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onOkClicked(MyGUI::Widget* _sender); void onBackClicked(MyGUI::Widget* _sender); diff --git a/apps/openmw/mwgui/confirmationdialog.cpp b/apps/openmw/mwgui/confirmationdialog.cpp index 8fa4afab16..1d8f14176a 100644 --- a/apps/openmw/mwgui/confirmationdialog.cpp +++ b/apps/openmw/mwgui/confirmationdialog.cpp @@ -24,6 +24,8 @@ namespace MWGui { trackFocusEvents(mOkButton); trackFocusEvents(mCancelButton); + mControllerButtons.a = "#{sOk}"; + mControllerButtons.b = "#{sCancel}"; } } @@ -72,11 +74,6 @@ namespace MWGui eventOkClicked(); } - std::string ConfirmationDialog::getButtonStr() - { - return "(A) #{sOk} (B) #{sCancel}"; - } - bool ConfirmationDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/confirmationdialog.hpp b/apps/openmw/mwgui/confirmationdialog.hpp index 2e2f7df0af..9b26e3a3c9 100644 --- a/apps/openmw/mwgui/confirmationdialog.hpp +++ b/apps/openmw/mwgui/confirmationdialog.hpp @@ -20,8 +20,6 @@ namespace MWGui EventHandle_Void eventOkClicked; EventHandle_Void eventCancelClicked; - std::string getButtonStr() override; - private: MyGUI::EditBox* mMessage; MyGUI::Button* mOkButton; diff --git a/apps/openmw/mwgui/container.cpp b/apps/openmw/mwgui/container.cpp index 05e56d10ee..615c4801d3 100644 --- a/apps/openmw/mwgui/container.cpp +++ b/apps/openmw/mwgui/container.cpp @@ -56,6 +56,12 @@ namespace MWGui mTakeButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ContainerWindow::onTakeAllButtonClicked); setCoord(200, 0, 600, 300); + + mControllerButtons.a = "#{sTake}"; + mControllerButtons.b = "#{sClose}"; + mControllerButtons.x = "#{sTakeAll}"; + mControllerButtons.y = "#{sInfo}"; + mControllerButtons.l2 = "#{sInventory}"; } void ContainerWindow::onItemSelected(int index) @@ -352,12 +358,10 @@ namespace MWGui MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Container); } - std::string ContainerWindow::getButtonStr() + ControllerButtonStr* ContainerWindow::getControllerButtons() { - if (mDisposeCorpseButton->getVisible()) - return "(A) #{sTake} (X) #{sTakeAll} (LB) #{sDisposeofCorpse} (Y) #{sInfo} [LT] #{sInventory} (B) #{sClose}"; - else - return "(A) #{sTake} (X) #{sTakeAll} (Y) #{sInfo} [LT] #{sInventory} (B) #{sClose}"; + mControllerButtons.l1 = mDisposeCorpseButton->getVisible() ? "#{sDisposeofCorpse}" : ""; + return &mControllerButtons; } bool ContainerWindow::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) diff --git a/apps/openmw/mwgui/container.hpp b/apps/openmw/mwgui/container.hpp index 22f5f2425a..d2d8c9f4aa 100644 --- a/apps/openmw/mwgui/container.hpp +++ b/apps/openmw/mwgui/container.hpp @@ -40,7 +40,7 @@ namespace MWGui std::string_view getWindowIdForLua() const override { return "Container"; } - std::string getButtonStr() override; + ControllerButtonStr* getControllerButtons() override; void setActiveControllerWindow(bool active) override; private: diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp index 2e7ec3ffcd..f4b35ac4de 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp @@ -1,8 +1,5 @@ #include "controllerbuttonsoverlay.hpp" -#include -#include - #include "../mwbase/environment.hpp" #include "../mwbase/windowmanager.hpp" @@ -11,16 +8,94 @@ namespace MWGui ControllerButtonsOverlay::ControllerButtonsOverlay() : WindowBase("openmw_controllerbuttons.layout") { - getWidget(mButtonStr, "ButtonStr"); + getWidget(mImageA, "BtnAImage"); + getWidget(mTextA, "BtnAText"); + + getWidget(mImageB, "BtnBImage"); + getWidget(mTextB, "BtnBText"); + + getWidget(mImageL1, "BtnL1Image"); + getWidget(mTextL1, "BtnL1Text"); + + getWidget(mImageL2, "BtnL2Image"); + getWidget(mTextL2, "BtnL2Text"); + + getWidget(mImageL3, "BtnL3Image"); + getWidget(mTextL3, "BtnL3Text"); + + getWidget(mImageLStick, "BtnLStickImage"); + getWidget(mTextLStick, "BtnLStickText"); + + getWidget(mImageMenu, "BtnMenuImage"); + getWidget(mTextMenu, "BtnMenuText"); + + getWidget(mImageR1, "BtnR1Image"); + getWidget(mTextR1, "BtnR1Text"); + + getWidget(mImageR2, "BtnR2Image"); + getWidget(mTextR2, "BtnR2Text"); + + getWidget(mImageR3, "BtnR3Image"); + getWidget(mTextR3, "BtnR3Text"); + + getWidget(mImageRStick, "BtnRStickImage"); + getWidget(mTextRStick, "BtnRStickText"); + + getWidget(mImageView, "BtnViewImage"); + getWidget(mTextView, "BtnViewText"); + + getWidget(mImageX, "BtnXImage"); + getWidget(mTextX, "BtnXText"); + + getWidget(mImageY, "BtnYImage"); + getWidget(mTextY, "BtnYText"); + + getWidget(mHBox, "ButtonBox"); } - void ControllerButtonsOverlay::setButtonStr(const std::string& buttonStr) + void ControllerButtonsOverlay::setButtons(ControllerButtonStr* buttons) { - mButtonStr->setCaptionWithReplacing(buttonStr); + int buttonCount = 0; + buttonCount += updateButton(mTextA, mImageA, buttons->a); + buttonCount += updateButton(mTextB, mImageB, buttons->b); + buttonCount += updateButton(mTextL1, mImageL1, buttons->l1); + buttonCount += updateButton(mTextL2, mImageL2, buttons->l2); + buttonCount += updateButton(mTextL3, mImageL3, buttons->l3); + buttonCount += updateButton(mTextLStick, mImageLStick, buttons->lStick); + buttonCount += updateButton(mTextMenu, mImageMenu, buttons->menu); + buttonCount += updateButton(mTextR1, mImageR1, buttons->r1); + buttonCount += updateButton(mTextR2, mImageR2, buttons->r2); + buttonCount += updateButton(mTextR3, mImageR3, buttons->r3); + buttonCount += updateButton(mTextRStick, mImageRStick, buttons->rStick); + buttonCount += updateButton(mTextView, mImageView, buttons->view); + buttonCount += updateButton(mTextX, mImageX, buttons->x); + buttonCount += updateButton(mTextY, mImageY, buttons->y); + mHBox->notifyChildrenSizeChanged(); - // int height = mMessage->getTextSize().height + 60; - // int width = mMessage->getTextSize().width + 24; - // mMainWidget->setSize(width, height); - // mMessage->setSize(mMessage->getWidth(), mMessage->getTextSize().height + 24); + setVisible(buttonCount > 0); + } + + int ControllerButtonsOverlay::updateButton(MyGUI::TextBox* text, MyGUI::ImageBox* image, const std::string& buttonStr) + { + if (buttonStr.length() > 0) + { + image->setVisible(true); + image->setUserString("Hidden", "false"); + + text->setCaptionWithReplacing(buttonStr); + text->setVisible(true); + text->setUserString("Hidden", "false"); + text->setSize(text->getTextSize().width + 16, 48); + return 1; + } + else + { + image->setVisible(false); + image->setUserString("Hidden", "true"); + + text->setVisible(false); + text->setUserString("Hidden", "true"); + return 0; + } } } diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp index c2a9b110bf..7663bbed44 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp @@ -1,6 +1,11 @@ #ifndef MWGUI_CONTROLLERBUTTONSOVERLAY_H #define MWGUI_CONTROLLERBUTTONSOVERLAY_H +#include +#include + +#include + #include "windowbase.hpp" namespace MWGui @@ -10,10 +15,54 @@ namespace MWGui public: ControllerButtonsOverlay(); - void setButtonStr(const std::string& buttonStr); + void setButtons(ControllerButtonStr* buttons); private: - MyGUI::TextBox* mButtonStr; + MyGUI::ImageBox* mImageA; + MyGUI::TextBox* mTextA; + + MyGUI::ImageBox* mImageB; + MyGUI::TextBox* mTextB; + + MyGUI::ImageBox* mImageL1; + MyGUI::TextBox* mTextL1; + + MyGUI::ImageBox* mImageL2; + MyGUI::TextBox* mTextL2; + + MyGUI::ImageBox* mImageL3; + MyGUI::TextBox* mTextL3; + + MyGUI::ImageBox* mImageLStick; + MyGUI::TextBox* mTextLStick; + + MyGUI::ImageBox* mImageMenu; + MyGUI::TextBox* mTextMenu; + + MyGUI::ImageBox* mImageR1; + MyGUI::TextBox* mTextR1; + + MyGUI::ImageBox* mImageR2; + MyGUI::TextBox* mTextR2; + + MyGUI::ImageBox* mImageR3; + MyGUI::TextBox* mTextR3; + + MyGUI::ImageBox* mImageRStick; + MyGUI::TextBox* mTextRStick; + + MyGUI::ImageBox* mImageView; + MyGUI::TextBox* mTextView; + + MyGUI::ImageBox* mImageX; + MyGUI::TextBox* mTextX; + + MyGUI::ImageBox* mImageY; + MyGUI::TextBox* mTextY; + + Gui::HBox* mHBox; + + int updateButton(MyGUI::TextBox* text, MyGUI::ImageBox* image, const std::string& buttonStr); }; } diff --git a/apps/openmw/mwgui/journalwindow.cpp b/apps/openmw/mwgui/journalwindow.cpp index 029104d27c..abb1843178 100644 --- a/apps/openmw/mwgui/journalwindow.cpp +++ b/apps/openmw/mwgui/journalwindow.cpp @@ -218,6 +218,10 @@ namespace } } + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.x = "Quests"; + mControllerButtons.y = "#{sTopics}"; + mQuestMode = false; mAllQuests = false; mOptionsMode = false; @@ -669,14 +673,12 @@ namespace } } - std::string getButtonStr() override + MWGui::ControllerButtonStr* getControllerButtons() override { - if (mOptionsMode) - return "(A) #{sSelect} (X) Quests (Y) #{sTopics} (B) #{sBack}"; - else if (mStates.size() > 1) - return "(A) #{sSelect} (LB) #{sPrev} (RB) #{sNext} (X) Quests (Y) #{sTopics} (B) #{sBack}"; - else - return "(A) #{sSelect} (LB) #{sPrev} (RB) #{sNext} (X) Quests (Y) #{sTopics} (B) #{sClose}"; + mControllerButtons.b = mOptionsMode || mStates.size() > 1 ? "#{sBack}" : "#{sClose}"; + mControllerButtons.l1 = mOptionsMode ? "" : "#{sPrev}"; + mControllerButtons.r1 = mOptionsMode ? "" : "#{sNext}"; + return &mControllerButtons; } bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override diff --git a/apps/openmw/mwgui/mainmenu.cpp b/apps/openmw/mwgui/mainmenu.cpp index 62740c030d..cfcb63e4d5 100644 --- a/apps/openmw/mwgui/mainmenu.cpp +++ b/apps/openmw/mwgui/mainmenu.cpp @@ -207,11 +207,6 @@ namespace MWGui } } - std::string MainMenu::getButtonStr() - { - return ""; - } - bool MainMenu::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { // REMOVEME diff --git a/apps/openmw/mwgui/mainmenu.hpp b/apps/openmw/mwgui/mainmenu.hpp index aa4cba4257..453a16b5e4 100644 --- a/apps/openmw/mwgui/mainmenu.hpp +++ b/apps/openmw/mwgui/mainmenu.hpp @@ -55,8 +55,6 @@ namespace MWGui bool exit() override; - std::string getButtonStr() override; - private: const VFS::Manager* mVFS; diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 00c49e44d0..8c5a968c99 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -282,10 +282,13 @@ namespace MWGui } } - if (Settings::gui().mControllerMenus && mButtons.size() > 1) + if (Settings::gui().mControllerMenus) { + mControllerButtons.a = "#{sOk}"; + // If we have more than one button, we need to set the focus to the first one. - mButtons[0]->setStateSelected(true); + if (mButtons.size() > 1) + mButtons[0]->setStateSelected(true); } MyGUI::IntSize mainWidgetSize; @@ -439,11 +442,6 @@ namespace MWGui return mButtonPressed; } - std::string InteractiveMessageBox::getButtonStr() - { - return "InteractiveMessageBox (A) #{sOk}"; - } - bool InteractiveMessageBox::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 3bc3127828..e6128ee0d1 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -103,7 +103,6 @@ namespace MWGui bool mMarkedToDelete; - std::string getButtonStr() override; bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override; private: diff --git a/apps/openmw/mwgui/race.cpp b/apps/openmw/mwgui/race.cpp index c26d42f0f7..9b97dfbb53 100644 --- a/apps/openmw/mwgui/race.cpp +++ b/apps/openmw/mwgui/race.cpp @@ -117,7 +117,15 @@ namespace MWGui mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &RaceDialog::onOkClicked); if (Settings::gui().mControllerMenus) + { mOkButton->setStateSelected(true); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; + mControllerButtons.x = "#{sDone}"; + mControllerButtons.y = "#{sSex}"; + mControllerButtons.l1 = "#{sHair}"; + mControllerButtons.r1 = "#{sFace}"; + } updateRaces(); updateSkills(); @@ -463,11 +471,6 @@ namespace MWGui } } - std::string RaceDialog::getButtonStr() - { - return "(A) #{sSelect} (Y) #{sSex} (LB) #{sHair} (RB) #{sFace} (X) #{sDone} (B) #{sBack}"; - } - bool RaceDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/race.hpp b/apps/openmw/mwgui/race.hpp index b5eafb51f1..c3b322ba8b 100644 --- a/apps/openmw/mwgui/race.hpp +++ b/apps/openmw/mwgui/race.hpp @@ -65,8 +65,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onPreviewScroll(MyGUI::Widget* _sender, int _delta); void onHeadRotate(MyGUI::ScrollBar* _sender, size_t _position); diff --git a/apps/openmw/mwgui/review.cpp b/apps/openmw/mwgui/review.cpp index 40be524daf..4d0d9d4d2c 100644 --- a/apps/openmw/mwgui/review.cpp +++ b/apps/openmw/mwgui/review.cpp @@ -126,7 +126,12 @@ namespace MWGui mButtons.push_back(okButton); if (Settings::gui().mControllerMenus) + { mButtons[mControllerFocus]->setStateSelected(true); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sBack}"; + mControllerButtons.x = "#{sDone}"; + } } void ReviewDialog::onOpen() @@ -537,11 +542,6 @@ namespace MWGui MyGUI::IntPoint(0, static_cast(mSkillView->getViewOffset().top + _rel * 0.3))); } - std::string ReviewDialog::getButtonStr() - { - return "(A) #{sSelect} (X) #{sDone} (B) #{sBack}"; - } - bool ReviewDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/review.hpp b/apps/openmw/mwgui/review.hpp index e14bf834cd..fe53787fe3 100644 --- a/apps/openmw/mwgui/review.hpp +++ b/apps/openmw/mwgui/review.hpp @@ -62,8 +62,6 @@ namespace MWGui EventHandle_Int eventActivateDialog; - std::string getButtonStr() override; - protected: void onOkClicked(MyGUI::Widget* _sender); void onBackClicked(MyGUI::Widget* _sender); diff --git a/apps/openmw/mwgui/savegamedialog.cpp b/apps/openmw/mwgui/savegamedialog.cpp index 9db28afc10..568c12d00d 100644 --- a/apps/openmw/mwgui/savegamedialog.cpp +++ b/apps/openmw/mwgui/savegamedialog.cpp @@ -66,6 +66,8 @@ namespace MWGui trackFocusEvents(mCancelButton); trackFocusEvents(mDeleteButton); + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sClose}"; } void SaveGameDialog::onSlotActivated(MyGUI::ListBox* sender, size_t pos) @@ -504,12 +506,10 @@ namespace MWGui mScreenshot->setRenderItemTexture(mScreenshotTexture.get()); } - std::string SaveGameDialog::getButtonStr() + ControllerButtonStr* SaveGameDialog::getControllerButtons() { - if (mSaving) - return "(A) #{sSelect} (B) #{sClose}"; - else - return "(A) #{sSelect} (Y) Select Character (B) #{sClose}"; + mControllerButtons.y = mSaving ? "" : "Select Character"; + return &mControllerButtons; } bool SaveGameDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) diff --git a/apps/openmw/mwgui/savegamedialog.hpp b/apps/openmw/mwgui/savegamedialog.hpp index e9872a0d49..fbe319aed1 100644 --- a/apps/openmw/mwgui/savegamedialog.hpp +++ b/apps/openmw/mwgui/savegamedialog.hpp @@ -24,7 +24,7 @@ namespace MWGui void setLoadOrSave(bool load); - std::string getButtonStr() override; + ControllerButtonStr* getControllerButtons() override; private: void confirmDeleteSave(); diff --git a/apps/openmw/mwgui/scrollwindow.cpp b/apps/openmw/mwgui/scrollwindow.cpp index 5b7ef4238a..5146d77e5d 100644 --- a/apps/openmw/mwgui/scrollwindow.cpp +++ b/apps/openmw/mwgui/scrollwindow.cpp @@ -41,6 +41,9 @@ namespace MWGui mCloseButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); mTakeButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); + mControllerButtons.b = "#{sClose}"; + mControllerButtons.rStick = "#{sScrolldown}"; + center(); } @@ -126,12 +129,10 @@ namespace MWGui BookWindowBase::onClose(); } - std::string ScrollWindow::getButtonStr() + ControllerButtonStr* ScrollWindow::getControllerButtons() { - if (mTakeButton->getVisible()) - return "(A) #{sTake} (RS) #{sScrolldown} (B) #{sClose}"; - else - return "(A) #{sTake} (RS) #{sScrolldown} (B) #{sClose}"; + mControllerButtons.a = mTakeButton->getVisible() ? "#{sTake}" : ""; + return &mControllerButtons; } bool ScrollWindow::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) diff --git a/apps/openmw/mwgui/scrollwindow.hpp b/apps/openmw/mwgui/scrollwindow.hpp index 4e447707d0..f1047fdeba 100644 --- a/apps/openmw/mwgui/scrollwindow.hpp +++ b/apps/openmw/mwgui/scrollwindow.hpp @@ -25,7 +25,7 @@ namespace MWGui std::string_view getWindowIdForLua() const override { return "Scroll"; } - std::string getButtonStr() override; + ControllerButtonStr* getControllerButtons() override; protected: void onCloseButtonClicked(MyGUI::Widget* _sender); diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index 201204bc74..2fa6a72fd8 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -459,6 +459,11 @@ namespace MWGui i++; } + + mControllerButtons.a = "#{sSelect}"; + mControllerButtons.b = "#{sOk}"; + mControllerButtons.l1 = "#{sPrev} Tab"; + mControllerButtons.r1 = "#{sNext} Tab"; } void SettingsWindow::onTabChanged(MyGUI::TabControl* /*_sender*/, size_t /*index*/) @@ -1129,11 +1134,6 @@ namespace MWGui mControlsBox->setViewOffset(MyGUI::IntPoint(0, 0)); } - std::string SettingsWindow::getButtonStr() - { - return "(A) #{sSelect} (LB) #{sPrev} Tab (RB) #{sNext} Tab (B) #{sOk}"; - } - bool SettingsWindow::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_B) diff --git a/apps/openmw/mwgui/settingswindow.hpp b/apps/openmw/mwgui/settingswindow.hpp index e8d7f248cb..555468d806 100644 --- a/apps/openmw/mwgui/settingswindow.hpp +++ b/apps/openmw/mwgui/settingswindow.hpp @@ -26,7 +26,6 @@ namespace MWGui void onResChange(int, int) override; - std::string getButtonStr() override; bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override; protected: diff --git a/apps/openmw/mwgui/textinput.cpp b/apps/openmw/mwgui/textinput.cpp index e6352c928e..6ef8f1ef8e 100644 --- a/apps/openmw/mwgui/textinput.cpp +++ b/apps/openmw/mwgui/textinput.cpp @@ -25,6 +25,8 @@ namespace MWGui // Make sure the edit box has focus MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mTextEdit); + + mControllerButtons.a = "#{sOk}"; } void TextInputDialog::setNextButtonShow(bool shown) @@ -83,11 +85,6 @@ namespace MWGui mTextEdit->setCaption(text); } - std::string TextInputDialog::getButtonStr() - { - return "(A) #{sOk}"; - } - bool TextInputDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) { if (arg.button == SDL_CONTROLLER_BUTTON_A) diff --git a/apps/openmw/mwgui/textinput.hpp b/apps/openmw/mwgui/textinput.hpp index 67ca8ba757..ad7896ff27 100644 --- a/apps/openmw/mwgui/textinput.hpp +++ b/apps/openmw/mwgui/textinput.hpp @@ -24,8 +24,6 @@ namespace MWGui */ EventHandle_WindowBase eventDone; - std::string getButtonStr() override; - protected: void onOkClicked(MyGUI::Widget* _sender); void onTextAccepted(MyGUI::EditBox* _sender); diff --git a/apps/openmw/mwgui/waitdialog.cpp b/apps/openmw/mwgui/waitdialog.cpp index 9886f036e4..fa5cefb238 100644 --- a/apps/openmw/mwgui/waitdialog.cpp +++ b/apps/openmw/mwgui/waitdialog.cpp @@ -86,6 +86,8 @@ namespace MWGui trackFocusEvents(mCancelButton); for (MyGUI::Widget* widget : mHourSlider->getAllWidgets()) trackFocusEvents(widget); + + mControllerButtons.b = "#{sCancel}"; } void WaitDialog::setPtr(const MWWorld::Ptr& ptr) @@ -332,17 +334,11 @@ namespace MWGui } } - std::string WaitDialog::getButtonStr() + ControllerButtonStr* WaitDialog::getControllerButtons() { - if (mSleeping) - { - if (mUntilHealedButton->getVisible()) - return "(X) #{sUntilHealed} (A) #{sRest} (B) #{sCancel}"; - else - return "(A) #{sRest} (B) #{sCancel}"; - } - else - return "(A) #{sWait} (B) #{sCancel}"; + mControllerButtons.a = mSleeping ? "#{sRest}" : "#{sWait}"; + mControllerButtons.x = mSleeping && mUntilHealedButton->getVisible() ? "#{sUntilHealed}" : ""; + return &mControllerButtons; } bool WaitDialog::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) diff --git a/apps/openmw/mwgui/waitdialog.hpp b/apps/openmw/mwgui/waitdialog.hpp index 77593c3049..4a7ccfcd00 100644 --- a/apps/openmw/mwgui/waitdialog.hpp +++ b/apps/openmw/mwgui/waitdialog.hpp @@ -47,7 +47,7 @@ namespace MWGui std::string_view getWindowIdForLua() const override { return "WaitDialog"; } - std::string getButtonStr() override; + ControllerButtonStr* getControllerButtons() override; protected: MyGUI::TextBox* mDateTimeText; diff --git a/apps/openmw/mwgui/windowbase.hpp b/apps/openmw/mwgui/windowbase.hpp index cd4d2874ca..2a9d4592d3 100644 --- a/apps/openmw/mwgui/windowbase.hpp +++ b/apps/openmw/mwgui/windowbase.hpp @@ -14,6 +14,24 @@ namespace MWGui { class DragAndDrop; + struct ControllerButtonStr + { + std::string a; + std::string b; + std::string l1; + std::string l2; + std::string l3; + std::string lStick; + std::string menu; + std::string r1; + std::string r2; + std::string r3; + std::string rStick; + std::string view; + std::string x; + std::string y; + }; + class WindowBase : public Layout { public: @@ -62,12 +80,13 @@ namespace MWGui // REMOVEME // virtual bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) = 0; // virtual bool onControllerThumbstickEvent(const SDL_ControllerAxisEvent& arg) = 0; - virtual std::string getButtonStr() { return ""; } + virtual ControllerButtonStr* getControllerButtons() { return &mControllerButtons; } virtual void setActiveControllerWindow(bool active) { mActiveControllerWindow = active; } protected: virtual void onTitleDoubleClicked(); + ControllerButtonStr mControllerButtons; MyGUI::Widget* mMouseFocus = nullptr; bool mActiveControllerWindow = false; void trackFocusEvents(MyGUI::Widget* widget); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index b9df5b0b4e..ff2e9754af 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -2561,19 +2561,7 @@ namespace MWGui return; } - std::string buttonStr = topWin->getButtonStr(); - // REMOVEME - Log(Debug::Error) << "WindowManager::updateControllerButtonsOverlay: showing overlay: " << buttonStr; - if (buttonStr.length() > 0) - { - mControllerButtonsOverlay->setButtonStr(buttonStr); - mControllerButtonsOverlay->setVisible(true); - } - else - { - // REMOVEME - Log(Debug::Error) << "WindowManager::updateControllerButtonsOverlay: ...psych, hiding it"; - mControllerButtonsOverlay->setVisible(false); - } + // setButtons will handle setting visibility based on if any buttons are defined. + mControllerButtonsOverlay->setButtons(topWin->getControllerButtons()); } } diff --git a/files/data/CMakeLists.txt b/files/data/CMakeLists.txt index 97b49d1002..6339344500 100644 --- a/files/data/CMakeLists.txt +++ b/files/data/CMakeLists.txt @@ -10,6 +10,20 @@ set(BUILTIN_DATA_FILES textures/omw_menu_scroll_center_h.dds textures/omw_menu_scroll_center_v.dds textures/omw_menu_icon_active.dds + textures/omw_steam_button_a.dds + textures/omw_steam_button_b.dds + textures/omw_steam_button_l1.dds + textures/omw_steam_button_l2.dds + textures/omw_steam_button_l3.dds + textures/omw_steam_button_lstick.dds + textures/omw_steam_button_menu.dds + textures/omw_steam_button_r1.dds + textures/omw_steam_button_r2.dds + textures/omw_steam_button_r3.dds + textures/omw_steam_button_rstick.dds + textures/omw_steam_button_view.dds + textures/omw_steam_button_x.dds + textures/omw_steam_button_y.dds textures/omw/water_nm.png fonts/DejaVuFontLicense.txt diff --git a/files/data/mygui/openmw_controllerbuttons.layout b/files/data/mygui/openmw_controllerbuttons.layout index d12785f0fc..42c89e10b4 100644 --- a/files/data/mygui/openmw_controllerbuttons.layout +++ b/files/data/mygui/openmw_controllerbuttons.layout @@ -4,15 +4,194 @@ - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/files/data/textures/omw_steam_button_a.dds b/files/data/textures/omw_steam_button_a.dds new file mode 100644 index 0000000000..447aa60815 Binary files /dev/null and b/files/data/textures/omw_steam_button_a.dds differ diff --git a/files/data/textures/omw_steam_button_b.dds b/files/data/textures/omw_steam_button_b.dds new file mode 100644 index 0000000000..0be3063643 Binary files /dev/null and b/files/data/textures/omw_steam_button_b.dds differ diff --git a/files/data/textures/omw_steam_button_l1.dds b/files/data/textures/omw_steam_button_l1.dds new file mode 100644 index 0000000000..2b79a67b98 Binary files /dev/null and b/files/data/textures/omw_steam_button_l1.dds differ diff --git a/files/data/textures/omw_steam_button_l2.dds b/files/data/textures/omw_steam_button_l2.dds new file mode 100644 index 0000000000..156b1ca96c Binary files /dev/null and b/files/data/textures/omw_steam_button_l2.dds differ diff --git a/files/data/textures/omw_steam_button_l3.dds b/files/data/textures/omw_steam_button_l3.dds new file mode 100644 index 0000000000..3b6b174e48 Binary files /dev/null and b/files/data/textures/omw_steam_button_l3.dds differ diff --git a/files/data/textures/omw_steam_button_lstick.dds b/files/data/textures/omw_steam_button_lstick.dds new file mode 100644 index 0000000000..f5df28d6fd Binary files /dev/null and b/files/data/textures/omw_steam_button_lstick.dds differ diff --git a/files/data/textures/omw_steam_button_menu.dds b/files/data/textures/omw_steam_button_menu.dds new file mode 100644 index 0000000000..ef0a0a501c Binary files /dev/null and b/files/data/textures/omw_steam_button_menu.dds differ diff --git a/files/data/textures/omw_steam_button_r1.dds b/files/data/textures/omw_steam_button_r1.dds new file mode 100644 index 0000000000..bdd93de2b2 Binary files /dev/null and b/files/data/textures/omw_steam_button_r1.dds differ diff --git a/files/data/textures/omw_steam_button_r2.dds b/files/data/textures/omw_steam_button_r2.dds new file mode 100644 index 0000000000..052e97ebe1 Binary files /dev/null and b/files/data/textures/omw_steam_button_r2.dds differ diff --git a/files/data/textures/omw_steam_button_r3.dds b/files/data/textures/omw_steam_button_r3.dds new file mode 100644 index 0000000000..73b4bea1f7 Binary files /dev/null and b/files/data/textures/omw_steam_button_r3.dds differ diff --git a/files/data/textures/omw_steam_button_rstick.dds b/files/data/textures/omw_steam_button_rstick.dds new file mode 100644 index 0000000000..f7dfb186f4 Binary files /dev/null and b/files/data/textures/omw_steam_button_rstick.dds differ diff --git a/files/data/textures/omw_steam_button_view.dds b/files/data/textures/omw_steam_button_view.dds new file mode 100644 index 0000000000..8fb56f847f Binary files /dev/null and b/files/data/textures/omw_steam_button_view.dds differ diff --git a/files/data/textures/omw_steam_button_x.dds b/files/data/textures/omw_steam_button_x.dds new file mode 100644 index 0000000000..9619ed243c Binary files /dev/null and b/files/data/textures/omw_steam_button_x.dds differ diff --git a/files/data/textures/omw_steam_button_y.dds b/files/data/textures/omw_steam_button_y.dds new file mode 100644 index 0000000000..4a27710b2a Binary files /dev/null and b/files/data/textures/omw_steam_button_y.dds differ