From 63c86f24177e779b859eb897d6968df69a2ab276 Mon Sep 17 00:00:00 2001 From: Tobias <thm.frey@gmail.com> Date: Wed, 13 May 2020 18:26:05 +0200 Subject: [PATCH] Port yuzu-emu/yuzu#3268: "GUI: Deadzone controls for sdl engine at configuration input" (#5174) * GUI: Deadzone controls for sdl engine at configuration input Co-Authored-By: CJ Bok <cjbok@users.noreply.github.com> * configure_input: Use slider to edit modifier scale Co-Authored-By: Kewlan <kewlan@users.noreply.github.com> * Address minor review comment Co-Authored-By: Kewlan <kewlan@users.noreply.github.com> Co-authored-by: CJ Bok <cjbok@users.noreply.github.com> Co-authored-by: Kewlan <kewlan@users.noreply.github.com> --- .../configuration/configure_input.cpp | 51 +- src/citra_qt/configuration/configure_input.h | 5 + src/citra_qt/configuration/configure_input.ui | 608 ++++++++++-------- 3 files changed, 382 insertions(+), 282 deletions(-) diff --git a/src/citra_qt/configuration/configure_input.cpp b/src/citra_qt/configuration/configure_input.cpp index 2f7e70c77..657f404f1 100644 --- a/src/citra_qt/configuration/configure_input.cpp +++ b/src/citra_qt/configuration/configure_input.cpp @@ -43,7 +43,6 @@ static void SetAnalogButton(const Common::ParamPackage& input_param, if (analog_param.Get("engine", "") != "analog_from_button") { analog_param = { {"engine", "analog_from_button"}, - {"modifier_scale", "0.5"}, }; } analog_param.Set(button_name, input_param.Serialize()); @@ -155,6 +154,10 @@ ConfigureInput::ConfigureInput(QWidget* parent) }}; analog_map_stick = {ui->buttonCircleAnalog, ui->buttonCStickAnalog}; + analog_map_deadzone_and_modifier_slider = {ui->sliderCirclePadDeadzoneAndModifier, + ui->sliderCStickDeadzoneAndModifier}; + analog_map_deadzone_and_modifier_slider_label = {ui->labelCirclePadDeadzoneAndModifier, + ui->labelCStickDeadzoneAndModifier}; for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { if (!button_map[button_id]) @@ -245,6 +248,18 @@ ConfigureInput::ConfigureInput(QWidget* parent) InputCommon::Polling::DeviceType::Analog); } }); + connect(analog_map_deadzone_and_modifier_slider[analog_id], &QSlider::valueChanged, [=] { + const float slider_value = analog_map_deadzone_and_modifier_slider[analog_id]->value(); + if (analogs_param[analog_id].Get("engine", "") == "sdl") { + analog_map_deadzone_and_modifier_slider_label[analog_id]->setText( + tr("Deadzone: %1%").arg(slider_value)); + analogs_param[analog_id].Set("deadzone", slider_value / 100.0f); + } else { + analog_map_deadzone_and_modifier_slider_label[analog_id]->setText( + tr("Modifier Scale: %1%").arg(slider_value)); + analogs_param[analog_id].Set("modifier_scale", slider_value / 100.0f); + } + }); } connect(ui->buttonMotionTouch, &QPushButton::clicked, [this] { @@ -360,11 +375,7 @@ void ConfigureInput::ClearAll() { buttons_param[button_id].Clear(); } for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { - for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { - if (analog_map_buttons[analog_id][sub_button_id] && - analog_map_buttons[analog_id][sub_button_id]->isEnabled()) - analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]); - } + analogs_param[analog_id].Clear(); } UpdateButtonLabels(); } @@ -383,6 +394,34 @@ void ConfigureInput::UpdateButtonLabels() { } } analog_map_stick[analog_id]->setText(tr("Set Analog Stick")); + + auto& param = analogs_param[analog_id]; + auto* const analog_stick_slider = analog_map_deadzone_and_modifier_slider[analog_id]; + auto* const analog_stick_slider_label = + analog_map_deadzone_and_modifier_slider_label[analog_id]; + + if (param.Has("engine")) { + if (param.Get("engine", "") == "sdl") { + if (!param.Has("deadzone")) { + param.Set("deadzone", 0.1f); + } + + analog_stick_slider->setValue(static_cast<int>(param.Get("deadzone", 0.1f) * 100)); + if (analog_stick_slider->value() == 0) { + analog_stick_slider_label->setText(tr("Deadzone: 0%")); + } + } else { + if (!param.Has("modifier_scale")) { + param.Set("modifier_scale", 0.5f); + } + + analog_stick_slider->setValue( + static_cast<int>(param.Get("modifier_scale", 0.5f) * 100)); + if (analog_stick_slider->value() == 0) { + analog_stick_slider_label->setText(tr("Modifier Scale: 0%")); + } + } + } } EmitInputKeysChanged(); diff --git a/src/citra_qt/configuration/configure_input.h b/src/citra_qt/configuration/configure_input.h index 2421b3291..1fd87245c 100644 --- a/src/citra_qt/configuration/configure_input.h +++ b/src/citra_qt/configuration/configure_input.h @@ -12,6 +12,7 @@ #include <unordered_map> #include <QKeyEvent> #include <QKeySequence> +#include <QSlider> #include <QWidget> #include "common/param_package.h" #include "core/settings.h" @@ -74,6 +75,10 @@ private: /// Analog inputs are also represented each with a single button, used to configure with an /// actual analog stick std::array<QPushButton*, Settings::NativeAnalog::NumAnalogs> analog_map_stick; + std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> + analog_map_deadzone_and_modifier_slider; + std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> + analog_map_deadzone_and_modifier_slider_label; static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons; diff --git a/src/citra_qt/configuration/configure_input.ui b/src/citra_qt/configuration/configure_input.ui index 6d0cb8ac7..3a76730ad 100644 --- a/src/citra_qt/configuration/configure_input.ui +++ b/src/citra_qt/configuration/configure_input.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>374</width> - <height>595</height> + <height>670</height> </rect> </property> <property name="windowTitle"> @@ -238,281 +238,6 @@ </layout> </widget> </item> - <item row="1" column="0"> - <widget class="QGroupBox" name="faceButtons_3"> - <property name="title"> - <string>Shoulder Buttons</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - <property name="checkable"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_13"> - <item> - <widget class="QLabel" name="label_17"> - <property name="text"> - <string>L:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonL"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_14"> - <item> - <widget class="QLabel" name="label_19"> - <property name="text"> - <string>R:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonR"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_15"> - <item> - <widget class="QLabel" name="label_20"> - <property name="text"> - <string>ZL:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonZL"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_16"> - <item> - <widget class="QLabel" name="label_18"> - <property name="text"> - <string>ZR:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonZR"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item row="1" column="1"> - <widget class="QGroupBox" name="faceButtons_4"> - <property name="title"> - <string>Circle Pad</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - <property name="checkable"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="1" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_19"> - <item> - <widget class="QLabel" name="label_24"> - <property name="text"> - <string>Up:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCircleUp"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="2"> - <layout class="QVBoxLayout" name="verticalLayout_20"> - <item> - <widget class="QLabel" name="label_22"> - <property name="text"> - <string>Down:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCircleDown"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="2"> - <layout class="QVBoxLayout" name="verticalLayout_18"> - <item> - <widget class="QLabel" name="label_23"> - <property name="text"> - <string>Right:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCircleRight"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="2" column="1" colspan="2"> - <widget class="QPushButton" name="buttonCircleAnalog"> - <property name="text"> - <string>Set Analog Stick</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_17"> - <item> - <widget class="QLabel" name="label_21"> - <property name="text"> - <string>Left:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCircleLeft"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item row="2" column="0"> - <widget class="QGroupBox" name="faceButtons_5"> - <property name="title"> - <string>C-Stick</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - <property name="checkable"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_21"> - <item> - <widget class="QLabel" name="label_25"> - <property name="text"> - <string>Left:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCStickLeft"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_22"> - <item> - <widget class="QLabel" name="label_27"> - <property name="text"> - <string>Right:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCStickRight"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_23"> - <item> - <widget class="QLabel" name="label_28"> - <property name="text"> - <string>Up:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCStickUp"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_24"> - <item> - <widget class="QLabel" name="label_26"> - <property name="text"> - <string>Down:</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCStickDown"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item row="2" column="0" colspan="2"> - <widget class="QPushButton" name="buttonCStickAnalog"> - <property name="text"> - <string>Set Analog Stick</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> <item row="2" column="1"> <widget class="QGroupBox" name="faceButtons_6"> <property name="title"> @@ -636,6 +361,337 @@ </layout> </widget> </item> + <item row="1" column="0"> + <widget class="QGroupBox" name="faceButtons_4"> + <property name="title"> + <string>Circle Pad</string> + </property> + <property name="flat"> + <bool>false</bool> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="1" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_19"> + <item> + <widget class="QLabel" name="label_24"> + <property name="text"> + <string>Up:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCircleUp"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="2"> + <layout class="QVBoxLayout" name="verticalLayout_18"> + <item> + <widget class="QLabel" name="label_23"> + <property name="text"> + <string>Right:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCircleRight"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_17"> + <item> + <widget class="QLabel" name="label_21"> + <property name="text"> + <string>Left:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCircleLeft"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="1" colspan="2"> + <widget class="QPushButton" name="buttonCircleAnalog"> + <property name="text"> + <string>Set Analog Stick</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <layout class="QVBoxLayout" name="verticalLayout_20"> + <item> + <widget class="QLabel" name="label_22"> + <property name="text"> + <string>Down:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCircleDown"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="1" colspan="2"> + <layout class="QVBoxLayout" name="sliderCirclePadDeadzoneAndModifierVerticalLayout"> + <item> + <layout class="QHBoxLayout" name="sliderCirclePadDeadzoneAndModifierHorizontalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="QLabel" name="labelCirclePadDeadzoneAndModifier"> + <property name="text"> + <string>Deadzone: 0</string> + </property> + <property name="alignment"> + <set>Qt::AlignHCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QSlider" name="sliderCirclePadDeadzoneAndModifier"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="1" column="1"> + <widget class="QGroupBox" name="faceButtons_5"> + <property name="title"> + <string>C-Stick</string> + </property> + <property name="flat"> + <bool>false</bool> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_22"> + <item> + <widget class="QLabel" name="label_27"> + <property name="text"> + <string>Right:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCStickRight"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_21"> + <item> + <widget class="QLabel" name="label_25"> + <property name="text"> + <string>Left:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCStickLeft"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_23"> + <item> + <widget class="QLabel" name="label_28"> + <property name="text"> + <string>Up:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCStickUp"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QPushButton" name="buttonCStickAnalog"> + <property name="text"> + <string>Set Analog Stick</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_24"> + <item> + <widget class="QLabel" name="label_26"> + <property name="text"> + <string>Down:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonCStickDown"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="0" colspan="2"> + <layout class="QVBoxLayout" name="sliderCStickDeadzoneAndModifierVerticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <layout class="QHBoxLayout" name="sliderCStickDeadzoneAndModifierHorizontalLayout"> + <item> + <widget class="QLabel" name="labelCStickDeadzoneAndModifier"> + <property name="text"> + <string>Deadzone: 0</string> + </property> + <property name="alignment"> + <set>Qt::AlignHCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QSlider" name="sliderCStickDeadzoneAndModifier"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="2" column="0"> + <widget class="QGroupBox" name="faceButtons_3"> + <property name="title"> + <string>Shoulder Buttons</string> + </property> + <property name="flat"> + <bool>false</bool> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="1" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_16"> + <item> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>ZR:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonZR"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_15"> + <item> + <widget class="QLabel" name="label_20"> + <property name="text"> + <string>ZL:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonZL"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_13"> + <item> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>L:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonL"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_14"> + <item> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string>R:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonR"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> </layout> </item> <item>