From 0277f2e60e6cd67b599d86223a385184e3240301 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Mon, 29 Jun 2026 08:57:50 +0200 Subject: [PATCH] UI: Add MouseController settings to enable/disable position through a checkbox --- src/gui/wxgui/CMakeLists.txt | 2 + src/gui/wxgui/input/InputSettings2.cpp | 11 ++- .../settings/MouseControllerSettings.cpp | 72 +++++++++++++++++++ .../input/settings/MouseControllerSettings.h | 25 +++++++ src/input/api/Mouse/MouseController.cpp | 13 ++++ src/input/api/Mouse/MouseController.h | 7 +- 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/gui/wxgui/input/settings/MouseControllerSettings.cpp create mode 100644 src/gui/wxgui/input/settings/MouseControllerSettings.h diff --git a/src/gui/wxgui/CMakeLists.txt b/src/gui/wxgui/CMakeLists.txt index 079a78cd..90e9a5a7 100644 --- a/src/gui/wxgui/CMakeLists.txt +++ b/src/gui/wxgui/CMakeLists.txt @@ -88,6 +88,8 @@ add_library(CemuWxGui STATIC input/settings/DefaultControllerSettings.h input/settings/WiimoteControllerSettings.cpp input/settings/WiimoteControllerSettings.h + input/settings/MouseControllerSettings.cpp + input/settings/MouseControllerSettings.h LoggingWindow.cpp LoggingWindow.h MainWindow.cpp diff --git a/src/gui/wxgui/input/InputSettings2.cpp b/src/gui/wxgui/input/InputSettings2.cpp index d77e1430..dae93b8f 100644 --- a/src/gui/wxgui/input/InputSettings2.cpp +++ b/src/gui/wxgui/input/InputSettings2.cpp @@ -25,6 +25,7 @@ #include "wxgui/input/PairingDialog.h" #endif +#include "input/api/Mouse/MouseController.h" #include "wxgui/input/panels/VPADInputPanel.h" #include "wxgui/input/panels/ProControllerInputPanel.h" @@ -35,6 +36,7 @@ #include "util/EventService.h" #include "resource/embedded/resources.h" +#include "settings/MouseControllerSettings.h" bool g_inputConfigWindowHasFocus = false; @@ -960,7 +962,14 @@ void InputSettings2::on_controller_settings(wxCommandEvent& event) wnd.ShowModal(); break; } - + case InputAPI::Mouse: + { + const auto mouse_controller = std::dynamic_pointer_cast(controller); + wxASSERT(mouse_controller); + MouseControllerSettings wnd(this, wxGetMousePosition() + wxSize(5, 5), mouse_controller); + wnd.ShowModal(); + break; + } case InputAPI::Keyboard: break; #ifdef SUPPORTS_WIIMOTE diff --git a/src/gui/wxgui/input/settings/MouseControllerSettings.cpp b/src/gui/wxgui/input/settings/MouseControllerSettings.cpp new file mode 100644 index 00000000..7f877d16 --- /dev/null +++ b/src/gui/wxgui/input/settings/MouseControllerSettings.cpp @@ -0,0 +1,72 @@ +#include "MouseControllerSettings.h" + +#include "input/api/Mouse/MouseController.h" + +#include +#include +#include +#include + +#include "wxgui/helpers/wxHelpers.h" +#include "wxgui/input/InputAPIAddWindow.h" + + +MouseControllerSettings::MouseControllerSettings(wxWindow* parent, const wxPoint& position, std::shared_ptr controller) + : wxDialog(parent, wxID_ANY, _("Controller settings"), position, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE), m_controller(std::move(controller)) +{ + this->SetSizeHints(wxDefaultSize, wxDefaultSize); + + auto* sizer = new wxBoxSizer(wxVERTICAL); + + // options + { + auto* box = new wxStaticBox(this, wxID_ANY, _("Options")); + auto* box_sizer = new wxStaticBoxSizer(box, wxVERTICAL); + + // Position (wiimote pointer) + m_usePosition = new wxCheckBox(box, wxID_ANY, _("Use position")); + m_usePosition->SetValue(m_controller->IsPositionEnabled()); + m_usePosition->Enable(m_controller->has_position()); + box_sizer->Add(m_usePosition, 0, wxEXPAND | wxALL, 5); + + sizer->Add(box_sizer, 1, wxALL|wxEXPAND, 5); + } + + { + auto* control_sizer = new wxFlexGridSizer(0, 3, 0, 0); + control_sizer->AddGrowableCol(2); + + auto* ok_button = new wxButton(this, wxID_ANY, _("OK")); + ok_button->Bind(wxEVT_BUTTON, [this](auto&) { UpdateSettings(); EndModal(wxID_OK); }); + control_sizer->Add(ok_button, 0, wxALL, 5); + + control_sizer->Add(0, 0, 0, wxEXPAND, 5); + + auto* cancel_button = new wxButton(this, wxID_ANY, _("Cancel")); + cancel_button->Bind(wxEVT_BUTTON, [this](auto&) { EndModal(wxID_CANCEL); }); + control_sizer->Add(cancel_button, 0, wxALL, 5); + + sizer->Add(control_sizer, 0, wxEXPAND, 5); + } + + this->SetSizer(sizer); + this->Layout(); + this->Fit(); + + this->Bind(wxEVT_CLOSE_WINDOW, &MouseControllerSettings::OnClose, this); +} + +void MouseControllerSettings::UpdateSettings() +{ + if (m_usePosition) + m_controller->SetPositionEnabled(m_usePosition->GetValue()); +} + +void MouseControllerSettings::OnClose(wxCloseEvent& event) +{ + if (this->GetReturnCode() == 0 || this->GetReturnCode() == wxID_OK) + UpdateSettings(); + + event.Skip(); +} diff --git a/src/gui/wxgui/input/settings/MouseControllerSettings.h b/src/gui/wxgui/input/settings/MouseControllerSettings.h new file mode 100644 index 00000000..77d58476 --- /dev/null +++ b/src/gui/wxgui/input/settings/MouseControllerSettings.h @@ -0,0 +1,25 @@ +#pragma once + +#include "input/api/Controller.h" +#include "wx/dialog.h" + +#include + +class wxCheckBox; +class wxPoint; +class wxWindow; +class MouseController; + +class MouseControllerSettings : public wxDialog +{ +public: + MouseControllerSettings(wxWindow* parent, const wxPoint& position, std::shared_ptr controller); + +private: + std::shared_ptr m_controller; + + wxCheckBox* m_usePosition = nullptr; + + void UpdateSettings(); + void OnClose(wxCloseEvent& event); +}; diff --git a/src/input/api/Mouse/MouseController.cpp b/src/input/api/Mouse/MouseController.cpp index 8d7345ae..fe92231a 100644 --- a/src/input/api/Mouse/MouseController.cpp +++ b/src/input/api/Mouse/MouseController.cpp @@ -7,7 +7,20 @@ std::string_view MouseController::api_name() const return to_string(InputAPI::Mouse); } +MouseController& MouseController::SetPositionEnabled(bool value) +{ + m_isPositionEnabled = value; + return *this; +} + glm::vec2 MouseController::get_position() { return InputManager::instance().GetMousePositionInRenderBox(); } + +PositionVisibility MouseController::GetPositionVisibility() +{ + return IsPositionEnabled() + ? PositionVisibility::FULL + : PositionVisibility::NONE; +} diff --git a/src/input/api/Mouse/MouseController.h b/src/input/api/Mouse/MouseController.h index dd81cc31..55953f48 100644 --- a/src/input/api/Mouse/MouseController.h +++ b/src/input/api/Mouse/MouseController.h @@ -15,7 +15,12 @@ public: ControllerState raw_state() override { return {}; } bool has_position() override { return true; } + bool IsPositionEnabled() const { return m_isPositionEnabled; } + MouseController& SetPositionEnabled(bool value); glm::vec2 get_position() override; - PositionVisibility GetPositionVisibility() override { return PositionVisibility::FULL; } + PositionVisibility GetPositionVisibility() override; + +private: + bool m_isPositionEnabled = false; };