diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 94789c0641..db1e5ecfa0 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "common/assert.h" #include "common/param_package.h" #include "input_common/main.h" #include "yuzu/configuration/config.h" @@ -215,6 +216,24 @@ ConfigureInput::ConfigureInput(QWidget* parent) } }); + buttons_delta = { + ui->checkboxA, ui->checkboxB, ui->checkboxX, + ui->checkboxY, ui->checkboxLStickMod, ui->checkboxRStickMod, + ui->checkboxL, ui->checkboxR, ui->checkboxZL, + ui->checkboxZR, ui->checkboxPlus, ui->checkboxMinus, + ui->checkboxDpadLeft, ui->checkboxDpadUp, ui->checkboxDpadRight, + ui->checkboxDpadDown, ui->checkboxLStickLeft, ui->checkboxLStickUp, + ui->checkboxLStickRight, ui->checkboxLStickDown, ui->checkboxRStickLeft, + ui->checkboxRStickUp, ui->checkboxRStickRight, ui->checkboxRStickDown, + ui->checkboxSL, ui->checkboxSR, ui->checkboxHome, + ui->checkboxScreenshot, + }; + + analogs_delta = { + ui->checkboxLStickPressed, + ui->checkboxRStickPressed, + }; + this->loadConfiguration(); // TODO(wwylele): enable this when we actually emulate it @@ -222,17 +241,52 @@ ConfigureInput::ConfigureInput(QWidget* parent) } void ConfigureInput::applyConfiguration() { - std::transform(buttons_param.begin(), buttons_param.end(), Settings::values.buttons.begin(), + Settings::PerGameValues temp{}; + + std::transform(buttons_param.begin(), buttons_param.end(), temp.buttons.begin(), [](const Common::ParamPackage& param) { return param.Serialize(); }); - std::transform(analogs_param.begin(), analogs_param.end(), Settings::values.analogs.begin(), + std::transform(analogs_param.begin(), analogs_param.end(), temp.analogs.begin(), [](const Common::ParamPackage& param) { return param.Serialize(); }); + + if (std::any_of(buttons_delta.begin(), buttons_delta.end(), + [](const QCheckBox* box) { return box->isHidden(); })) { + Settings::values->buttons = temp.buttons; + Settings::values->analogs = temp.analogs; + return; + } + + PerGameValuesChange changes{}; + + std::transform(buttons_delta.begin(), buttons_delta.end(), changes.buttons.begin(), + [](const QCheckBox* box) { return box->isChecked(); }); + std::transform(analogs_delta.begin(), analogs_delta.end(), changes.analogs.begin(), + [](const QCheckBox* box) { return box->isChecked(); }); + + temp = ApplyValuesDelta(*Settings::values, temp, changes); + Settings::values->buttons = temp.buttons; + Settings::values->analogs = temp.analogs; +} + +void ConfigureInput::setPerGame(bool show) { + for (const auto button : buttons_delta) + button->setHidden(!show); + for (const auto analog : analogs_delta) + analog->setHidden(!show); + ui->override_label->setHidden(!show); +} + +void ConfigureInput::mergeValuesChange(PerGameValuesChange& changes) { + std::transform(buttons_delta.begin(), buttons_delta.end(), changes.buttons.begin(), + [](const QCheckBox* box) { return box->isChecked(); }); + std::transform(analogs_delta.begin(), analogs_delta.end(), changes.analogs.begin(), + [](const QCheckBox* box) { return box->isChecked(); }); } void ConfigureInput::loadConfiguration() { - std::transform(Settings::values.buttons.begin(), Settings::values.buttons.end(), + std::transform(Settings::values->buttons.begin(), Settings::values->buttons.end(), buttons_param.begin(), [](const std::string& str) { return Common::ParamPackage(str); }); - std::transform(Settings::values.analogs.begin(), Settings::values.analogs.end(), + std::transform(Settings::values->analogs.begin(), Settings::values->analogs.end(), analogs_param.begin(), [](const std::string& str) { return Common::ParamPackage(str); }); updateButtonLabels(); @@ -285,12 +339,28 @@ void ConfigureInput::updateButtonLabels() { } } +void ConfigureInput::loadValuesChange(const PerGameValuesChange& change) { + for (std::size_t i = 0; i < Settings::NativeButton::NumButtons; ++i) + buttons_delta[i]->setChecked(change.buttons[i]); + + for (std::size_t i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) + analogs_delta[i]->setChecked(change.analogs[i]); +} + void ConfigureInput::handleClick(QPushButton* button, std::function new_input_setter, InputCommon::Polling::DeviceType type) { button->setText(tr("[press key]")); button->setFocus(); + const auto iter = std::find(button_map.begin(), button_map.end(), button); + ASSERT(iter != button_map.end()); + const auto index = std::distance(button_map.begin(), iter); + ASSERT(index < Settings::NativeButton::NumButtons && index >= 0); + const auto checkbox = buttons_delta[index]; + if (!checkbox->isHidden()) + checkbox->setChecked(true); + input_setter = new_input_setter; device_pollers = InputCommon::Polling::GetPollers(type); diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h index d1198db811..0b5a763fdd 100644 --- a/src/yuzu/configuration/configure_input.h +++ b/src/yuzu/configuration/configure_input.h @@ -16,6 +16,7 @@ #include "core/settings.h" #include "input_common/main.h" #include "ui_configure_input.h" +#include "yuzu/configuration/config.h" class QPushButton; class QString; @@ -34,6 +35,10 @@ public: /// Save all button configurations to settings file void applyConfiguration(); + void setPerGame(bool per_game); + void loadValuesChange(const PerGameValuesChange& change); + void mergeValuesChange(PerGameValuesChange& change); + private: std::unique_ptr ui; @@ -46,6 +51,9 @@ private: std::array buttons_param; std::array analogs_param; + std::array buttons_delta; + std::array analogs_delta; + static constexpr int ANALOG_SUB_BUTTONS_NUM = 5; /// Each button input is represented by a QPushButton. diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui index 8a019a6939..4c62a422e2 100644 --- a/src/yuzu/configuration/configure_input.ui +++ b/src/yuzu/configuration/configure_input.ui @@ -31,11 +31,31 @@ - - - Minus: - - + + + + + Minus: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -49,11 +69,31 @@ - - - Plus: - - + + + + + Plus: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -67,11 +107,31 @@ - - - Home: - - + + + + + Home: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -82,25 +142,6 @@ - - - - - - Screen -Capture: - - - - - - - - - - - - @@ -114,6 +155,47 @@ Capture: + + + + + + + + Screen Capture: + + + true + + + + + + + + 0 + 0 + + + + + + + true + + + + + + + + + + + + + + @@ -132,11 +214,31 @@ Capture: - - - A: - - + + + + + A: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -150,11 +252,31 @@ Capture: - - - B: - - + + + + + B: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -168,11 +290,31 @@ Capture: - - - X: - - + + + + + X: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -186,11 +328,31 @@ Capture: - - - Y: - - + + + + + Y: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -219,11 +381,31 @@ Capture: - - - Up: - - + + + + + Up: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -237,11 +419,31 @@ Capture: - - - Down: - - + + + + + Down: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -255,11 +457,31 @@ Capture: - - - Left: - - + + + + + Left: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -273,11 +495,31 @@ Capture: - - - Right: - - + + + + + Right: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -306,11 +548,31 @@ Capture: - - - L: - - + + + + + L: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -324,11 +586,31 @@ Capture: - - - R: - - + + + + + R: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -342,11 +624,31 @@ Capture: - - - ZL: - - + + + + + ZL: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -360,11 +662,31 @@ Capture: - - - ZR: - - + + + + + ZR: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -378,11 +700,31 @@ Capture: - - - SL: - - + + + + + SL: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -396,11 +738,31 @@ Capture: - - - SR: - - + + + + + SR: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -432,11 +794,31 @@ Capture: - - - Down: - - + + + + + Down: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -450,11 +832,31 @@ Capture: - - - Right: - - + + + + + Right: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -475,11 +877,31 @@ Capture: - - - Left: - - + + + + + Left: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -493,11 +915,31 @@ Capture: - - - Up: - - + + + + + Up: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -511,11 +953,31 @@ Capture: - - - Pressed: - - + + + + + Pressed: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -529,11 +991,31 @@ Capture: - - - Modifier: - - + + + + + Modifier: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -562,11 +1044,31 @@ Capture: - - - Down: - - + + + + + Down: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -587,11 +1089,31 @@ Capture: - - - Right: - - + + + + + Right: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -605,11 +1127,31 @@ Capture: - - - Left: - - + + + + + Left: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -623,11 +1165,31 @@ Capture: - - - Up: - - + + + + + Up: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -641,11 +1203,31 @@ Capture: - - - Modifier: - - + + + + + Modifier: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -659,11 +1241,31 @@ Capture: - - - Pressed: - - + + + + + Pressed: + + + + + + + + 0 + 0 + + + + + + + true + + + + @@ -679,6 +1281,22 @@ Capture: + + + + + 0 + 0 + + + + Check the box to override the global default key with this one for this game only. + + + true + + +