diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp index e4181e4bd5..1d937c1e63 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp @@ -9,30 +9,36 @@ namespace MWGui { static constexpr ControllerButtonsOverlay::ButtonDefinition sButtonDefs[] = { - { ControllerButtonsOverlay::Button::Button_A, "A", SDL_CONTROLLER_BUTTON_A, &ControllerButtons::mA }, - { ControllerButtonsOverlay::Button::Button_B, "B", SDL_CONTROLLER_BUTTON_B, &ControllerButtons::mB }, - { ControllerButtonsOverlay::Button::Button_Dpad, "Dpad", SDL_CONTROLLER_BUTTON_DPAD_UP, - &ControllerButtons::mDpad }, - { ControllerButtonsOverlay::Button::Button_L1, "L1", SDL_CONTROLLER_BUTTON_LEFTSHOULDER, - &ControllerButtons::mL1 }, - { ControllerButtonsOverlay::Button::Button_L2, "L2", SDL_CONTROLLER_AXIS_TRIGGERLEFT, &ControllerButtons::mL2 }, - { ControllerButtonsOverlay::Button::Button_L3, "L3", SDL_CONTROLLER_BUTTON_LEFTSTICK, &ControllerButtons::mL3 }, - { ControllerButtonsOverlay::Button::Button_LStick, "LStick", SDL_CONTROLLER_AXIS_LEFTY, - &ControllerButtons::mLStick }, - { ControllerButtonsOverlay::Button::Button_Menu, "Menu", SDL_CONTROLLER_BUTTON_BACK, - &ControllerButtons::mMenu }, - { ControllerButtonsOverlay::Button::Button_R1, "R1", SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, - &ControllerButtons::mR1 }, - { ControllerButtonsOverlay::Button::Button_R2, "R2", SDL_CONTROLLER_AXIS_TRIGGERRIGHT, - &ControllerButtons::mR2 }, - { ControllerButtonsOverlay::Button::Button_R3, "R3", SDL_CONTROLLER_BUTTON_RIGHTSTICK, - &ControllerButtons::mR3 }, - { ControllerButtonsOverlay::Button::Button_RStick, "RStick", SDL_CONTROLLER_AXIS_RIGHTY, - &ControllerButtons::mRStick }, - { ControllerButtonsOverlay::Button::Button_View, "View", SDL_CONTROLLER_BUTTON_START, - &ControllerButtons::mView }, - { ControllerButtonsOverlay::Button::Button_X, "X", SDL_CONTROLLER_BUTTON_X, &ControllerButtons::mX }, - { ControllerButtonsOverlay::Button::Button_Y, "Y", SDL_CONTROLLER_BUTTON_Y, &ControllerButtons::mY }, + { ControllerButtonsOverlay::Button::Button_A, "A", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_A }, &ControllerButtons::mA }, + { ControllerButtonsOverlay::Button::Button_B, "B", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_B }, &ControllerButtons::mB }, + { ControllerButtonsOverlay::Button::Button_Dpad, "Dpad", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_DPAD_UP }, &ControllerButtons::mDpad }, + { ControllerButtonsOverlay::Button::Button_L1, "L1", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_LEFTSHOULDER }, &ControllerButtons::mL1 }, + { ControllerButtonsOverlay::Button::Button_L2, "L2", ControllerButtonsOverlay::InputType_Axis, + { .mAxis = SDL_CONTROLLER_AXIS_TRIGGERLEFT }, &ControllerButtons::mL2 }, + { ControllerButtonsOverlay::Button::Button_L3, "L3", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_LEFTSTICK }, &ControllerButtons::mL3 }, + { ControllerButtonsOverlay::Button::Button_LStick, "LStick", ControllerButtonsOverlay::InputType_Axis, + { .mAxis = SDL_CONTROLLER_AXIS_LEFTY }, &ControllerButtons::mLStick }, + { ControllerButtonsOverlay::Button::Button_Menu, "Menu", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_BACK }, &ControllerButtons::mMenu }, + { ControllerButtonsOverlay::Button::Button_R1, "R1", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER }, &ControllerButtons::mR1 }, + { ControllerButtonsOverlay::Button::Button_R2, "R2", ControllerButtonsOverlay::InputType_Axis, + { .mAxis = SDL_CONTROLLER_AXIS_TRIGGERRIGHT }, &ControllerButtons::mR2 }, + { ControllerButtonsOverlay::Button::Button_R3, "R3", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_RIGHTSTICK }, &ControllerButtons::mR3 }, + { ControllerButtonsOverlay::Button::Button_RStick, "RStick", ControllerButtonsOverlay::InputType_Axis, + { .mAxis = SDL_CONTROLLER_AXIS_RIGHTY }, &ControllerButtons::mRStick }, + { ControllerButtonsOverlay::Button::Button_View, "View", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_START }, &ControllerButtons::mView }, + { ControllerButtonsOverlay::Button::Button_X, "X", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_X }, &ControllerButtons::mX }, + { ControllerButtonsOverlay::Button::Button_Y, "Y", ControllerButtonsOverlay::InputType_Button, + { .mButton = SDL_CONTROLLER_BUTTON_Y }, &ControllerButtons::mY }, }; ControllerButtonsOverlay::ControllerButtonsOverlay() @@ -45,12 +51,11 @@ namespace MWGui getWidget(mButtons[i].mImage, "Btn" + sButtonDefs[i].mName + "Image"); getWidget(mButtons[i].mText, "Btn" + sButtonDefs[i].mName + "Text"); getWidget(mButtons[i].mHBox, "Btn" + sButtonDefs[i].mName); - if (std::holds_alternative(sButtonDefs[i].mId)) - setIcon(mButtons[i].mImage, - inputMgr->getControllerAxisIcon(std::get(sButtonDefs[i].mId))); + + if (sButtonDefs[i].mInputType == InputType_Axis) + setIcon(mButtons[i].mImage, inputMgr->getControllerAxisIcon(sButtonDefs[i].mId.mAxis)); else - setIcon(mButtons[i].mImage, - inputMgr->getControllerButtonIcon(std::get(sButtonDefs[i].mId))); + setIcon(mButtons[i].mImage, inputMgr->getControllerButtonIcon(sButtonDefs[i].mId.mButton)); } getWidget(mHBox, "ButtonBox"); diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp index 4cbf32cb47..e828556e94 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp @@ -38,24 +38,35 @@ namespace MWGui Button_Max, }; + enum InputType + { + InputType_Button, + InputType_Axis + }; + struct ButtonDefinition { Button mButton; std::string mName; - std::variant mId; + InputType mInputType; + union { + SDL_GameControllerButton mButton; + SDL_GameControllerAxis mAxis; + } mId; std::string MWGui::ControllerButtons::*mField; }; private: struct ButtonWidgets { - MyGUI::ImageBox* mImage = nullptr; - MyGUI::TextBox* mText = nullptr; - Gui::HBox* mHBox = nullptr; + MyGUI::ImageBox* mImage; + MyGUI::TextBox* mText; + Gui::HBox* mHBox; + + ButtonWidgets() : mImage(nullptr), mText(nullptr), mHBox(nullptr) {} }; std::array mButtons; - Gui::HBox* mHBox; void setIcon(MyGUI::ImageBox* image, const std::string& imagePath);