diff --git a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp index 0f43658ae3..e988509f6a 100644 --- a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp @@ -13,12 +13,17 @@ #include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h" #include "DolphinQt/QtUtils/NonDefaultQPushButton.h" +#include "DolphinQt/QtUtils/SignalBlocking.h" +#include "DolphinQt/Settings.h" CommonControllersWidget::CommonControllersWidget(QWidget* parent) : QWidget(parent) { CreateLayout(); LoadSettings(); ConnectWidgets(); + + connect(&Settings::Instance(), &Settings::ConfigChanged, this, + &CommonControllersWidget::LoadSettings); } void CommonControllersWidget::CreateLayout() @@ -59,7 +64,7 @@ void CommonControllersWidget::OnControllerInterfaceConfigure() void CommonControllersWidget::LoadSettings() { - m_common_bg_input->setChecked(Config::Get(Config::MAIN_INPUT_BACKGROUND_INPUT)); + SignalBlocking(m_common_bg_input)->setChecked(Config::Get(Config::MAIN_INPUT_BACKGROUND_INPUT)); } void CommonControllersWidget::SaveSettings() diff --git a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp index 3b18baf1e9..2f9fc53183 100644 --- a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp @@ -22,22 +22,25 @@ #include "DolphinQt/Config/Mapping/GCPadWiiUConfigDialog.h" #include "DolphinQt/Config/Mapping/MappingWindow.h" #include "DolphinQt/QtUtils/NonDefaultQPushButton.h" +#include "DolphinQt/QtUtils/SignalBlocking.h" #include "DolphinQt/Settings.h" #include "InputCommon/GCAdapter.h" -static const std::vector> s_gc_types = { - {SerialInterface::SIDEVICE_NONE, _trans("None")}, - {SerialInterface::SIDEVICE_GC_CONTROLLER, _trans("Standard Controller")}, - {SerialInterface::SIDEVICE_WIIU_ADAPTER, _trans("GameCube Adapter for Wii U")}, - {SerialInterface::SIDEVICE_GC_STEERING, _trans("Steering Wheel")}, - {SerialInterface::SIDEVICE_DANCEMAT, _trans("Dance Mat")}, - {SerialInterface::SIDEVICE_GC_TARUKONGA, _trans("DK Bongos")}, +using SIDeviceName = std::pair; +static constexpr std::array s_gc_types = { + SIDeviceName{SerialInterface::SIDEVICE_NONE, _trans("None")}, + SIDeviceName{SerialInterface::SIDEVICE_GC_CONTROLLER, _trans("Standard Controller")}, + SIDeviceName{SerialInterface::SIDEVICE_WIIU_ADAPTER, _trans("GameCube Adapter for Wii U")}, + SIDeviceName{SerialInterface::SIDEVICE_GC_STEERING, _trans("Steering Wheel")}, + SIDeviceName{SerialInterface::SIDEVICE_DANCEMAT, _trans("Dance Mat")}, + SIDeviceName{SerialInterface::SIDEVICE_GC_TARUKONGA, _trans("DK Bongos")}, #ifdef HAS_LIBMGBA - {SerialInterface::SIDEVICE_GC_GBA_EMULATED, _trans("GBA (Integrated)")}, + SIDeviceName{SerialInterface::SIDEVICE_GC_GBA_EMULATED, _trans("GBA (Integrated)")}, #endif - {SerialInterface::SIDEVICE_GC_GBA, _trans("GBA (TCP)")}, - {SerialInterface::SIDEVICE_GC_KEYBOARD, _trans("Keyboard")}}; + SIDeviceName{SerialInterface::SIDEVICE_GC_GBA, _trans("GBA (TCP)")}, + SIDeviceName{SerialInterface::SIDEVICE_GC_KEYBOARD, _trans("Keyboard")}, +}; static std::optional ToGCMenuIndex(const SerialInterface::SIDevices sidevice) { @@ -54,16 +57,14 @@ static SerialInterface::SIDevices FromGCMenuIndex(const int menudevice) return s_gc_types[menudevice].first; } -static bool IsConfigurable(SerialInterface::SIDevices sidevice) -{ - return sidevice != SerialInterface::SIDEVICE_NONE && sidevice != SerialInterface::SIDEVICE_GC_GBA; -} - GamecubeControllersWidget::GamecubeControllersWidget(QWidget* parent) : QWidget(parent) { CreateLayout(); LoadSettings(); ConnectWidgets(); + + connect(&Settings::Instance(), &Settings::ConfigChanged, this, + &GamecubeControllersWidget::LoadSettings); } void GamecubeControllersWidget::CreateLayout() @@ -100,43 +101,27 @@ void GamecubeControllersWidget::CreateLayout() void GamecubeControllersWidget::ConnectWidgets() { - for (size_t i = 0; i < m_gc_controller_boxes.size(); i++) + for (size_t i = 0; i < m_gc_controller_boxes.size(); ++i) { connect(m_gc_controller_boxes[i], qOverload(&QComboBox::currentIndexChanged), this, - &GamecubeControllersWidget::SaveSettings); - connect(m_gc_controller_boxes[i], qOverload(&QComboBox::currentIndexChanged), this, - &GamecubeControllersWidget::OnGCTypeChanged); - connect(m_gc_buttons[i], &QPushButton::clicked, this, - &GamecubeControllersWidget::OnGCPadConfigure); + [this, i] { + OnGCTypeChanged(i); + SaveSettings(); + }); + connect(m_gc_buttons[i], &QPushButton::clicked, this, [this, i] { OnGCPadConfigure(i); }); } } -void GamecubeControllersWidget::OnGCTypeChanged(int type) +void GamecubeControllersWidget::OnGCTypeChanged(size_t index) { - const auto* box = static_cast(QObject::sender()); - - for (size_t i = 0; i < m_gc_groups.size(); i++) - { - if (m_gc_controller_boxes[i] == box) - { - const SerialInterface::SIDevices si_device = FromGCMenuIndex(box->currentIndex()); - m_gc_buttons[i]->setEnabled(IsConfigurable(si_device)); - return; - } - } - - SaveSettings(); + const SerialInterface::SIDevices si_device = + FromGCMenuIndex(m_gc_controller_boxes[index]->currentIndex()); + m_gc_buttons[index]->setEnabled(si_device != SerialInterface::SIDEVICE_NONE && + si_device != SerialInterface::SIDEVICE_GC_GBA); } -void GamecubeControllersWidget::OnGCPadConfigure() +void GamecubeControllersWidget::OnGCPadConfigure(size_t index) { - size_t index; - for (index = 0; index < m_gc_groups.size(); index++) - { - if (m_gc_buttons[index] == QObject::sender()) - break; - } - MappingWindow::Type type; switch (FromGCMenuIndex(m_gc_controller_boxes[index]->currentIndex())) @@ -184,30 +169,32 @@ void GamecubeControllersWidget::LoadSettings() const std::optional gc_index = ToGCMenuIndex(si_device); if (gc_index) { - m_gc_controller_boxes[i]->setCurrentIndex(*gc_index); - m_gc_buttons[i]->setEnabled(IsConfigurable(si_device)); + SignalBlocking(m_gc_controller_boxes[i])->setCurrentIndex(*gc_index); + OnGCTypeChanged(i); } } } void GamecubeControllersWidget::SaveSettings() { - for (size_t i = 0; i < m_gc_groups.size(); i++) { - const int index = m_gc_controller_boxes[i]->currentIndex(); - const SerialInterface::SIDevices si_device = FromGCMenuIndex(index); - Config::SetBaseOrCurrent(Config::GetInfoForSIDevice(static_cast(i)), si_device); + Config::ConfigChangeCallbackGuard config_guard; - if (Core::IsRunning()) - SerialInterface::ChangeDevice(si_device, static_cast(i)); + for (size_t i = 0; i < m_gc_groups.size(); ++i) + { + const SerialInterface::SIDevices si_device = + FromGCMenuIndex(m_gc_controller_boxes[i]->currentIndex()); + Config::SetBaseOrCurrent(Config::GetInfoForSIDevice(static_cast(i)), si_device); - m_gc_buttons[i]->setEnabled(IsConfigurable(si_device)); + if (Core::IsRunning()) + SerialInterface::ChangeDevice(si_device, static_cast(i)); + } + + if (GCAdapter::UseAdapter()) + GCAdapter::StartScanThread(); + else + GCAdapter::StopScanThread(); } - if (GCAdapter::UseAdapter()) - GCAdapter::StartScanThread(); - else - GCAdapter::StopScanThread(); - SConfig::GetInstance().SaveSettings(); } diff --git a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.h b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.h index 236fd1774a..edaf405476 100644 --- a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.h +++ b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.h @@ -23,8 +23,8 @@ private: void LoadSettings(); void SaveSettings(); - void OnGCTypeChanged(int state); - void OnGCPadConfigure(); + void OnGCTypeChanged(size_t index); + void OnGCPadConfigure(size_t index); void CreateLayout(); void ConnectWidgets(); diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp index 392af928d8..6db5bc28ec 100644 --- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp @@ -32,6 +32,7 @@ #include "DolphinQt/Config/Mapping/MappingWindow.h" #include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/QtUtils/NonDefaultQPushButton.h" +#include "DolphinQt/QtUtils/SignalBlocking.h" #include "DolphinQt/Settings.h" #include "UICommon/UICommon.h" @@ -39,8 +40,13 @@ WiimoteControllersWidget::WiimoteControllersWidget(QWidget* parent) : QWidget(parent) { CreateLayout(); - LoadSettings(); ConnectWidgets(); + + connect(&Settings::Instance(), &Settings::ConfigChanged, this, + [this] { LoadSettings(Core::GetState()); }); + connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, + [this](Core::State state) { LoadSettings(state); }); + LoadSettings(Core::GetState()); } static int GetRadioButtonIndicatorWidth() @@ -153,20 +159,20 @@ void WiimoteControllersWidget::CreateLayout() void WiimoteControllersWidget::ConnectWidgets() { - connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, - &WiimoteControllersWidget::UpdateDisabledWiimoteControls); + connect(m_wiimote_passthrough, &QRadioButton::toggled, this, [this] { + SaveSettings(); + LoadSettings(Core::GetState()); + }); + connect(m_wiimote_ciface, &QCheckBox::toggled, this, [this] { + SaveSettings(); + LoadSettings(Core::GetState()); + WiimoteReal::HandleWiimotesInControllerInterfaceSettingChange(); + }); + connect(m_wiimote_continuous_scanning, &QCheckBox::toggled, this, [this] { + SaveSettings(); + LoadSettings(Core::GetState()); + }); - connect(m_wiimote_passthrough, &QRadioButton::toggled, this, - &WiimoteControllersWidget::OnWiimoteModeChanged); - connect(m_wiimote_ciface, &QCheckBox::toggled, this, - &WiimoteControllersWidget::OnWiimoteModeChanged); - connect(m_wiimote_ciface, &QCheckBox::toggled, this, - &WiimoteReal::HandleWiimotesInControllerInterfaceSettingChange); - connect(m_wiimote_continuous_scanning, &QCheckBox::toggled, this, - &WiimoteControllersWidget::OnWiimoteModeChanged); - - connect(m_wiimote_continuous_scanning, &QCheckBox::toggled, this, - &WiimoteControllersWidget::SaveSettings); connect(m_wiimote_real_balance_board, &QCheckBox::toggled, this, &WiimoteControllersWidget::SaveSettings); connect(m_wiimote_speaker_data, &QCheckBox::toggled, this, @@ -180,61 +186,15 @@ void WiimoteControllersWidget::ConnectWidgets() for (size_t i = 0; i < m_wiimote_groups.size(); i++) { - connect(m_wiimote_boxes[i], qOverload(&QComboBox::currentIndexChanged), this, - &WiimoteControllersWidget::SaveSettings); - connect(m_wiimote_boxes[i], qOverload(&QComboBox::currentIndexChanged), this, - &WiimoteControllersWidget::OnWiimoteModeChanged); + connect(m_wiimote_boxes[i], qOverload(&QComboBox::currentIndexChanged), this, [this] { + SaveSettings(); + LoadSettings(Core::GetState()); + }); connect(m_wiimote_buttons[i], &QPushButton::clicked, this, - &WiimoteControllersWidget::OnWiimoteConfigure); + [this, i] { OnWiimoteConfigure(i); }); } } -void WiimoteControllersWidget::OnWiimoteModeChanged() -{ - SaveSettings(); - - // Make sure continuous scanning setting is applied. - WiimoteReal::Initialize(::Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES); - - UpdateDisabledWiimoteControls(); -} - -void WiimoteControllersWidget::UpdateDisabledWiimoteControls() -{ - const bool running = Core::GetState() != Core::State::Uninitialized; - - m_wiimote_emu->setEnabled(!running); - m_wiimote_passthrough->setEnabled(!running); - - const bool running_gc = running && !SConfig::GetInstance().bWii; - const bool enable_passthrough = m_wiimote_passthrough->isChecked() && !running_gc; - const bool enable_emu_bt = !m_wiimote_passthrough->isChecked() && !running_gc; - - m_wiimote_sync->setEnabled(enable_passthrough); - m_wiimote_reset->setEnabled(enable_passthrough); - - for (auto* pt_label : m_wiimote_pt_labels) - pt_label->setEnabled(enable_passthrough); - - for (size_t i = 0; i < m_wiimote_groups.size(); i++) - { - m_wiimote_labels[i]->setEnabled(enable_emu_bt); - m_wiimote_boxes[i]->setEnabled(enable_emu_bt); - - const bool is_emu_wiimote = m_wiimote_boxes[i]->currentIndex() == 1; - m_wiimote_buttons[i]->setEnabled(enable_emu_bt && is_emu_wiimote); - } - - m_wiimote_real_balance_board->setEnabled(enable_emu_bt); - m_wiimote_speaker_data->setEnabled(enable_emu_bt); - - const bool ciface_wiimotes = m_wiimote_ciface->isChecked(); - - m_wiimote_refresh->setEnabled((enable_emu_bt || ciface_wiimotes) && - !m_wiimote_continuous_scanning->isChecked()); - m_wiimote_continuous_scanning->setEnabled(enable_emu_bt || ciface_wiimotes); -} - void WiimoteControllersWidget::OnBluetoothPassthroughResetPressed() { const auto ios = IOS::HLE::GetIOS(); @@ -273,15 +233,8 @@ void WiimoteControllersWidget::OnWiimoteRefreshPressed() WiimoteReal::Refresh(); } -void WiimoteControllersWidget::OnWiimoteConfigure() +void WiimoteControllersWidget::OnWiimoteConfigure(size_t index) { - size_t index; - for (index = 0; index < m_wiimote_groups.size(); index++) - { - if (m_wiimote_buttons[index] == QObject::sender()) - break; - } - MappingWindow::Type type; switch (m_wiimote_boxes[index]->currentIndex()) { @@ -301,45 +254,86 @@ void WiimoteControllersWidget::OnWiimoteConfigure() window->show(); } -void WiimoteControllersWidget::LoadSettings() +void WiimoteControllersWidget::LoadSettings(Core::State state) { for (size_t i = 0; i < m_wiimote_groups.size(); i++) { - m_wiimote_boxes[i]->setCurrentIndex(int(Config::Get(Config::GetInfoForWiimoteSource(int(i))))); + SignalBlocking(m_wiimote_boxes[i]) + ->setCurrentIndex(int(Config::Get(Config::GetInfoForWiimoteSource(int(i))))); } - m_wiimote_real_balance_board->setChecked(Config::Get(Config::WIIMOTE_BB_SOURCE) == - WiimoteSource::Real); - m_wiimote_speaker_data->setChecked(Config::Get(Config::MAIN_WIIMOTE_ENABLE_SPEAKER)); - m_wiimote_ciface->setChecked(Config::Get(Config::MAIN_CONNECT_WIIMOTES_FOR_CONTROLLER_INTERFACE)); - m_wiimote_continuous_scanning->setChecked(Config::Get(Config::MAIN_WIIMOTE_CONTINUOUS_SCANNING)); + SignalBlocking(m_wiimote_real_balance_board) + ->setChecked(Config::Get(Config::WIIMOTE_BB_SOURCE) == WiimoteSource::Real); + SignalBlocking(m_wiimote_speaker_data) + ->setChecked(Config::Get(Config::MAIN_WIIMOTE_ENABLE_SPEAKER)); + SignalBlocking(m_wiimote_ciface) + ->setChecked(Config::Get(Config::MAIN_CONNECT_WIIMOTES_FOR_CONTROLLER_INTERFACE)); + SignalBlocking(m_wiimote_continuous_scanning) + ->setChecked(Config::Get(Config::MAIN_WIIMOTE_CONTINUOUS_SCANNING)); if (Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED)) - m_wiimote_passthrough->setChecked(true); + SignalBlocking(m_wiimote_passthrough)->setChecked(true); else - m_wiimote_emu->setChecked(true); + SignalBlocking(m_wiimote_emu)->setChecked(true); - OnWiimoteModeChanged(); + // Make sure continuous scanning setting is applied. + WiimoteReal::Initialize(::Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES); + + const bool running = state != Core::State::Uninitialized; + + m_wiimote_emu->setEnabled(!running); + m_wiimote_passthrough->setEnabled(!running); + + const bool running_gc = running && !SConfig::GetInstance().bWii; + const bool enable_passthrough = m_wiimote_passthrough->isChecked() && !running_gc; + const bool enable_emu_bt = !m_wiimote_passthrough->isChecked() && !running_gc; + + m_wiimote_sync->setEnabled(enable_passthrough); + m_wiimote_reset->setEnabled(enable_passthrough); + + for (auto* pt_label : m_wiimote_pt_labels) + pt_label->setEnabled(enable_passthrough); + + for (size_t i = 0; i < m_wiimote_groups.size(); i++) + { + m_wiimote_labels[i]->setEnabled(enable_emu_bt); + m_wiimote_boxes[i]->setEnabled(enable_emu_bt); + + const bool is_emu_wiimote = m_wiimote_boxes[i]->currentIndex() == 1; + m_wiimote_buttons[i]->setEnabled(enable_emu_bt && is_emu_wiimote); + } + + m_wiimote_real_balance_board->setEnabled(enable_emu_bt); + m_wiimote_speaker_data->setEnabled(enable_emu_bt); + + const bool ciface_wiimotes = m_wiimote_ciface->isChecked(); + + m_wiimote_refresh->setEnabled((enable_emu_bt || ciface_wiimotes) && + !m_wiimote_continuous_scanning->isChecked()); + m_wiimote_continuous_scanning->setEnabled(enable_emu_bt || ciface_wiimotes); } void WiimoteControllersWidget::SaveSettings() { - Config::SetBaseOrCurrent(Config::MAIN_WIIMOTE_ENABLE_SPEAKER, - m_wiimote_speaker_data->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_CONNECT_WIIMOTES_FOR_CONTROLLER_INTERFACE, - m_wiimote_ciface->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_WIIMOTE_CONTINUOUS_SCANNING, - m_wiimote_continuous_scanning->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED, - m_wiimote_passthrough->isChecked()); - - const WiimoteSource bb_source = - m_wiimote_real_balance_board->isChecked() ? WiimoteSource::Real : WiimoteSource::None; - Config::SetBaseOrCurrent(Config::WIIMOTE_BB_SOURCE, bb_source); - - for (size_t i = 0; i < m_wiimote_groups.size(); i++) { - const int index = m_wiimote_boxes[i]->currentIndex(); - Config::SetBaseOrCurrent(Config::GetInfoForWiimoteSource(int(i)), WiimoteSource(index)); + Config::ConfigChangeCallbackGuard config_guard; + Config::SetBaseOrCurrent(Config::MAIN_WIIMOTE_ENABLE_SPEAKER, + m_wiimote_speaker_data->isChecked()); + Config::SetBaseOrCurrent(Config::MAIN_CONNECT_WIIMOTES_FOR_CONTROLLER_INTERFACE, + m_wiimote_ciface->isChecked()); + Config::SetBaseOrCurrent(Config::MAIN_WIIMOTE_CONTINUOUS_SCANNING, + m_wiimote_continuous_scanning->isChecked()); + Config::SetBaseOrCurrent(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED, + m_wiimote_passthrough->isChecked()); + + const WiimoteSource bb_source = + m_wiimote_real_balance_board->isChecked() ? WiimoteSource::Real : WiimoteSource::None; + Config::SetBaseOrCurrent(Config::WIIMOTE_BB_SOURCE, bb_source); + + for (size_t i = 0; i < m_wiimote_groups.size(); i++) + { + const int index = m_wiimote_boxes[i]->currentIndex(); + Config::SetBaseOrCurrent(Config::GetInfoForWiimoteSource(int(i)), WiimoteSource(index)); + } } SConfig::GetInstance().SaveSettings(); diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.h b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.h index 4ba49e2771..e8cf91ce4b 100644 --- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.h +++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.h @@ -16,6 +16,11 @@ class QLabel; class QPushButton; class QRadioButton; +namespace Core +{ +enum class State; +} + class WiimoteControllersWidget final : public QWidget { Q_OBJECT @@ -23,17 +28,15 @@ public: explicit WiimoteControllersWidget(QWidget* parent); private: - void OnWiimoteModeChanged(); - void UpdateDisabledWiimoteControls(); void SaveSettings(); void OnBluetoothPassthroughSyncPressed(); void OnBluetoothPassthroughResetPressed(); void OnWiimoteRefreshPressed(); - void OnWiimoteConfigure(); + void OnWiimoteConfigure(size_t index); void CreateLayout(); void ConnectWidgets(); - void LoadSettings(); + void LoadSettings(Core::State state); QGroupBox* m_wiimote_box; QGridLayout* m_wiimote_layout;