From 79daed63eeeb52ebc305978ca3236b2a411488c6 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 30 Jan 2023 20:38:23 +1000 Subject: [PATCH] Qt: Handle multiplier in controller settings --- .../Settings/ControllerBindingWidgets.cpp | 33 ++++++------ .../Settings/ControllerSettingWidgetBinder.h | 54 +++++++++++++++---- pcsx2/PAD/Host/PAD.cpp | 2 +- 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/pcsx2-qt/Settings/ControllerBindingWidgets.cpp b/pcsx2-qt/Settings/ControllerBindingWidgets.cpp index 74bf8dfaaa..b7f6d9fe7d 100644 --- a/pcsx2-qt/Settings/ControllerBindingWidgets.cpp +++ b/pcsx2-qt/Settings/ControllerBindingWidgets.cpp @@ -500,8 +500,6 @@ static std::tuple getPrefixAndSuffixForIntFormat(const QString return std::tie(prefix, suffix); } -#if 0 -// Unused until we handle multiplier below. static std::tuple getPrefixAndSuffixForFloatFormat(const QString& format) { QString prefix, suffix; @@ -529,7 +527,6 @@ static std::tuple getPrefixAndSuffixForFloatFormat(const return std::tie(prefix, suffix, decimals); } -#endif void ControllerCustomSettingsWidget::createSettingWidgets(const char* translation_ctx, QWidget* widget_parent, QGridLayout* layout) { @@ -566,7 +563,8 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio sb->setPrefix(prefix); sb->setSuffix(suffix); } - SettingWidgetBinder::BindWidgetToIntSetting(sif, sb, m_config_section, std::move(key_name), si.IntegerDefaultValue()); + ControllerSettingWidgetBinder::BindWidgetToInputProfileInt( + sif, sb, m_config_section, std::move(key_name), si.IntegerDefaultValue()); layout->addWidget(new QLabel(qApp->translate(translation_ctx, si.display_name), widget_parent), current_row, 0); layout->addWidget(sb, current_row, 1, 1, 3); current_row++; @@ -579,7 +577,7 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio cb->setObjectName(QString::fromUtf8(si.name)); for (u32 i = 0; si.options[i] != nullptr; i++) cb->addItem(qApp->translate(translation_ctx, si.options[i])); - SettingWidgetBinder::BindWidgetToIntSetting( + ControllerSettingWidgetBinder::BindWidgetToInputProfileInt( sif, cb, m_config_section, std::move(key_name), si.IntegerDefaultValue(), si.IntegerMinValue()); layout->addWidget(new QLabel(qApp->translate(translation_ctx, si.display_name), widget_parent), current_row, 0); layout->addWidget(cb, current_row, 1, 1, 3); @@ -591,11 +589,10 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio { QDoubleSpinBox* sb = new QDoubleSpinBox(widget_parent); sb->setObjectName(QString::fromUtf8(si.name)); - sb->setMinimum(si.FloatMinValue()); - sb->setMaximum(si.FloatMaxValue()); - sb->setSingleStep(si.FloatStepValue()); -#if 0 - // We can't use this until we handle multiplier. + sb->setMinimum(si.FloatMinValue() * si.multiplier); + sb->setMaximum(si.FloatMaxValue() * si.multiplier); + sb->setSingleStep(si.FloatStepValue() * si.multiplier); + if (si.format) { const auto [prefix, suffix, decimals] = getPrefixAndSuffixForFloatFormat(QString::fromUtf8(si.format)); @@ -604,8 +601,9 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio sb->setDecimals(decimals); sb->setSuffix(suffix); } -#endif - SettingWidgetBinder::BindWidgetToFloatSetting(sif, sb, m_config_section, std::move(key_name), si.FloatDefaultValue()); + + ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat( + sif, sb, m_config_section, std::move(key_name), si.FloatDefaultValue(), si.multiplier); layout->addWidget(new QLabel(qApp->translate(translation_ctx, si.display_name), widget_parent), current_row, 0); layout->addWidget(sb, current_row, 1, 1, 3); current_row++; @@ -616,7 +614,8 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio { QLineEdit* le = new QLineEdit(widget_parent); le->setObjectName(QString::fromUtf8(si.name)); - SettingWidgetBinder::BindWidgetToStringSetting(sif, le, m_config_section, std::move(key_name), si.StringDefaultValue()); + ControllerSettingWidgetBinder::BindWidgetToInputProfileString( + sif, le, m_config_section, std::move(key_name), si.StringDefaultValue()); layout->addWidget(new QLabel(qApp->translate(translation_ctx, si.display_name), widget_parent), current_row, 0); layout->addWidget(le, current_row, 1, 1, 3); current_row++; @@ -638,7 +637,8 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio for (u32 i = 0; si.options[i] != nullptr; i++) cb->addItem(qApp->translate(translation_ctx, si.options[i]), QString::fromUtf8(si.options[i])); } - SettingWidgetBinder::BindWidgetToStringSetting(sif, cb, m_config_section, std::move(key_name), si.StringDefaultValue()); + ControllerSettingWidgetBinder::BindWidgetToInputProfileString( + sif, cb, m_config_section, std::move(key_name), si.StringDefaultValue()); layout->addWidget(new QLabel(qApp->translate(translation_ctx, si.display_name), widget_parent), current_row, 0); layout->addWidget(cb, current_row, 1, 1, 3); current_row++; @@ -650,7 +650,8 @@ void ControllerCustomSettingsWidget::createSettingWidgets(const char* translatio QLineEdit* le = new QLineEdit(widget_parent); le->setObjectName(QString::fromUtf8(si.name)); QPushButton* browse_button = new QPushButton(tr("Browse..."), widget_parent); - SettingWidgetBinder::BindWidgetToStringSetting(sif, le, m_config_section, std::move(key_name), si.StringDefaultValue()); + ControllerSettingWidgetBinder::BindWidgetToInputProfileString( + sif, le, m_config_section, std::move(key_name), si.StringDefaultValue()); connect(browse_button, &QPushButton::clicked, [this, le]() { const QString path(QDir::toNativeSeparators(QFileDialog::getOpenFileName(this, tr("Select File")))); if (!path.isEmpty()) @@ -722,7 +723,7 @@ void ControllerCustomSettingsWidget::restoreDefaults() { QDoubleSpinBox* widget = findChild(QString::fromStdString(si.name)); if (widget) - widget->setValue(si.FloatDefaultValue()); + widget->setValue(si.FloatDefaultValue() * si.multiplier); } break; diff --git a/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h b/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h index 02e7e78c24..32aed5ceb3 100644 --- a/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h +++ b/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h @@ -38,7 +38,8 @@ namespace ControllerSettingWidgetBinder { /// Interface specific method of BindWidgetToBoolSetting(). template - static void BindWidgetToInputProfileBool(SettingsInterface* sif, WidgetType* widget, std::string section, std::string key, bool default_value) + static void BindWidgetToInputProfileBool( + SettingsInterface* sif, WidgetType* widget, std::string section, std::string key, bool default_value) { using Accessor = SettingWidgetBinder::SettingAccessor; @@ -68,19 +69,53 @@ namespace ControllerSettingWidgetBinder } } + /// Interface specific method of BindWidgetToIntSetting(). + template + static void BindWidgetToInputProfileInt( + SettingsInterface* sif, WidgetType* widget, std::string section, std::string key, s32 default_value, s32 option_offset = 0) + { + using Accessor = SettingWidgetBinder::SettingAccessor; + + if (sif) + { + const s32 value = sif->GetIntValue(section.c_str(), key.c_str(), default_value); + Accessor::setIntValue(widget, value - option_offset); + + Accessor::connectValueChanged(widget, [sif, widget, section = std::move(section), key = std::move(key), option_offset]() { + const float new_value = Accessor::getIntValue(widget); + sif->SetIntValue(section.c_str(), key.c_str(), new_value + option_offset); + sif->Save(); + g_emu_thread->reloadGameSettings(); + }); + } + else + { + const s32 value = Host::GetBaseIntSettingValue(section.c_str(), key.c_str(), default_value); + Accessor::setIntValue(widget, value - option_offset); + + Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), option_offset]() { + const s32 new_value = Accessor::getIntValue(widget); + Host::SetBaseIntSettingValue(section.c_str(), key.c_str(), new_value + option_offset); + Host::CommitBaseSettingChanges(); + g_emu_thread->applySettings(); + }); + } + } + /// Interface specific method of BindWidgetToFloatSetting(). template - static void BindWidgetToInputProfileFloat(SettingsInterface* sif, WidgetType* widget, std::string section, std::string key, float default_value) + static void BindWidgetToInputProfileFloat( + SettingsInterface* sif, WidgetType* widget, std::string section, std::string key, float default_value, float multiplier = 1.0f) { using Accessor = SettingWidgetBinder::SettingAccessor; if (sif) { const float value = sif->GetFloatValue(section.c_str(), key.c_str(), default_value); - Accessor::setFloatValue(widget, value); + Accessor::setFloatValue(widget, value * multiplier); - Accessor::connectValueChanged(widget, [sif, widget, section = std::move(section), key = std::move(key)]() { - const float new_value = Accessor::getFloatValue(widget); + Accessor::connectValueChanged(widget, [sif, widget, section = std::move(section), key = std::move(key), multiplier]() { + const float new_value = Accessor::getFloatValue(widget) / multiplier; sif->SetFloatValue(section.c_str(), key.c_str(), new_value); sif->Save(); g_emu_thread->reloadGameSettings(); @@ -89,10 +124,10 @@ namespace ControllerSettingWidgetBinder else { const float value = Host::GetBaseFloatSettingValue(section.c_str(), key.c_str(), default_value); - Accessor::setFloatValue(widget, value); + Accessor::setFloatValue(widget, value * multiplier); - Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { - const float new_value = Accessor::getFloatValue(widget); + Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), multiplier]() { + const float new_value = Accessor::getFloatValue(widget) / multiplier; Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); @@ -160,7 +195,8 @@ namespace ControllerSettingWidgetBinder } else { - const QString value(QString::fromStdString(Host::GetBaseStringSettingValue(section.c_str(), key.c_str(), default_value.c_str()))); + const QString value( + QString::fromStdString(Host::GetBaseStringSettingValue(section.c_str(), key.c_str(), default_value.c_str()))); Accessor::setStringValue(widget, value); diff --git a/pcsx2/PAD/Host/PAD.cpp b/pcsx2/PAD/Host/PAD.cpp index 79e56813c6..6300ee4722 100644 --- a/pcsx2/PAD/Host/PAD.cpp +++ b/pcsx2/PAD/Host/PAD.cpp @@ -412,7 +412,7 @@ static const SettingInfo s_dualshock2_settings[] = { "Sets the analog stick deadzone, i.e. the fraction of the stick movement which will be ignored.", "0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, nullptr, 100.0f}, {SettingInfo::Type::Float, "AxisScale", "Analog Sensitivity", - "Sets the analog stick axis scaling factor. A value between 1.30 and 1.40 is recommended when using recent " + "Sets the analog stick axis scaling factor. A value between 130% and 140% is recommended when using recent " "controllers, e.g. DualShock 4, Xbox One Controller.", "1.33", "0.01", "2.00", "0.01", "%.0f%%", nullptr, nullptr, 100.0f}, {SettingInfo::Type::Float, "LargeMotorScale", "Large Motor Vibration Scale",