summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/param_package.cpp18
-rw-r--r--src/common/param_package.h2
-rw-r--r--src/yuzu/configuration/configure_input.cpp87
-rw-r--r--src/yuzu/configuration/configure_input.h3
-rw-r--r--src/yuzu/configuration/configure_input.ui28
5 files changed, 119 insertions, 19 deletions
diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp
index 9526ca0c6..b916b4866 100644
--- a/src/common/param_package.cpp
+++ b/src/common/param_package.cpp
@@ -20,7 +20,15 @@ constexpr char KEY_VALUE_SEPARATOR_ESCAPE[] = "$0";
20constexpr char PARAM_SEPARATOR_ESCAPE[] = "$1"; 20constexpr char PARAM_SEPARATOR_ESCAPE[] = "$1";
21constexpr char ESCAPE_CHARACTER_ESCAPE[] = "$2"; 21constexpr char ESCAPE_CHARACTER_ESCAPE[] = "$2";
22 22
23/// A placeholder for empty param packages to avoid empty strings
24/// (they may be recognized as "not set" by some frontend libraries like qt)
25constexpr char EMPTY_PLACEHOLDER[] = "[empty]";
26
23ParamPackage::ParamPackage(const std::string& serialized) { 27ParamPackage::ParamPackage(const std::string& serialized) {
28 if (serialized == EMPTY_PLACEHOLDER) {
29 return;
30 }
31
24 std::vector<std::string> pairs; 32 std::vector<std::string> pairs;
25 Common::SplitString(serialized, PARAM_SEPARATOR, pairs); 33 Common::SplitString(serialized, PARAM_SEPARATOR, pairs);
26 34
@@ -46,7 +54,7 @@ ParamPackage::ParamPackage(std::initializer_list<DataType::value_type> list) : d
46 54
47std::string ParamPackage::Serialize() const { 55std::string ParamPackage::Serialize() const {
48 if (data.empty()) 56 if (data.empty())
49 return ""; 57 return EMPTY_PLACEHOLDER;
50 58
51 std::string result; 59 std::string result;
52 60
@@ -120,4 +128,12 @@ bool ParamPackage::Has(const std::string& key) const {
120 return data.find(key) != data.end(); 128 return data.find(key) != data.end();
121} 129}
122 130
131void ParamPackage::Erase(const std::string& key) {
132 data.erase(key);
133}
134
135void ParamPackage::Clear() {
136 data.clear();
137}
138
123} // namespace Common 139} // namespace Common
diff --git a/src/common/param_package.h b/src/common/param_package.h
index 7842cd4ef..6a0a9b656 100644
--- a/src/common/param_package.h
+++ b/src/common/param_package.h
@@ -32,6 +32,8 @@ public:
32 void Set(const std::string& key, int value); 32 void Set(const std::string& key, int value);
33 void Set(const std::string& key, float value); 33 void Set(const std::string& key, float value);
34 bool Has(const std::string& key) const; 34 bool Has(const std::string& key) const;
35 void Erase(const std::string& key);
36 void Clear();
35 37
36private: 38private:
37 DataType data; 39 DataType data;
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp
index 473937ea9..94789c064 100644
--- a/src/yuzu/configuration/configure_input.cpp
+++ b/src/yuzu/configuration/configure_input.cpp
@@ -5,6 +5,7 @@
5#include <algorithm> 5#include <algorithm>
6#include <memory> 6#include <memory>
7#include <utility> 7#include <utility>
8#include <QMenu>
8#include <QMessageBox> 9#include <QMessageBox>
9#include <QTimer> 10#include <QTimer>
10#include "common/param_package.h" 11#include "common/param_package.h"
@@ -128,28 +129,63 @@ ConfigureInput::ConfigureInput(QWidget* parent)
128 analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog}; 129 analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog};
129 130
130 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { 131 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) {
131 if (button_map[button_id]) 132 if (!button_map[button_id])
132 connect(button_map[button_id], &QPushButton::released, [=]() { 133 continue;
133 handleClick( 134 button_map[button_id]->setContextMenuPolicy(Qt::CustomContextMenu);
134 button_map[button_id], 135 connect(button_map[button_id], &QPushButton::released, [=]() {
135 [=](const Common::ParamPackage& params) { buttons_param[button_id] = params; }, 136 handleClick(
136 InputCommon::Polling::DeviceType::Button); 137 button_map[button_id],
137 }); 138 [=](const Common::ParamPackage& params) { buttons_param[button_id] = params; },
139 InputCommon::Polling::DeviceType::Button);
140 });
141 connect(button_map[button_id], &QPushButton::customContextMenuRequested,
142 [=](const QPoint& menu_location) {
143 QMenu context_menu;
144 context_menu.addAction(tr("Clear"), [&] {
145 buttons_param[button_id].Clear();
146 button_map[button_id]->setText(tr("[not set]"));
147 });
148 context_menu.addAction(tr("Restore Default"), [&] {
149 buttons_param[button_id] = Common::ParamPackage{
150 InputCommon::GenerateKeyboardParam(Config::default_buttons[button_id])};
151 button_map[button_id]->setText(ButtonToText(buttons_param[button_id]));
152 });
153 context_menu.exec(button_map[button_id]->mapToGlobal(menu_location));
154 });
138 } 155 }
139 156
140 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { 157 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) {
141 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { 158 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) {
142 if (analog_map_buttons[analog_id][sub_button_id] != nullptr) { 159 if (!analog_map_buttons[analog_id][sub_button_id])
143 connect(analog_map_buttons[analog_id][sub_button_id], &QPushButton::released, 160 continue;
144 [=]() { 161 analog_map_buttons[analog_id][sub_button_id]->setContextMenuPolicy(
145 handleClick(analog_map_buttons[analog_id][sub_button_id], 162 Qt::CustomContextMenu);
146 [=](const Common::ParamPackage& params) { 163 connect(analog_map_buttons[analog_id][sub_button_id], &QPushButton::released, [=]() {
147 SetAnalogButton(params, analogs_param[analog_id], 164 handleClick(analog_map_buttons[analog_id][sub_button_id],
148 analog_sub_buttons[sub_button_id]); 165 [=](const Common::ParamPackage& params) {
149 }, 166 SetAnalogButton(params, analogs_param[analog_id],
150 InputCommon::Polling::DeviceType::Button); 167 analog_sub_buttons[sub_button_id]);
168 },
169 InputCommon::Polling::DeviceType::Button);
170 });
171 connect(analog_map_buttons[analog_id][sub_button_id],
172 &QPushButton::customContextMenuRequested, [=](const QPoint& menu_location) {
173 QMenu context_menu;
174 context_menu.addAction(tr("Clear"), [&] {
175 analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]);
176 analog_map_buttons[analog_id][sub_button_id]->setText(tr("[not set]"));
151 }); 177 });
152 } 178 context_menu.addAction(tr("Restore Default"), [&] {
179 Common::ParamPackage params{InputCommon::GenerateKeyboardParam(
180 Config::default_analogs[analog_id][sub_button_id])};
181 SetAnalogButton(params, analogs_param[analog_id],
182 analog_sub_buttons[sub_button_id]);
183 analog_map_buttons[analog_id][sub_button_id]->setText(AnalogToText(
184 analogs_param[analog_id], analog_sub_buttons[sub_button_id]));
185 });
186 context_menu.exec(analog_map_buttons[analog_id][sub_button_id]->mapToGlobal(
187 menu_location));
188 });
153 } 189 }
154 connect(analog_map_stick[analog_id], &QPushButton::released, [=]() { 190 connect(analog_map_stick[analog_id], &QPushButton::released, [=]() {
155 QMessageBox::information(this, tr("Information"), 191 QMessageBox::information(this, tr("Information"),
@@ -162,6 +198,7 @@ ConfigureInput::ConfigureInput(QWidget* parent)
162 }); 198 });
163 } 199 }
164 200
201 connect(ui->buttonClearAll, &QPushButton::released, [this] { ClearAll(); });
165 connect(ui->buttonRestoreDefaults, &QPushButton::released, [this]() { restoreDefaults(); }); 202 connect(ui->buttonRestoreDefaults, &QPushButton::released, [this]() { restoreDefaults(); });
166 203
167 timeout_timer->setSingleShot(true); 204 timeout_timer->setSingleShot(true);
@@ -215,7 +252,21 @@ void ConfigureInput::restoreDefaults() {
215 } 252 }
216 } 253 }
217 updateButtonLabels(); 254 updateButtonLabels();
218 applyConfiguration(); 255}
256
257void ConfigureInput::ClearAll() {
258 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) {
259 if (button_map[button_id] && button_map[button_id]->isEnabled())
260 buttons_param[button_id].Clear();
261 }
262 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) {
263 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) {
264 if (analog_map_buttons[analog_id][sub_button_id] &&
265 analog_map_buttons[analog_id][sub_button_id]->isEnabled())
266 analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]);
267 }
268 }
269 updateButtonLabels();
219} 270}
220 271
221void ConfigureInput::updateButtonLabels() { 272void ConfigureInput::updateButtonLabels() {
diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h
index a0bef86d5..d1198db81 100644
--- a/src/yuzu/configuration/configure_input.h
+++ b/src/yuzu/configuration/configure_input.h
@@ -72,6 +72,9 @@ private:
72 void loadConfiguration(); 72 void loadConfiguration();
73 /// Restore all buttons to their default values. 73 /// Restore all buttons to their default values.
74 void restoreDefaults(); 74 void restoreDefaults();
75 /// Clear all input configuration
76 void ClearAll();
77
75 /// Update UI to reflect current configuration. 78 /// Update UI to reflect current configuration.
76 void updateButtonLabels(); 79 void updateButtonLabels();
77 80
diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui
index 8bfa5df62..8a019a693 100644
--- a/src/yuzu/configuration/configure_input.ui
+++ b/src/yuzu/configuration/configure_input.ui
@@ -695,6 +695,34 @@ Capture:</string>
695 </spacer> 695 </spacer>
696 </item> 696 </item>
697 <item> 697 <item>
698 <widget class="QPushButton" name="buttonClearAll">
699 <property name="sizePolicy">
700 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
701 <horstretch>0</horstretch>
702 <verstretch>0</verstretch>
703 </sizepolicy>
704 </property>
705 <property name="sizeIncrement">
706 <size>
707 <width>0</width>
708 <height>0</height>
709 </size>
710 </property>
711 <property name="baseSize">
712 <size>
713 <width>0</width>
714 <height>0</height>
715 </size>
716 </property>
717 <property name="layoutDirection">
718 <enum>Qt::LeftToRight</enum>
719 </property>
720 <property name="text">
721 <string>Clear All</string>
722 </property>
723 </widget>
724 </item>
725 <item>
698 <widget class="QPushButton" name="buttonRestoreDefaults"> 726 <widget class="QPushButton" name="buttonRestoreDefaults">
699 <property name="sizePolicy"> 727 <property name="sizePolicy">
700 <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> 728 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">