From a8ffd593744d05c2d29c7d1ebe18b2d765ca51fb Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Fri, 20 May 2022 04:09:06 -0500 Subject: [PATCH] DolphinQt: Move advanced control group settings to a new dialog. --- .../Config/Mapping/MappingWidget.cpp | 64 +++++++++++++++++++ .../DolphinQt/Config/Mapping/MappingWidget.h | 1 + .../ControllerEmu/Setting/NumericSetting.h | 6 +- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp index 8a832bfcf46a..8eff998f9962 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp @@ -4,6 +4,7 @@ #include "DolphinQt/Config/Mapping/MappingWidget.h" #include +#include #include #include #include @@ -145,6 +146,19 @@ QGroupBox* MappingWidget::CreateGroupBox(const QString& name, ControllerEmu::Con [group_enable_checkbox, group] { group_enable_checkbox->setChecked(group->enabled); }); } + const auto advanced_setting_count = std::count_if( + group->numeric_settings.begin(), group->numeric_settings.end(), [](auto& setting) { + return setting->GetDifficulty() == ControllerEmu::SettingDifficulty::Advanced; + }); + + if (advanced_setting_count != 0) + { + const auto advanced_button = new QPushButton(tr("Advanced")); + form_layout->addRow(advanced_button); + connect(advanced_button, &QPushButton::clicked, + [this, group] { ShowAdvancedControlGroupDialog(group); }); + } + return group_box; } @@ -187,6 +201,56 @@ void MappingWidget::AddSettingWidgets(QFormLayout* layout, ControllerEmu::Contro } } +void MappingWidget::ShowAdvancedControlGroupDialog(ControllerEmu::ControlGroup* group) +{ + QDialog dialog{this}; + dialog.setWindowTitle(tr(group->ui_name.c_str())); + + const auto group_box = new QGroupBox(tr("Advanced Settings")); + + QFormLayout* form_layout = new QFormLayout(); + + AddSettingWidgets(form_layout, group, ControllerEmu::SettingDifficulty::Advanced); + + const auto reset_button = new QPushButton(tr("Reset All")); + form_layout->addRow(reset_button); + + connect(reset_button, &QPushButton::clicked, [this, group] { + for (auto& setting : group->numeric_settings) + { + if (setting->GetDifficulty() != ControllerEmu::SettingDifficulty::Advanced) + continue; + + setting->SetToDefault(); + } + + emit ConfigChanged(); + }); + + const auto main_layout = new QVBoxLayout(); + const auto button_box = new QDialogButtonBox(QDialogButtonBox::Close); + + group_box->setLayout(form_layout); + + main_layout->addWidget(group_box); + main_layout->addWidget(button_box); + + dialog.setLayout(main_layout); + + // Focusing something else by default instead of the first spin box. + // Dynamically changing expression-backed settings pause when taking input. + // This just avoids that weird edge case behavior when the dialog is first open. + button_box->setFocus(); + + // Signal the newly created numeric setting widgets to display the current values. + emit ConfigChanged(); + + // Enable "Close" button functionality. + connect(button_box, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + dialog.exec(); +} + QGroupBox* MappingWidget::CreateControlsBox(const QString& name, ControllerEmu::ControlGroup* group, int columns) { diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.h b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.h index 39a69214f31f..12863bb0aaf5 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.h +++ b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.h @@ -60,6 +60,7 @@ class MappingWidget : public QWidget QPushButton* CreateSettingAdvancedMappingButton(ControllerEmu::NumericSettingBase& setting); void AddSettingWidgets(QFormLayout* layout, ControllerEmu::ControlGroup* group, ControllerEmu::SettingDifficulty difficulty); + void ShowAdvancedControlGroupDialog(ControllerEmu::ControlGroup* group); private: MappingWindow* m_parent; diff --git a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h index 67d6a31591a8..97ec716582a7 100644 --- a/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h +++ b/Source/Core/InputCommon/ControllerEmu/Setting/NumericSetting.h @@ -76,6 +76,8 @@ class NumericSettingBase virtual SettingType GetType() const = 0; + virtual void SetToDefault() = 0; + const char* GetUIName() const; const char* GetUISuffix() const; const char* GetUIDescription() const; @@ -103,9 +105,11 @@ class NumericSetting final : public NumericSettingBase : NumericSettingBase(details), m_value(*value), m_default_value(default_value), m_min_value(min_value), m_max_value(max_value) { - m_value.SetValue(m_default_value); + SetToDefault(); } + void SetToDefault() override { m_value.SetValue(m_default_value); } + void LoadFromIni(const IniFile::Section& section, const std::string& group_name) override { std::string str_value;