summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/configuration/configure_input.cpp406
-rw-r--r--src/yuzu/configuration/configure_input.h53
-rw-r--r--src/yuzu/configuration/configure_input.ui1064
3 files changed, 525 insertions, 998 deletions
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp
index 42a7beac6..9ae9827fe 100644
--- a/src/yuzu/configuration/configure_input.cpp
+++ b/src/yuzu/configuration/configure_input.cpp
@@ -9,334 +9,164 @@
9#include <QMessageBox> 9#include <QMessageBox>
10#include <QTimer> 10#include <QTimer>
11#include "common/param_package.h" 11#include "common/param_package.h"
12#include "configuration/configure_touchscreen_advanced.h"
13#include "core/core.h"
12#include "input_common/main.h" 14#include "input_common/main.h"
15#include "ui_configure_input.h"
16#include "ui_configure_input_player.h"
17#include "ui_configure_mouse_advanced.h"
18#include "ui_configure_touchscreen_advanced.h"
13#include "yuzu/configuration/config.h" 19#include "yuzu/configuration/config.h"
14#include "yuzu/configuration/configure_input.h" 20#include "yuzu/configuration/configure_input.h"
15 21#include "yuzu/configuration/configure_input_player.h"
16const std::array<std::string, ConfigureInput::ANALOG_SUB_BUTTONS_NUM> 22#include "yuzu/configuration/configure_mouse_advanced.h"
17 ConfigureInput::analog_sub_buttons{{
18 "up",
19 "down",
20 "left",
21 "right",
22 "modifier",
23 }};
24
25static QString getKeyName(int key_code) {
26 switch (key_code) {
27 case Qt::Key_Shift:
28 return QObject::tr("Shift");
29 case Qt::Key_Control:
30 return QObject::tr("Ctrl");
31 case Qt::Key_Alt:
32 return QObject::tr("Alt");
33 case Qt::Key_Meta:
34 return "";
35 default:
36 return QKeySequence(key_code).toString();
37 }
38}
39
40static void SetAnalogButton(const Common::ParamPackage& input_param,
41 Common::ParamPackage& analog_param, const std::string& button_name) {
42 if (analog_param.Get("engine", "") != "analog_from_button") {
43 analog_param = {
44 {"engine", "analog_from_button"},
45 {"modifier_scale", "0.5"},
46 };
47 }
48 analog_param.Set(button_name, input_param.Serialize());
49}
50
51static QString ButtonToText(const Common::ParamPackage& param) {
52 if (!param.Has("engine")) {
53 return QObject::tr("[not set]");
54 } else if (param.Get("engine", "") == "keyboard") {
55 return getKeyName(param.Get("code", 0));
56 } else if (param.Get("engine", "") == "sdl") {
57 if (param.Has("hat")) {
58 return QString(QObject::tr("Hat %1 %2"))
59 .arg(param.Get("hat", "").c_str(), param.Get("direction", "").c_str());
60 }
61 if (param.Has("axis")) {
62 return QString(QObject::tr("Axis %1%2"))
63 .arg(param.Get("axis", "").c_str(), param.Get("direction", "").c_str());
64 }
65 if (param.Has("button")) {
66 return QString(QObject::tr("Button %1")).arg(param.Get("button", "").c_str());
67 }
68 return QString();
69 } else {
70 return QObject::tr("[unknown]");
71 }
72};
73
74static QString AnalogToText(const Common::ParamPackage& param, const std::string& dir) {
75 if (!param.Has("engine")) {
76 return QObject::tr("[not set]");
77 } else if (param.Get("engine", "") == "analog_from_button") {
78 return ButtonToText(Common::ParamPackage{param.Get(dir, "")});
79 } else if (param.Get("engine", "") == "sdl") {
80 if (dir == "modifier") {
81 return QString(QObject::tr("[unused]"));
82 }
83
84 if (dir == "left" || dir == "right") {
85 return QString(QObject::tr("Axis %1")).arg(param.Get("axis_x", "").c_str());
86 } else if (dir == "up" || dir == "down") {
87 return QString(QObject::tr("Axis %1")).arg(param.Get("axis_y", "").c_str());
88 }
89 return QString();
90 } else {
91 return QObject::tr("[unknown]");
92 }
93};
94 23
95ConfigureInput::ConfigureInput(QWidget* parent) 24ConfigureInput::ConfigureInput(QWidget* parent)
96 : QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()), 25 : QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
97 timeout_timer(std::make_unique<QTimer>()), poll_timer(std::make_unique<QTimer>()) {
98
99 ui->setupUi(this); 26 ui->setupUi(this);
100 setFocusPolicy(Qt::ClickFocus);
101 27
102 button_map = { 28 players_enabled = {
103 ui->buttonA, ui->buttonB, ui->buttonX, ui->buttonY, 29 ui->player1_checkbox, ui->player2_checkbox, ui->player3_checkbox, ui->player4_checkbox,
104 ui->buttonLStick, ui->buttonRStick, ui->buttonL, ui->buttonR, 30 ui->player5_checkbox, ui->player6_checkbox, ui->player7_checkbox, ui->player8_checkbox,
105 ui->buttonZL, ui->buttonZR, ui->buttonPlus, ui->buttonMinus,
106 ui->buttonDpadLeft, ui->buttonDpadUp, ui->buttonDpadRight, ui->buttonDpadDown,
107 ui->buttonLStickLeft, ui->buttonLStickUp, ui->buttonLStickRight, ui->buttonLStickDown,
108 ui->buttonRStickLeft, ui->buttonRStickUp, ui->buttonRStickRight, ui->buttonRStickDown,
109 ui->buttonSL, ui->buttonSR, ui->buttonHome, ui->buttonScreenshot,
110 }; 31 };
111 32
112 analog_map_buttons = {{ 33 player_controller = {
113 { 34 ui->player1_combobox, ui->player2_combobox, ui->player3_combobox, ui->player4_combobox,
114 ui->buttonLStickUp, 35 ui->player5_combobox, ui->player6_combobox, ui->player7_combobox, ui->player8_combobox,
115 ui->buttonLStickDown, 36 };
116 ui->buttonLStickLeft,
117 ui->buttonLStickRight,
118 ui->buttonLStickMod,
119 },
120 {
121 ui->buttonRStickUp,
122 ui->buttonRStickDown,
123 ui->buttonRStickLeft,
124 ui->buttonRStickRight,
125 ui->buttonRStickMod,
126 },
127 }};
128 37
129 analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog}; 38 player_configure = {
39 ui->player1_configure, ui->player2_configure, ui->player3_configure, ui->player4_configure,
40 ui->player5_configure, ui->player6_configure, ui->player7_configure, ui->player8_configure,
41 };
130 42
131 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { 43 for (auto* controller_box : player_controller) {
132 if (!button_map[button_id]) 44 controller_box->addItems(
133 continue; 45 {"Pro Controller", "Dual Joycons", "Single Right Joycon", "Single Left Joycon"});
134 button_map[button_id]->setContextMenuPolicy(Qt::CustomContextMenu);
135 connect(button_map[button_id], &QPushButton::released, [=]() {
136 handleClick(
137 button_map[button_id],
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 });
155 } 46 }
156 47
157 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { 48 this->loadConfiguration();
158 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { 49 updateUIEnabled();
159 if (!analog_map_buttons[analog_id][sub_button_id])
160 continue;
161 analog_map_buttons[analog_id][sub_button_id]->setContextMenuPolicy(
162 Qt::CustomContextMenu);
163 connect(analog_map_buttons[analog_id][sub_button_id], &QPushButton::released, [=]() {
164 handleClick(analog_map_buttons[analog_id][sub_button_id],
165 [=](const Common::ParamPackage& params) {
166 SetAnalogButton(params, analogs_param[analog_id],
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]"));
177 });
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 });
189 }
190 connect(analog_map_stick[analog_id], &QPushButton::released, [=]() {
191 QMessageBox::information(this, tr("Information"),
192 tr("After pressing OK, first move your joystick horizontally, "
193 "and then vertically."));
194 handleClick(
195 analog_map_stick[analog_id],
196 [=](const Common::ParamPackage& params) { analogs_param[analog_id] = params; },
197 InputCommon::Polling::DeviceType::Analog);
198 });
199 }
200 50
201 connect(ui->buttonClearAll, &QPushButton::released, [this] { ClearAll(); }); 51 connect(ui->restore_defaults_button, &QPushButton::pressed, this,
202 connect(ui->buttonRestoreDefaults, &QPushButton::released, [this]() { restoreDefaults(); }); 52 &ConfigureInput::restoreDefaults);
203 53
204 timeout_timer->setSingleShot(true); 54 for (auto* enabled : players_enabled)
205 connect(timeout_timer.get(), &QTimer::timeout, [this]() { setPollingResult({}, true); }); 55 connect(enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
56 connect(ui->use_docked_mode, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
57 connect(ui->handheld_connected, &QCheckBox::stateChanged, this,
58 &ConfigureInput::updateUIEnabled);
59 connect(ui->mouse_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
60 connect(ui->keyboard_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
61 connect(ui->debug_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::updateUIEnabled);
62 connect(ui->touchscreen_enabled, &QCheckBox::stateChanged, this,
63 &ConfigureInput::updateUIEnabled);
206 64
207 connect(poll_timer.get(), &QTimer::timeout, [this]() { 65 for (std::size_t i = 0; i < player_configure.size(); ++i) {
208 Common::ParamPackage params; 66 connect(player_configure[i], &QPushButton::pressed, this,
209 for (auto& poller : device_pollers) { 67 [this, i]() { CallConfigureDialog<ConfigureInputPlayer>(i, false); });
210 params = poller->GetNextInput(); 68 }
211 if (params.Has("engine")) {
212 setPollingResult(params, false);
213 return;
214 }
215 }
216 });
217 69
218 this->loadConfiguration(); 70 connect(ui->handheld_configure, &QPushButton::pressed, this,
71 [this]() { CallConfigureDialog<ConfigureInputPlayer>(8, false); });
219 72
220 // TODO(wwylele): enable this when we actually emulate it 73 connect(ui->debug_configure, &QPushButton::pressed, this,
221 ui->buttonHome->setEnabled(false); 74 [this]() { CallConfigureDialog<ConfigureInputPlayer>(9, true); });
222}
223 75
224void ConfigureInput::applyConfiguration() { 76 connect(ui->mouse_advanced, &QPushButton::pressed, this,
225 std::transform(buttons_param.begin(), buttons_param.end(), Settings::values.buttons.begin(), 77 [this]() { CallConfigureDialog<ConfigureMouseAdvanced>(); });
226 [](const Common::ParamPackage& param) { return param.Serialize(); });
227 std::transform(analogs_param.begin(), analogs_param.end(), Settings::values.analogs.begin(),
228 [](const Common::ParamPackage& param) { return param.Serialize(); });
229}
230 78
231void ConfigureInput::loadConfiguration() { 79 connect(ui->touchscreen_advanced, &QPushButton::pressed, this,
232 std::transform(Settings::values.buttons.begin(), Settings::values.buttons.end(), 80 [this]() { CallConfigureDialog<ConfigureTouchscreenAdvanced>(); });
233 buttons_param.begin(), 81
234 [](const std::string& str) { return Common::ParamPackage(str); }); 82 ui->use_docked_mode->setEnabled(!Core::System::GetInstance().IsPoweredOn());
235 std::transform(Settings::values.analogs.begin(), Settings::values.analogs.end(),
236 analogs_param.begin(),
237 [](const std::string& str) { return Common::ParamPackage(str); });
238 updateButtonLabels();
239} 83}
240 84
241void ConfigureInput::restoreDefaults() { 85template <typename Dialog, typename... Args>
242 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { 86void ConfigureInput::CallConfigureDialog(Args... args) {
243 buttons_param[button_id] = Common::ParamPackage{ 87 this->applyConfiguration();
244 InputCommon::GenerateKeyboardParam(Config::default_buttons[button_id])}; 88 Dialog dialog(this, args...);
245 }
246 89
247 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { 90 const auto res = dialog.exec();
248 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { 91 if (res == QDialog::Accepted) {
249 Common::ParamPackage params{InputCommon::GenerateKeyboardParam( 92 dialog.applyConfiguration();
250 Config::default_analogs[analog_id][sub_button_id])};
251 SetAnalogButton(params, analogs_param[analog_id], analog_sub_buttons[sub_button_id]);
252 }
253 } 93 }
254 updateButtonLabels();
255} 94}
256 95
257void ConfigureInput::ClearAll() { 96void ConfigureInput::applyConfiguration() {
258 for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { 97 for (std::size_t i = 0; i < 8; ++i) {
259 if (button_map[button_id] && button_map[button_id]->isEnabled()) 98 Settings::values.players[i].connected = players_enabled[i]->isChecked();
260 buttons_param[button_id].Clear(); 99 Settings::values.players[i].type =
261 } 100 static_cast<Settings::ControllerType>(player_controller[i]->currentIndex());
262 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { 101 }
263 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { 102
264 if (analog_map_buttons[analog_id][sub_button_id] && 103 Settings::values.use_docked_mode = ui->use_docked_mode->isChecked();
265 analog_map_buttons[analog_id][sub_button_id]->isEnabled()) 104 Settings::values.players[8].connected = ui->handheld_connected->isChecked();
266 analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]); 105 Settings::values.debug_pad_enabled = ui->debug_enabled->isChecked();
267 } 106 Settings::values.mouse_enabled = ui->mouse_enabled->isChecked();
268 } 107 Settings::values.keyboard_enabled = ui->keyboard_enabled->isChecked();
269 updateButtonLabels(); 108 Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
270} 109}
271 110
272void ConfigureInput::updateButtonLabels() { 111void ConfigureInput::updateUIEnabled() {
273 for (int button = 0; button < Settings::NativeButton::NumButtons; button++) { 112 for (std::size_t i = 0; i < 8; ++i) {
274 button_map[button]->setText(ButtonToText(buttons_param[button])); 113 const auto enabled = players_enabled[i]->checkState() == Qt::Checked;
275 }
276 114
277 for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { 115 player_controller[i]->setEnabled(enabled);
278 for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; sub_button_id++) { 116 player_configure[i]->setEnabled(enabled);
279 if (analog_map_buttons[analog_id][sub_button_id]) {
280 analog_map_buttons[analog_id][sub_button_id]->setText(
281 AnalogToText(analogs_param[analog_id], analog_sub_buttons[sub_button_id]));
282 }
283 }
284 analog_map_stick[analog_id]->setText(tr("Set Analog Stick"));
285 } 117 }
286}
287
288void ConfigureInput::handleClick(QPushButton* button,
289 std::function<void(const Common::ParamPackage&)> new_input_setter,
290 InputCommon::Polling::DeviceType type) {
291 button->setText(tr("[press key]"));
292 button->setFocus();
293
294 input_setter = new_input_setter;
295
296 device_pollers = InputCommon::Polling::GetPollers(type);
297
298 // Keyboard keys can only be used as button devices
299 want_keyboard_keys = type == InputCommon::Polling::DeviceType::Button;
300 118
301 for (auto& poller : device_pollers) { 119 bool hit_disabled = false;
302 poller->Start(); 120 for (auto* player : players_enabled) {
121 if (hit_disabled)
122 player->setDisabled(true);
123 else
124 player->setEnabled(true);
125 if (!player->isChecked())
126 hit_disabled = true;
303 } 127 }
304 128
305 grabKeyboard(); 129 ui->handheld_connected->setEnabled(!ui->use_docked_mode->isChecked());
306 grabMouse(); 130 ui->handheld_configure->setEnabled(ui->handheld_connected->isChecked() &&
307 timeout_timer->start(5000); // Cancel after 5 seconds 131 !ui->use_docked_mode->isChecked());
308 poll_timer->start(200); // Check for new inputs every 200ms 132 ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked());
133 ui->debug_configure->setEnabled(ui->debug_enabled->isChecked());
134 ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked());
309} 135}
310 136
311void ConfigureInput::setPollingResult(const Common::ParamPackage& params, bool abort) { 137void ConfigureInput::loadConfiguration() {
312 releaseKeyboard(); 138 std::stable_partition(Settings::values.players.begin(), Settings::values.players.end(),
313 releaseMouse(); 139 [](const auto& player) { return player.connected; });
314 timeout_timer->stop();
315 poll_timer->stop();
316 for (auto& poller : device_pollers) {
317 poller->Stop();
318 }
319 140
320 if (!abort) { 141 for (std::size_t i = 0; i < 8; ++i) {
321 (*input_setter)(params); 142 players_enabled[i]->setChecked(Settings::values.players[i].connected);
143 player_controller[i]->setCurrentIndex(static_cast<u8>(Settings::values.players[i].type));
322 } 144 }
323 145
324 updateButtonLabels(); 146 ui->use_docked_mode->setChecked(Settings::values.use_docked_mode);
325 input_setter = {}; 147 ui->handheld_connected->setChecked(Settings::values.players[8].connected);
148 ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled);
149 ui->mouse_enabled->setChecked(Settings::values.mouse_enabled);
150 ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled);
151 ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
152
153 updateUIEnabled();
326} 154}
327 155
328void ConfigureInput::keyPressEvent(QKeyEvent* event) { 156void ConfigureInput::restoreDefaults() {
329 if (!input_setter || !event) 157 players_enabled[0]->setCheckState(Qt::Checked);
330 return; 158 player_controller[0]->setCurrentIndex(1);
331 159
332 if (event->key() != Qt::Key_Escape) { 160 for (std::size_t i = 1; i < 8; ++i) {
333 if (want_keyboard_keys) { 161 players_enabled[i]->setCheckState(Qt::Unchecked);
334 setPollingResult(Common::ParamPackage{InputCommon::GenerateKeyboardParam(event->key())}, 162 player_controller[i]->setCurrentIndex(0);
335 false);
336 } else {
337 // Escape key wasn't pressed and we don't want any keyboard keys, so don't stop polling
338 return;
339 }
340 } 163 }
341 setPollingResult({}, true); 164
165 ui->use_docked_mode->setCheckState(Qt::Unchecked);
166 ui->handheld_connected->setCheckState(Qt::Unchecked);
167 ui->mouse_enabled->setCheckState(Qt::Unchecked);
168 ui->keyboard_enabled->setCheckState(Qt::Unchecked);
169 ui->debug_enabled->setCheckState(Qt::Unchecked);
170 ui->touchscreen_enabled->setCheckState(Qt::Checked);
171 updateUIEnabled();
342} 172}
diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h
index 32c7183f9..0ba77c5ef 100644
--- a/src/yuzu/configuration/configure_input.h
+++ b/src/yuzu/configuration/configure_input.h
@@ -18,6 +18,7 @@
18#include "core/settings.h" 18#include "core/settings.h"
19#include "input_common/main.h" 19#include "input_common/main.h"
20#include "ui_configure_input.h" 20#include "ui_configure_input.h"
21#include "yuzu/configuration/config.h"
21 22
22class QPushButton; 23class QPushButton;
23class QString; 24class QString;
@@ -37,57 +38,19 @@ public:
37 void applyConfiguration(); 38 void applyConfiguration();
38 39
39private: 40private:
40 std::unique_ptr<Ui::ConfigureInput> ui; 41 void updateUIEnabled();
41
42 std::unique_ptr<QTimer> timeout_timer;
43 std::unique_ptr<QTimer> poll_timer;
44
45 /// This will be the the setting function when an input is awaiting configuration.
46 std::optional<std::function<void(const Common::ParamPackage&)>> input_setter;
47
48 std::array<Common::ParamPackage, Settings::NativeButton::NumButtons> buttons_param;
49 std::array<Common::ParamPackage, Settings::NativeAnalog::NumAnalogs> analogs_param;
50
51 static constexpr int ANALOG_SUB_BUTTONS_NUM = 5;
52
53 /// Each button input is represented by a QPushButton.
54 std::array<QPushButton*, Settings::NativeButton::NumButtons> button_map;
55
56 /// A group of five QPushButtons represent one analog input. The buttons each represent up,
57 /// down, left, right, and modifier, respectively.
58 std::array<std::array<QPushButton*, ANALOG_SUB_BUTTONS_NUM>, Settings::NativeAnalog::NumAnalogs>
59 analog_map_buttons;
60 42
61 /// Analog inputs are also represented each with a single button, used to configure with an 43 template <typename Dialog, typename... Args>
62 /// actual analog stick 44 void CallConfigureDialog(Args... args);
63 std::array<QPushButton*, Settings::NativeAnalog::NumAnalogs> analog_map_stick;
64
65 static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons;
66
67 std::vector<std::unique_ptr<InputCommon::Polling::DevicePoller>> device_pollers;
68
69 /// A flag to indicate if keyboard keys are okay when configuring an input. If this is false,
70 /// keyboard events are ignored.
71 bool want_keyboard_keys = false;
72 45
73 /// Load configuration settings. 46 /// Load configuration settings.
74 void loadConfiguration(); 47 void loadConfiguration();
75 /// Restore all buttons to their default values. 48 /// Restore all buttons to their default values.
76 void restoreDefaults(); 49 void restoreDefaults();
77 /// Clear all input configuration
78 void ClearAll();
79 50
80 /// Update UI to reflect current configuration. 51 std::unique_ptr<Ui::ConfigureInput> ui;
81 void updateButtonLabels();
82
83 /// Called when the button was pressed.
84 void handleClick(QPushButton* button,
85 std::function<void(const Common::ParamPackage&)> new_input_setter,
86 InputCommon::Polling::DeviceType type);
87
88 /// Finish polling and configure input using the input_setter
89 void setPollingResult(const Common::ParamPackage& params, bool abort);
90 52
91 /// Handle key press events. 53 std::array<QCheckBox*, 8> players_enabled;
92 void keyPressEvent(QKeyEvent* event) override; 54 std::array<QComboBox*, 8> player_controller;
55 std::array<QPushButton*, 8> player_configure;
93}; 56};
diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui
index 8a019a693..f12896b47 100644
--- a/src/yuzu/configuration/configure_input.ui
+++ b/src/yuzu/configuration/configure_input.ui
@@ -6,7 +6,7 @@
6 <rect> 6 <rect>
7 <x>0</x> 7 <x>0</x>
8 <y>0</y> 8 <y>0</y>
9 <width>343</width> 9 <width>473</width>
10 <height>677</height> 10 <height>677</height>
11 </rect> 11 </rect>
12 </property> 12 </property>
@@ -15,740 +15,474 @@
15 </property> 15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout_5"> 16 <layout class="QVBoxLayout" name="verticalLayout_5">
17 <item> 17 <item>
18 <layout class="QGridLayout" name="buttons"> 18 <layout class="QVBoxLayout" name="verticalLayout">
19 <item row="3" column="1"> 19 <item>
20 <widget class="QGroupBox" name="misc"> 20 <widget class="QGroupBox" name="gridGroupBox">
21 <property name="title"> 21 <property name="title">
22 <string>Misc.</string> 22 <string>Players</string>
23 </property>
24 <property name="flat">
25 <bool>false</bool>
26 </property>
27 <property name="checkable">
28 <bool>false</bool>
29 </property> 23 </property>
30 <layout class="QGridLayout" name="gridLayout_6"> 24 <layout class="QGridLayout" name="gridLayout">
31 <item row="0" column="0"> 25 <item row="1" column="2">
32 <layout class="QVBoxLayout" name="buttonMiscMinusVerticalLayout"> 26 <widget class="QComboBox" name="player1_combobox">
33 <item> 27 <property name="minimumSize">
34 <widget class="QLabel" name="labelMinus"> 28 <size>
35 <property name="text"> 29 <width>110</width>
36 <string>Minus:</string> 30 <height>0</height>
37 </property> 31 </size>
38 </widget> 32 </property>
39 </item> 33 </widget>
40 <item>
41 <widget class="QPushButton" name="buttonMinus">
42 <property name="text">
43 <string/>
44 </property>
45 </widget>
46 </item>
47 </layout>
48 </item> 34 </item>
49 <item row="0" column="1"> 35 <item row="1" column="3">
50 <layout class="QVBoxLayout" name="buttonMiscPlusVerticalLayout"> 36 <widget class="QPushButton" name="player1_configure">
51 <item> 37 <property name="text">
52 <widget class="QLabel" name="labelPlus"> 38 <string>Configure</string>
53 <property name="text"> 39 </property>
54 <string>Plus:</string> 40 </widget>
55 </property>
56 </widget>
57 </item>
58 <item>
59 <widget class="QPushButton" name="buttonPlus">
60 <property name="text">
61 <string/>
62 </property>
63 </widget>
64 </item>
65 </layout>
66 </item> 41 </item>
67 <item row="1" column="0"> 42 <item row="0" column="2">
68 <layout class="QVBoxLayout" name="buttonMiscHomeVerticalLayout"> 43 <widget class="QLabel" name="label">
69 <item> 44 <property name="text">
70 <widget class="QLabel" name="labelHome"> 45 <string>Controller Type</string>
71 <property name="text"> 46 </property>
72 <string>Home:</string> 47 <property name="alignment">
73 </property> 48 <set>Qt::AlignCenter</set>
74 </widget> 49 </property>
75 </item> 50 </widget>
76 <item>
77 <widget class="QPushButton" name="buttonHome">
78 <property name="text">
79 <string/>
80 </property>
81 </widget>
82 </item>
83 </layout>
84 </item> 51 </item>
85 <item row="1" column="1"> 52 <item row="1" column="1">
86 <layout class="QVBoxLayout" name="buttonMiscScrCapVerticalLayout"> 53 <widget class="QCheckBox" name="player1_checkbox">
87 <item> 54 <property name="text">
88 <widget class="QLabel" name="labelScrCap"> 55 <string>Player 1</string>
89 <property name="text"> 56 </property>
90 <string>Screen 57 </widget>
91Capture:</string> 58 </item>
92 </property> 59 <item row="7" column="1">
93 </widget> 60 <widget class="QCheckBox" name="player7_checkbox">
94 </item> 61 <property name="text">
95 <item> 62 <string>Player 7</string>
96 <widget class="QPushButton" name="buttonScreenshot"> 63 </property>
97 <property name="text"> 64 </widget>
98 <string/> 65 </item>
99 </property> 66 <item row="4" column="1">
100 </widget> 67 <widget class="QCheckBox" name="player4_checkbox">
101 </item> 68 <property name="text">
102 </layout> 69 <string>Player 4</string>
70 </property>
71 </widget>
72 </item>
73 <item row="5" column="1">
74 <widget class="QCheckBox" name="player5_checkbox">
75 <property name="text">
76 <string>Player 5</string>
77 </property>
78 </widget>
79 </item>
80 <item row="6" column="1">
81 <widget class="QCheckBox" name="player6_checkbox">
82 <property name="text">
83 <string>Player 6</string>
84 </property>
85 </widget>
86 </item>
87 <item row="8" column="1">
88 <widget class="QCheckBox" name="player8_checkbox">
89 <property name="text">
90 <string>Player 8</string>
91 </property>
92 </widget>
93 </item>
94 <item row="3" column="1">
95 <widget class="QCheckBox" name="player3_checkbox">
96 <property name="text">
97 <string>Player 3</string>
98 </property>
99 </widget>
103 </item> 100 </item>
104 <item row="2" column="1"> 101 <item row="2" column="1">
105 <spacer name="verticalSpacer"> 102 <widget class="QCheckBox" name="player2_checkbox">
106 <property name="orientation"> 103 <property name="text">
107 <enum>Qt::Vertical</enum> 104 <string>Player 2</string>
108 </property> 105 </property>
109 <property name="sizeHint" stdset="0"> 106 </widget>
107 </item>
108 <item row="2" column="2">
109 <widget class="QComboBox" name="player2_combobox">
110 <property name="minimumSize">
110 <size> 111 <size>
111 <width>20</width> 112 <width>110</width>
112 <height>40</height> 113 <height>0</height>
113 </size> 114 </size>
114 </property> 115 </property>
115 </spacer> 116 </widget>
116 </item> 117 </item>
117 </layout> 118 <item row="3" column="2">
118 </widget> 119 <widget class="QComboBox" name="player3_combobox">
119 </item> 120 <property name="minimumSize">
120 <item row="0" column="0"> 121 <size>
121 <widget class="QGroupBox" name="faceButtons"> 122 <width>110</width>
122 <property name="title"> 123 <height>0</height>
123 <string>Face Buttons</string> 124 </size>
124 </property> 125 </property>
125 <property name="flat"> 126 </widget>
126 <bool>false</bool>
127 </property>
128 <property name="checkable">
129 <bool>false</bool>
130 </property>
131 <layout class="QGridLayout" name="gridLayout">
132 <item row="0" column="0">
133 <layout class="QVBoxLayout" name="buttonFaceButtonsAVerticalLayout">
134 <item>
135 <widget class="QLabel" name="labelA">
136 <property name="text">
137 <string>A:</string>
138 </property>
139 </widget>
140 </item>
141 <item>
142 <widget class="QPushButton" name="buttonA">
143 <property name="text">
144 <string/>
145 </property>
146 </widget>
147 </item>
148 </layout>
149 </item> 127 </item>
150 <item row="0" column="1"> 128 <item row="4" column="2">
151 <layout class="QVBoxLayout" name="buttonFaceButtonsBVerticalLayout"> 129 <widget class="QComboBox" name="player4_combobox">
152 <item> 130 <property name="minimumSize">
153 <widget class="QLabel" name="labelB"> 131 <size>
154 <property name="text"> 132 <width>110</width>
155 <string>B:</string> 133 <height>0</height>
156 </property> 134 </size>
157 </widget> 135 </property>
158 </item> 136 </widget>
159 <item>
160 <widget class="QPushButton" name="buttonB">
161 <property name="text">
162 <string/>
163 </property>
164 </widget>
165 </item>
166 </layout>
167 </item> 137 </item>
168 <item row="1" column="0"> 138 <item row="5" column="2">
169 <layout class="QVBoxLayout" name="buttonFaceButtonsXVerticalLayout"> 139 <widget class="QComboBox" name="player5_combobox">
170 <item> 140 <property name="minimumSize">
171 <widget class="QLabel" name="labelX"> 141 <size>
172 <property name="text"> 142 <width>110</width>
173 <string>X:</string> 143 <height>0</height>
174 </property> 144 </size>
175 </widget> 145 </property>
176 </item> 146 </widget>
177 <item>
178 <widget class="QPushButton" name="buttonX">
179 <property name="text">
180 <string/>
181 </property>
182 </widget>
183 </item>
184 </layout>
185 </item> 147 </item>
186 <item row="1" column="1"> 148 <item row="6" column="2">
187 <layout class="QVBoxLayout" name="buttonFaceButtonsYVerticalLayout"> 149 <widget class="QComboBox" name="player6_combobox">
188 <item> 150 <property name="minimumSize">
189 <widget class="QLabel" name="labelY"> 151 <size>
190 <property name="text"> 152 <width>110</width>
191 <string>Y:</string> 153 <height>0</height>
192 </property> 154 </size>
193 </widget> 155 </property>
194 </item> 156 </widget>
195 <item>
196 <widget class="QPushButton" name="buttonY">
197 <property name="text">
198 <string/>
199 </property>
200 </widget>
201 </item>
202 </layout>
203 </item> 157 </item>
204 </layout> 158 <item row="7" column="2">
205 </widget> 159 <widget class="QComboBox" name="player7_combobox">
206 </item> 160 <property name="minimumSize">
207 <item row="0" column="1"> 161 <size>
208 <widget class="QGroupBox" name="Dpad"> 162 <width>110</width>
209 <property name="title"> 163 <height>0</height>
210 <string>Directional Pad</string> 164 </size>
211 </property> 165 </property>
212 <property name="flat"> 166 </widget>
213 <bool>false</bool>
214 </property>
215 <property name="checkable">
216 <bool>false</bool>
217 </property>
218 <layout class="QGridLayout" name="gridLayout_2">
219 <item row="1" column="0">
220 <layout class="QVBoxLayout" name="buttonDpadUpVerticalLayout">
221 <item>
222 <widget class="QLabel" name="labelDpadUp">
223 <property name="text">
224 <string>Up:</string>
225 </property>
226 </widget>
227 </item>
228 <item>
229 <widget class="QPushButton" name="buttonDpadUp">
230 <property name="text">
231 <string/>
232 </property>
233 </widget>
234 </item>
235 </layout>
236 </item> 167 </item>
237 <item row="1" column="1"> 168 <item row="8" column="2">
238 <layout class="QVBoxLayout" name="buttonDpadDownVerticalLayout"> 169 <widget class="QComboBox" name="player8_combobox">
239 <item> 170 <property name="minimumSize">
240 <widget class="QLabel" name="labelDpadDown"> 171 <size>
241 <property name="text"> 172 <width>110</width>
242 <string>Down:</string> 173 <height>0</height>
243 </property> 174 </size>
244 </widget> 175 </property>
245 </item> 176 </widget>
246 <item> 177 </item>
247 <widget class="QPushButton" name="buttonDpadDown"> 178 <item row="2" column="3">
248 <property name="text"> 179 <widget class="QPushButton" name="player2_configure">
249 <string/> 180 <property name="text">
250 </property> 181 <string>Configure</string>
251 </widget> 182 </property>
252 </item> 183 </widget>
253 </layout> 184 </item>
185 <item row="3" column="3">
186 <widget class="QPushButton" name="player3_configure">
187 <property name="text">
188 <string>Configure</string>
189 </property>
190 </widget>
191 </item>
192 <item row="4" column="3">
193 <widget class="QPushButton" name="player4_configure">
194 <property name="text">
195 <string>Configure</string>
196 </property>
197 </widget>
198 </item>
199 <item row="5" column="3">
200 <widget class="QPushButton" name="player5_configure">
201 <property name="text">
202 <string>Configure</string>
203 </property>
204 </widget>
205 </item>
206 <item row="6" column="3">
207 <widget class="QPushButton" name="player6_configure">
208 <property name="text">
209 <string>Configure</string>
210 </property>
211 </widget>
212 </item>
213 <item row="7" column="3">
214 <widget class="QPushButton" name="player7_configure">
215 <property name="text">
216 <string>Configure</string>
217 </property>
218 </widget>
219 </item>
220 <item row="8" column="3">
221 <widget class="QPushButton" name="player8_configure">
222 <property name="text">
223 <string>Configure</string>
224 </property>
225 </widget>
254 </item> 226 </item>
255 <item row="0" column="0"> 227 <item row="0" column="0">
256 <layout class="QVBoxLayout" name="buttonDpadLeftVerticalLayout"> 228 <spacer name="horizontalSpacer">
257 <item> 229 <property name="orientation">
258 <widget class="QLabel" name="labelDpadLeft"> 230 <enum>Qt::Horizontal</enum>
259 <property name="text"> 231 </property>
260 <string>Left:</string> 232 <property name="sizeHint" stdset="0">
261 </property> 233 <size>
262 </widget> 234 <width>40</width>
263 </item> 235 <height>20</height>
264 <item> 236 </size>
265 <widget class="QPushButton" name="buttonDpadLeft"> 237 </property>
266 <property name="text"> 238 </spacer>
267 <string/> 239 </item>
268 </property> 240 <item row="0" column="4">
269 </widget> 241 <spacer name="horizontalSpacer_2">
270 </item> 242 <property name="orientation">
271 </layout> 243 <enum>Qt::Horizontal</enum>
244 </property>
245 <property name="sizeHint" stdset="0">
246 <size>
247 <width>40</width>
248 <height>20</height>
249 </size>
250 </property>
251 </spacer>
272 </item> 252 </item>
273 <item row="0" column="1"> 253 <item row="0" column="1">
274 <layout class="QVBoxLayout" name="buttonDpadRightVerticalLayout"> 254 <widget class="QLabel" name="label_2">
275 <item> 255 <property name="text">
276 <widget class="QLabel" name="labelDpadRight"> 256 <string>Enabled</string>
277 <property name="text"> 257 </property>
278 <string>Right:</string> 258 <property name="alignment">
279 </property> 259 <set>Qt::AlignCenter</set>
280 </widget> 260 </property>
281 </item> 261 </widget>
282 <item>
283 <widget class="QPushButton" name="buttonDpadRight">
284 <property name="text">
285 <string/>
286 </property>
287 </widget>
288 </item>
289 </layout>
290 </item> 262 </item>
291 </layout> 263 </layout>
292 </widget> 264 </widget>
293 </item> 265 </item>
294 <item row="3" column="0"> 266 <item>
295 <widget class="QGroupBox" name="shoulderButtons"> 267 <widget class="QGroupBox" name="gridGroupBox">
296 <property name="title"> 268 <property name="title">
297 <string>Shoulder Buttons</string> 269 <string>Handheld</string>
298 </property>
299 <property name="flat">
300 <bool>false</bool>
301 </property>
302 <property name="checkable">
303 <bool>false</bool>
304 </property> 270 </property>
305 <layout class="QGridLayout" name="gridLayout_3"> 271 <layout class="QGridLayout" name="gridLayout_2">
306 <item row="0" column="0"> 272 <item row="1" column="2">
307 <layout class="QVBoxLayout" name="buttonShoulderButtonsLVerticalLayout"> 273 <spacer name="horizontalSpacer_5">
308 <item> 274 <property name="orientation">
309 <widget class="QLabel" name="labelL"> 275 <enum>Qt::Horizontal</enum>
310 <property name="text"> 276 </property>
311 <string>L:</string> 277 <property name="sizeType">
312 </property> 278 <enum>QSizePolicy::Fixed</enum>
313 </widget> 279 </property>
314 </item> 280 <property name="sizeHint" stdset="0">
315 <item> 281 <size>
316 <widget class="QPushButton" name="buttonL"> 282 <width>72</width>
317 <property name="text"> 283 <height>20</height>
318 <string/> 284 </size>
319 </property> 285 </property>
320 </widget> 286 </spacer>
321 </item>
322 </layout>
323 </item> 287 </item>
324 <item row="0" column="1"> 288 <item row="1" column="4">
325 <layout class="QVBoxLayout" name="buttonShoulderButtonsRVerticalLayout"> 289 <spacer name="horizontalSpacer_4">
326 <item> 290 <property name="orientation">
327 <widget class="QLabel" name="labelR"> 291 <enum>Qt::Horizontal</enum>
328 <property name="text"> 292 </property>
329 <string>R:</string> 293 <property name="sizeHint" stdset="0">
330 </property> 294 <size>
331 </widget> 295 <width>40</width>
332 </item> 296 <height>20</height>
333 <item> 297 </size>
334 <widget class="QPushButton" name="buttonR"> 298 </property>
335 <property name="text"> 299 </spacer>
336 <string/> 300 </item>
337 </property> 301 <item row="1" column="3">
338 </widget> 302 <widget class="QPushButton" name="handheld_configure">
339 </item> 303 <property name="text">
340 </layout> 304 <string>Configure</string>
305 </property>
306 </widget>
341 </item> 307 </item>
342 <item row="1" column="0"> 308 <item row="1" column="0">
343 <layout class="QVBoxLayout" name="buttonShoulderButtonsZLVerticalLayout"> 309 <spacer name="horizontalSpacer_3">
344 <item> 310 <property name="orientation">
345 <widget class="QLabel" name="labelZL"> 311 <enum>Qt::Horizontal</enum>
346 <property name="text"> 312 </property>
347 <string>ZL:</string> 313 <property name="sizeHint" stdset="0">
348 </property> 314 <size>
349 </widget> 315 <width>40</width>
350 </item> 316 <height>20</height>
351 <item> 317 </size>
352 <widget class="QPushButton" name="buttonZL"> 318 </property>
353 <property name="text"> 319 </spacer>
354 <string/>
355 </property>
356 </widget>
357 </item>
358 </layout>
359 </item> 320 </item>
360 <item row="1" column="1"> 321 <item row="1" column="1">
361 <layout class="QVBoxLayout" name="buttonShoulderButtonsZRVerticalLayout"> 322 <widget class="QCheckBox" name="handheld_connected">
362 <item> 323 <property name="text">
363 <widget class="QLabel" name="labelZR"> 324 <string>Connected</string>
364 <property name="text"> 325 </property>
365 <string>ZR:</string> 326 </widget>
366 </property>
367 </widget>
368 </item>
369 <item>
370 <widget class="QPushButton" name="buttonZR">
371 <property name="text">
372 <string/>
373 </property>
374 </widget>
375 </item>
376 </layout>
377 </item>
378 <item row="2" column="0">
379 <layout class="QVBoxLayout" name="buttonShoulderButtonsSLVerticalLayout">
380 <item>
381 <widget class="QLabel" name="labelSL">
382 <property name="text">
383 <string>SL:</string>
384 </property>
385 </widget>
386 </item>
387 <item>
388 <widget class="QPushButton" name="buttonSL">
389 <property name="text">
390 <string/>
391 </property>
392 </widget>
393 </item>
394 </layout>
395 </item> 327 </item>
396 <item row="2" column="1"> 328 <item row="0" column="1">
397 <layout class="QVBoxLayout" name="buttonShoulderButtonsSRVerticalLayout"> 329 <widget class="QCheckBox" name="use_docked_mode">
398 <item> 330 <property name="text">
399 <widget class="QLabel" name="labelSR"> 331 <string>Use Docked Mode</string>
400 <property name="text"> 332 </property>
401 <string>SR:</string> 333 </widget>
402 </property>
403 </widget>
404 </item>
405 <item>
406 <widget class="QPushButton" name="buttonSR">
407 <property name="text">
408 <string/>
409 </property>
410 </widget>
411 </item>
412 </layout>
413 </item> 334 </item>
414 </layout> 335 </layout>
415 </widget> 336 </widget>
416 </item> 337 </item>
417 <item row="1" column="1"> 338 <item>
418 <widget class="QGroupBox" name="RStick"> 339 <widget class="QGroupBox" name="gridGroupBox">
419 <property name="title"> 340 <property name="title">
420 <string>Right Stick</string> 341 <string>Other</string>
421 </property>
422 <property name="alignment">
423 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
424 </property> 342 </property>
425 <property name="flat"> 343 <layout class="QGridLayout" name="gridLayout_3">
426 <bool>false</bool>
427 </property>
428 <property name="checkable">
429 <bool>false</bool>
430 </property>
431 <layout class="QGridLayout" name="gridLayout_5">
432 <item row="1" column="1"> 344 <item row="1" column="1">
433 <layout class="QVBoxLayout" name="buttonRStickDownVerticalLayout"> 345 <widget class="QCheckBox" name="keyboard_enabled">
434 <item> 346 <property name="minimumSize">
435 <widget class="QLabel" name="labelRStickDown"> 347 <size>
436 <property name="text"> 348 <width>0</width>
437 <string>Down:</string> 349 <height>23</height>
438 </property> 350 </size>
439 </widget> 351 </property>
440 </item>
441 <item>
442 <widget class="QPushButton" name="buttonRStickDown">
443 <property name="text">
444 <string/>
445 </property>
446 </widget>
447 </item>
448 </layout>
449 </item>
450 <item row="0" column="1">
451 <layout class="QVBoxLayout" name="buttonRStickRightVerticalLayout">
452 <item>
453 <widget class="QLabel" name="labelRStickRight">
454 <property name="text">
455 <string>Right:</string>
456 </property>
457 </widget>
458 </item>
459 <item>
460 <widget class="QPushButton" name="buttonRStickRight">
461 <property name="text">
462 <string/>
463 </property>
464 </widget>
465 </item>
466 </layout>
467 </item>
468 <item row="3" column="0" colspan="2">
469 <widget class="QPushButton" name="buttonRStickAnalog">
470 <property name="text"> 352 <property name="text">
471 <string>Set Analog Stick</string> 353 <string>Keyboard</string>
472 </property> 354 </property>
473 </widget> 355 </widget>
474 </item> 356 </item>
475 <item row="0" column="0">
476 <layout class="QVBoxLayout" name="buttonRStickLeftVerticalLayout">
477 <item>
478 <widget class="QLabel" name="labelRStickLeft">
479 <property name="text">
480 <string>Left:</string>
481 </property>
482 </widget>
483 </item>
484 <item>
485 <widget class="QPushButton" name="buttonRStickLeft">
486 <property name="text">
487 <string/>
488 </property>
489 </widget>
490 </item>
491 </layout>
492 </item>
493 <item row="1" column="0">
494 <layout class="QVBoxLayout" name="buttonRStickUpVerticalLayout">
495 <item>
496 <widget class="QLabel" name="labelRStickUp">
497 <property name="text">
498 <string>Up:</string>
499 </property>
500 </widget>
501 </item>
502 <item>
503 <widget class="QPushButton" name="buttonRStickUp">
504 <property name="text">
505 <string/>
506 </property>
507 </widget>
508 </item>
509 </layout>
510 </item>
511 <item row="2" column="0">
512 <layout class="QVBoxLayout" name="buttonRStickPressedVerticalLayout">
513 <item>
514 <widget class="QLabel" name="labelRStickPressed">
515 <property name="text">
516 <string>Pressed:</string>
517 </property>
518 </widget>
519 </item>
520 <item>
521 <widget class="QPushButton" name="buttonRStick">
522 <property name="text">
523 <string/>
524 </property>
525 </widget>
526 </item>
527 </layout>
528 </item>
529 <item row="2" column="1"> 357 <item row="2" column="1">
530 <layout class="QVBoxLayout" name="buttonRStickModVerticalLayout"> 358 <widget class="QCheckBox" name="debug_enabled">
531 <item> 359 <property name="text">
532 <widget class="QLabel" name="labelRStickMod"> 360 <string>Debug Controller</string>
533 <property name="text"> 361 </property>
534 <string>Modifier:</string> 362 </widget>
535 </property>
536 </widget>
537 </item>
538 <item>
539 <widget class="QPushButton" name="buttonRStickMod">
540 <property name="text">
541 <string/>
542 </property>
543 </widget>
544 </item>
545 </layout>
546 </item> 363 </item>
547 </layout> 364 <item row="3" column="1">
548 </widget> 365 <widget class="QCheckBox" name="touchscreen_enabled">
549 </item>
550 <item row="1" column="0">
551 <widget class="QGroupBox" name="LStick">
552 <property name="title">
553 <string>Left Stick</string>
554 </property>
555 <property name="flat">
556 <bool>false</bool>
557 </property>
558 <property name="checkable">
559 <bool>false</bool>
560 </property>
561 <layout class="QGridLayout" name="gridLayout_4">
562 <item row="1" column="1">
563 <layout class="QVBoxLayout" name="buttonLStickDownVerticalLayout">
564 <item>
565 <widget class="QLabel" name="labelLStickDown">
566 <property name="text">
567 <string>Down:</string>
568 </property>
569 </widget>
570 </item>
571 <item>
572 <widget class="QPushButton" name="buttonLStickDown">
573 <property name="text">
574 <string/>
575 </property>
576 </widget>
577 </item>
578 </layout>
579 </item>
580 <item row="4" column="0" colspan="2">
581 <widget class="QPushButton" name="buttonLStickAnalog">
582 <property name="text"> 366 <property name="text">
583 <string>Set Analog Stick</string> 367 <string>Touchscreen</string>
584 </property> 368 </property>
585 </widget> 369 </widget>
586 </item> 370 </item>
587 <item row="0" column="1"> 371 <item row="0" column="1">
588 <layout class="QVBoxLayout" name="buttonLStickRightVerticalLayout"> 372 <widget class="QCheckBox" name="mouse_enabled">
589 <item> 373 <property name="minimumSize">
590 <widget class="QLabel" name="labelLStickRight"> 374 <size>
591 <property name="text"> 375 <width>0</width>
592 <string>Right:</string> 376 <height>23</height>
593 </property> 377 </size>
594 </widget> 378 </property>
595 </item> 379 <property name="text">
596 <item> 380 <string>Mouse</string>
597 <widget class="QPushButton" name="buttonLStickRight"> 381 </property>
598 <property name="text"> 382 </widget>
599 <string/> 383 </item>
600 </property> 384 <item row="0" column="4">
601 </widget> 385 <spacer name="horizontalSpacer_7">
602 </item> 386 <property name="orientation">
603 </layout> 387 <enum>Qt::Horizontal</enum>
388 </property>
389 <property name="sizeHint" stdset="0">
390 <size>
391 <width>40</width>
392 <height>20</height>
393 </size>
394 </property>
395 </spacer>
396 </item>
397 <item row="0" column="2">
398 <spacer name="horizontalSpacer_8">
399 <property name="orientation">
400 <enum>Qt::Horizontal</enum>
401 </property>
402 <property name="sizeType">
403 <enum>QSizePolicy::Fixed</enum>
404 </property>
405 <property name="sizeHint" stdset="0">
406 <size>
407 <width>76</width>
408 <height>20</height>
409 </size>
410 </property>
411 </spacer>
604 </item> 412 </item>
605 <item row="0" column="0"> 413 <item row="0" column="0">
606 <layout class="QVBoxLayout" name="buttonLStickLeftVerticalLayout"> 414 <spacer name="horizontalSpacer_6">
607 <item> 415 <property name="orientation">
608 <widget class="QLabel" name="labelLStickLeft"> 416 <enum>Qt::Horizontal</enum>
609 <property name="text"> 417 </property>
610 <string>Left:</string> 418 <property name="sizeHint" stdset="0">
611 </property> 419 <size>
612 </widget> 420 <width>40</width>
613 </item> 421 <height>20</height>
614 <item> 422 </size>
615 <widget class="QPushButton" name="buttonLStickLeft"> 423 </property>
616 <property name="text"> 424 </spacer>
617 <string/>
618 </property>
619 </widget>
620 </item>
621 </layout>
622 </item> 425 </item>
623 <item row="1" column="0"> 426 <item row="3" column="3">
624 <layout class="QVBoxLayout" name="buttonLStickUpVerticalLayout"> 427 <widget class="QPushButton" name="touchscreen_advanced">
625 <item> 428 <property name="text">
626 <widget class="QLabel" name="labelLStickUp"> 429 <string>Advanced</string>
627 <property name="text"> 430 </property>
628 <string>Up:</string> 431 </widget>
629 </property>
630 </widget>
631 </item>
632 <item>
633 <widget class="QPushButton" name="buttonLStickUp">
634 <property name="text">
635 <string/>
636 </property>
637 </widget>
638 </item>
639 </layout>
640 </item>
641 <item row="3" column="0">
642 <layout class="QVBoxLayout" name="buttonLStickModVerticalLayout">
643 <item>
644 <widget class="QLabel" name="labelLStickMod">
645 <property name="text">
646 <string>Modifier:</string>
647 </property>
648 </widget>
649 </item>
650 <item>
651 <widget class="QPushButton" name="buttonLStickMod">
652 <property name="text">
653 <string/>
654 </property>
655 </widget>
656 </item>
657 </layout>
658 </item> 432 </item>
659 <item row="3" column="1"> 433 <item row="2" column="3">
660 <layout class="QVBoxLayout" name="buttonLStickPressedVerticalLayout" stretch="0,0"> 434 <widget class="QPushButton" name="debug_configure">
661 <item> 435 <property name="text">
662 <widget class="QLabel" name="labelLStickPressed"> 436 <string>Configure</string>
663 <property name="text"> 437 </property>
664 <string>Pressed:</string> 438 </widget>
665 </property> 439 </item>
666 </widget> 440 <item row="0" column="3">
667 </item> 441 <widget class="QPushButton" name="mouse_advanced">
668 <item> 442 <property name="text">
669 <widget class="QPushButton" name="buttonLStick"> 443 <string>Advanced</string>
670 <property name="text"> 444 </property>
671 <string/> 445 </widget>
672 </property>
673 </widget>
674 </item>
675 </layout>
676 </item> 446 </item>
677 </layout> 447 </layout>
678 </widget> 448 </widget>
679 </item> 449 </item>
680 </layout>
681 </item>
682 <item>
683 <layout class="QHBoxLayout" name="horizontalLayout">
684 <item> 450 <item>
685 <spacer name="horizontalSpacer"> 451 <spacer name="verticalSpacer">
686 <property name="orientation"> 452 <property name="orientation">
687 <enum>Qt::Horizontal</enum> 453 <enum>Qt::Vertical</enum>
688 </property> 454 </property>
689 <property name="sizeHint" stdset="0"> 455 <property name="sizeHint" stdset="0">
690 <size> 456 <size>
691 <width>40</width> 457 <width>20</width>
692 <height>20</height> 458 <height>40</height>
693 </size> 459 </size>
694 </property> 460 </property>
695 </spacer> 461 </spacer>
696 </item> 462 </item>
697 <item> 463 <item>
698 <widget class="QPushButton" name="buttonClearAll"> 464 <layout class="QHBoxLayout" name="horizontalLayout">
699 <property name="sizePolicy"> 465 <item>
700 <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> 466 <widget class="QPushButton" name="restore_defaults_button">
701 <horstretch>0</horstretch> 467 <property name="text">
702 <verstretch>0</verstretch> 468 <string>Restore Defaults</string>
703 </sizepolicy> 469 </property>
704 </property> 470 </widget>
705 <property name="sizeIncrement"> 471 </item>
706 <size> 472 <item>
707 <width>0</width> 473 <spacer name="horizontalSpacer_9">
708 <height>0</height> 474 <property name="orientation">
709 </size> 475 <enum>Qt::Horizontal</enum>
710 </property> 476 </property>
711 <property name="baseSize"> 477 <property name="sizeHint" stdset="0">
712 <size> 478 <size>
713 <width>0</width> 479 <width>40</width>
714 <height>0</height> 480 <height>20</height>
715 </size> 481 </size>
716 </property> 482 </property>
717 <property name="layoutDirection"> 483 </spacer>
718 <enum>Qt::LeftToRight</enum> 484 </item>
719 </property> 485 </layout>
720 <property name="text">
721 <string>Clear All</string>
722 </property>
723 </widget>
724 </item>
725 <item>
726 <widget class="QPushButton" name="buttonRestoreDefaults">
727 <property name="sizePolicy">
728 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
729 <horstretch>0</horstretch>
730 <verstretch>0</verstretch>
731 </sizepolicy>
732 </property>
733 <property name="sizeIncrement">
734 <size>
735 <width>0</width>
736 <height>0</height>
737 </size>
738 </property>
739 <property name="baseSize">
740 <size>
741 <width>0</width>
742 <height>0</height>
743 </size>
744 </property>
745 <property name="layoutDirection">
746 <enum>Qt::LeftToRight</enum>
747 </property>
748 <property name="text">
749 <string>Restore Defaults</string>
750 </property>
751 </widget>
752 </item> 486 </item>
753 </layout> 487 </layout>
754 </item> 488 </item>