diff options
Diffstat (limited to 'src/yuzu/configuration')
21 files changed, 7378 insertions, 2558 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 7af974d8d..489877be9 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -6,7 +6,6 @@  #include <QKeySequence>  #include <QSettings>  #include "common/file_util.h" -#include "configure_input_simple.h"  #include "core/hle/service/acc/profile_manager.h"  #include "core/hle/service/hid/controllers/npad.h"  #include "input_common/main.h" @@ -32,29 +31,29 @@ Config::~Config() {  }  const std::array<int, Settings::NativeButton::NumButtons> Config::default_buttons = { -    Qt::Key_A, Qt::Key_S, Qt::Key_Z,    Qt::Key_X,  Qt::Key_3,     Qt::Key_4,    Qt::Key_Q, -    Qt::Key_W, Qt::Key_1, Qt::Key_2,    Qt::Key_N,  Qt::Key_M,     Qt::Key_F,    Qt::Key_T, -    Qt::Key_H, Qt::Key_G, Qt::Key_Left, Qt::Key_Up, Qt::Key_Right, Qt::Key_Down, Qt::Key_J, -    Qt::Key_I, Qt::Key_L, Qt::Key_K,    Qt::Key_D,  Qt::Key_C,     Qt::Key_B,    Qt::Key_V, +    Qt::Key_A, Qt::Key_S, Qt::Key_Z, Qt::Key_X, Qt::Key_3, Qt::Key_4, Qt::Key_Q, +    Qt::Key_W, Qt::Key_1, Qt::Key_2, Qt::Key_N, Qt::Key_M, Qt::Key_F, Qt::Key_T, +    Qt::Key_H, Qt::Key_G, Qt::Key_D, Qt::Key_C, Qt::Key_B, Qt::Key_V,  }; -const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> Config::default_analogs{{ +const std::array<std::array<int, 4>, Settings::NativeAnalog::NumAnalogs> Config::default_analogs{{      {          Qt::Key_Up,          Qt::Key_Down,          Qt::Key_Left,          Qt::Key_Right, -        Qt::Key_E,      },      {          Qt::Key_I,          Qt::Key_K,          Qt::Key_J,          Qt::Key_L, -        Qt::Key_R,      },  }}; +const int Config::default_lstick_mod = Qt::Key_E; +const int Config::default_rstick_mod = Qt::Key_R; +  const std::array<int, Settings::NativeMouseButton::NumMouseButtons> Config::default_mouse_buttons =      {          Qt::Key_BracketLeft, Qt::Key_BracketRight, Qt::Key_Apostrophe, Qt::Key_Minus, Qt::Key_Equal, @@ -243,10 +242,10 @@ void Config::ReadPlayerValues() {          player.connected =              ReadSetting(QStringLiteral("player_%1_connected").arg(p), false).toBool(); -        player.type = static_cast<Settings::ControllerType>( +        player.controller_type = static_cast<Settings::ControllerType>(              qt_config                  ->value(QStringLiteral("player_%1_type").arg(p), -                        static_cast<u8>(Settings::ControllerType::DualJoycon)) +                        static_cast<u8>(Settings::ControllerType::ProController))                  .toUInt());          player.body_color_left = qt_config @@ -300,12 +299,6 @@ void Config::ReadPlayerValues() {              }          }      } - -    std::stable_partition( -        Settings::values.players.begin(), -        Settings::values.players.begin() + -            Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD), -        [](const auto& player) { return player.connected; });  }  void Config::ReadDebugValues() { @@ -397,13 +390,6 @@ void Config::ReadTouchscreenValues() {          ReadSetting(QStringLiteral("touchscreen_diameter_y"), 15).toUInt();  } -void Config::ApplyDefaultProfileIfInputInvalid() { -    if (!std::any_of(Settings::values.players.begin(), Settings::values.players.end(), -                     [](const Settings::PlayerInput& in) { return in.connected; })) { -        ApplyInputProfileConfiguration(UISettings::values.profile_index); -    } -} -  void Config::ReadAudioValues() {      qt_config->beginGroup(QStringLiteral("Audio")); @@ -433,6 +419,8 @@ void Config::ReadControlValues() {      ReadMouseValues();      ReadTouchscreenValues(); +    Settings::values.vibration_enabled = +        ReadSetting(QStringLiteral("vibration_enabled"), true).toBool();      Settings::values.motion_device =          ReadSetting(QStringLiteral("motion_device"),                      QStringLiteral("engine:motion_emu,update_period:100,sensitivity:0.01")) @@ -501,7 +489,7 @@ void Config::ReadDataStorageValues() {      Settings::values.gamecard_current_game =          ReadSetting(QStringLiteral("gamecard_current_game"), false).toBool();      Settings::values.gamecard_path = -        ReadSetting(QStringLiteral("gamecard_path"), QStringLiteral("")).toString().toStdString(); +        ReadSetting(QStringLiteral("gamecard_path"), QString{}).toString().toStdString();      qt_config->endGroup();  } @@ -515,7 +503,7 @@ void Config::ReadDebuggingValues() {      Settings::values.use_gdbstub = ReadSetting(QStringLiteral("use_gdbstub"), false).toBool();      Settings::values.gdbstub_port = ReadSetting(QStringLiteral("gdbstub_port"), 24689).toInt();      Settings::values.program_args = -        ReadSetting(QStringLiteral("program_args"), QStringLiteral("")).toString().toStdString(); +        ReadSetting(QStringLiteral("program_args"), QString{}).toString().toStdString();      Settings::values.dump_exefs = ReadSetting(QStringLiteral("dump_exefs"), false).toBool();      Settings::values.dump_nso = ReadSetting(QStringLiteral("dump_nso"), false).toBool();      Settings::values.reporting_services = @@ -548,8 +536,7 @@ void Config::ReadDisabledAddOnValues() {          const auto d_size = qt_config->beginReadArray(QStringLiteral("disabled"));          for (int j = 0; j < d_size; ++j) {              qt_config->setArrayIndex(j); -            out.push_back( -                ReadSetting(QStringLiteral("d"), QStringLiteral("")).toString().toStdString()); +            out.push_back(ReadSetting(QStringLiteral("d"), QString{}).toString().toStdString());          }          qt_config->endArray();          Settings::values.disabled_addons.insert_or_assign(title_id, out); @@ -788,14 +775,11 @@ void Config::ReadUIValues() {      UISettings::values.first_start = ReadSetting(QStringLiteral("firstStart"), true).toBool();      UISettings::values.callout_flags = ReadSetting(QStringLiteral("calloutFlags"), 0).toUInt();      UISettings::values.show_console = ReadSetting(QStringLiteral("showConsole"), false).toBool(); -    UISettings::values.profile_index = ReadSetting(QStringLiteral("profileIndex"), 0).toUInt();      UISettings::values.pause_when_in_background =          ReadSetting(QStringLiteral("pauseWhenInBackground"), false).toBool();      UISettings::values.hide_mouse =          ReadSetting(QStringLiteral("hideInactiveMouse"), false).toBool(); -    ApplyDefaultProfileIfInputInvalid(); -      qt_config->endGroup();  } @@ -869,8 +853,9 @@ void Config::SavePlayerValues() {          const auto& player = Settings::values.players[p];          WriteSetting(QStringLiteral("player_%1_connected").arg(p), player.connected, false); -        WriteSetting(QStringLiteral("player_%1_type").arg(p), static_cast<u8>(player.type), -                     static_cast<u8>(Settings::ControllerType::DualJoycon)); +        WriteSetting(QStringLiteral("player_%1_type").arg(p), +                     static_cast<u8>(player.controller_type), +                     static_cast<u8>(Settings::ControllerType::ProController));          WriteSetting(QStringLiteral("player_%1_body_color_left").arg(p), player.body_color_left,                       Settings::JOYCON_BODY_NEON_BLUE); @@ -990,6 +975,7 @@ void Config::SaveControlValues() {      SaveMouseValues();      SaveTouchscreenValues(); +    WriteSetting(QStringLiteral("vibration_enabled"), Settings::values.vibration_enabled, true);      WriteSetting(QStringLiteral("motion_device"),                   QString::fromStdString(Settings::values.motion_device),                   QStringLiteral("engine:motion_emu,update_period:100,sensitivity:0.01")); @@ -1036,7 +1022,7 @@ void Config::SaveDataStorageValues() {      WriteSetting(QStringLiteral("gamecard_current_game"), Settings::values.gamecard_current_game,                   false);      WriteSetting(QStringLiteral("gamecard_path"), -                 QString::fromStdString(Settings::values.gamecard_path), QStringLiteral("")); +                 QString::fromStdString(Settings::values.gamecard_path), QString{});      qt_config->endGroup();  } @@ -1049,7 +1035,7 @@ void Config::SaveDebuggingValues() {      WriteSetting(QStringLiteral("use_gdbstub"), Settings::values.use_gdbstub, false);      WriteSetting(QStringLiteral("gdbstub_port"), Settings::values.gdbstub_port, 24689);      WriteSetting(QStringLiteral("program_args"), -                 QString::fromStdString(Settings::values.program_args), QStringLiteral("")); +                 QString::fromStdString(Settings::values.program_args), QString{});      WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false);      WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false);      WriteSetting(QStringLiteral("quest_flag"), Settings::values.quest_flag, false); @@ -1076,8 +1062,7 @@ void Config::SaveDisabledAddOnValues() {          qt_config->beginWriteArray(QStringLiteral("disabled"));          for (std::size_t j = 0; j < elem.second.size(); ++j) {              qt_config->setArrayIndex(static_cast<int>(j)); -            WriteSetting(QStringLiteral("d"), QString::fromStdString(elem.second[j]), -                         QStringLiteral("")); +            WriteSetting(QStringLiteral("d"), QString::fromStdString(elem.second[j]), QString{});          }          qt_config->endArray();          ++i; @@ -1266,7 +1251,6 @@ void Config::SaveUIValues() {      WriteSetting(QStringLiteral("firstStart"), UISettings::values.first_start, true);      WriteSetting(QStringLiteral("calloutFlags"), UISettings::values.callout_flags, 0);      WriteSetting(QStringLiteral("showConsole"), UISettings::values.show_console, false); -    WriteSetting(QStringLiteral("profileIndex"), UISettings::values.profile_index, 0);      WriteSetting(QStringLiteral("pauseWhenInBackground"),                   UISettings::values.pause_when_in_background, false);      WriteSetting(QStringLiteral("hideInactiveMouse"), UISettings::values.hide_mouse, false); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index e5f39b040..9eeaf9d1e 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -23,7 +23,9 @@ public:      void Save();      static const std::array<int, Settings::NativeButton::NumButtons> default_buttons; -    static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs; +    static const std::array<std::array<int, 4>, Settings::NativeAnalog::NumAnalogs> default_analogs; +    static const int default_lstick_mod; +    static const int default_rstick_mod;      static const std::array<int, Settings::NativeMouseButton::NumMouseButtons>          default_mouse_buttons;      static const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> default_keyboard_keys; @@ -37,7 +39,6 @@ private:      void ReadKeyboardValues();      void ReadMouseValues();      void ReadTouchscreenValues(); -    void ApplyDefaultProfileIfInputInvalid();      // Read functions bases off the respective config section names.      void ReadAudioValues(); diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 5f5d8e571..fcf42cdcb 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -6,7 +6,7 @@     <rect>      <x>0</x>      <y>0</y> -    <width>382</width> +    <width>650</width>      <height>650</height>     </rect>    </property> @@ -26,13 +26,13 @@        <widget class="QListWidget" name="selectorList">         <property name="minimumSize">          <size> -         <width>150</width> +         <width>120</width>           <height>0</height>          </size>         </property>         <property name="maximumSize">          <size> -         <width>150</width> +         <width>120</width>           <height>16777215</height>          </size>         </property> @@ -44,76 +44,121 @@          <number>0</number>         </property>         <widget class="ConfigureGeneral" name="generalTab"> +        <property name="accessibleName"> +         <string>General</string> +        </property>          <attribute name="title">           <string>General</string>          </attribute>         </widget>         <widget class="ConfigureUi" name="uiTab"> +        <property name="accessibleName"> +         <string>UI</string> +        </property>          <attribute name="title">           <string>Game List</string>          </attribute>         </widget>         <widget class="ConfigureSystem" name="systemTab"> +        <property name="accessibleName"> +         <string>System</string> +        </property>          <attribute name="title">           <string>System</string>          </attribute>         </widget>         <widget class="ConfigureProfileManager" name="profileManagerTab"> +        <property name="accessibleName"> +         <string>Profiles</string> +        </property>          <attribute name="title">           <string>Profiles</string>          </attribute>         </widget>         <widget class="ConfigureFilesystem" name="filesystemTab"> +        <property name="accessibleName"> +         <string>Filesystem</string> +        </property>          <attribute name="title">           <string>Filesystem</string>          </attribute>         </widget> -       <widget class="ConfigureInputSimple" name="inputTab"> +       <widget class="ConfigureInput" name="inputTab"> +        <property name="accessibleName"> +         <string>Controls</string> +        </property>          <attribute name="title"> -         <string>Input</string> +         <string>Controls</string>          </attribute>         </widget>         <widget class="ConfigureHotkeys" name="hotkeysTab"> +        <property name="accessibleName"> +         <string>Hotkeys</string> +        </property>          <attribute name="title">           <string>Hotkeys</string>          </attribute>         </widget>         <widget class="ConfigureCpu" name="cpuTab"> +        <property name="accessibleName"> +         <string>CPU</string> +        </property>          <attribute name="title">           <string>CPU</string>          </attribute>         </widget>         <widget class="ConfigureCpuDebug" name="cpuDebugTab"> +        <property name="accessibleName"> +         <string>Debug</string> +        </property>          <attribute name="title">           <string>Debug</string>          </attribute>         </widget>         <widget class="ConfigureGraphics" name="graphicsTab"> +        <property name="accessibleName"> +         <string>Graphics</string> +        </property>          <attribute name="title">           <string>Graphics</string>          </attribute>         </widget>         <widget class="ConfigureGraphicsAdvanced" name="graphicsAdvancedTab"> +        <property name="accessibleName"> +         <string>Advanced</string> +        </property>          <attribute name="title">           <string>GraphicsAdvanced</string>          </attribute>         </widget>         <widget class="ConfigureAudio" name="audioTab"> +        <property name="accessibleName"> +         <string>Audio</string> +        </property>          <attribute name="title">           <string>Audio</string>          </attribute>         </widget>         <widget class="ConfigureDebug" name="debugTab"> +        <property name="accessibleName"> +         <string>Debug</string> +        </property>          <attribute name="title">           <string>Debug</string>          </attribute>         </widget>         <widget class="ConfigureWeb" name="webTab"> +        <property name="accessibleName"> +         <string>Web</string> +        </property>          <attribute name="title">           <string>Web</string>          </attribute>         </widget>         <widget class="ConfigureService" name="serviceTab"> +        <property name="accessibleName"> +         <string>Services</string> +        </property>          <attribute name="title">           <string>Services</string>          </attribute> @@ -205,9 +250,9 @@     <container>1</container>    </customwidget>    <customwidget> -   <class>ConfigureInputSimple</class> +   <class>ConfigureInput</class>     <extends>QWidget</extends> -   <header>configuration/configure_input_simple.h</header> +   <header>configuration/configure_input.h</header>     <container>1</container>    </customwidget>    <customwidget> diff --git a/src/yuzu/configuration/configure_debug_controller.cpp b/src/yuzu/configuration/configure_debug_controller.cpp new file mode 100644 index 000000000..45996b73f --- /dev/null +++ b/src/yuzu/configuration/configure_debug_controller.cpp @@ -0,0 +1,39 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "ui_configure_debug_controller.h" +#include "yuzu/configuration/configure_debug_controller.h" + +ConfigureDebugController::ConfigureDebugController(QWidget* parent) +    : QDialog(parent), ui(std::make_unique<Ui::ConfigureDebugController>()) { +    ui->setupUi(this); + +    debug_controller = new ConfigureInputPlayer(this, 9, nullptr, true); +    ui->controllerLayout->addWidget(debug_controller); + +    connect(ui->clear_all_button, &QPushButton::clicked, this, +            [this] { debug_controller->ClearAll(); }); +    connect(ui->restore_defaults_button, &QPushButton::clicked, this, +            [this] { debug_controller->RestoreDefaults(); }); + +    RetranslateUI(); +} + +ConfigureDebugController::~ConfigureDebugController() = default; + +void ConfigureDebugController::ApplyConfiguration() { +    debug_controller->ApplyConfiguration(); +} + +void ConfigureDebugController::changeEvent(QEvent* event) { +    if (event->type() == QEvent::LanguageChange) { +        RetranslateUI(); +    } + +    QDialog::changeEvent(event); +} + +void ConfigureDebugController::RetranslateUI() { +    ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_debug_controller.h b/src/yuzu/configuration/configure_debug_controller.h new file mode 100644 index 000000000..df359a4f3 --- /dev/null +++ b/src/yuzu/configuration/configure_debug_controller.h @@ -0,0 +1,33 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include <QDialog> +#include "yuzu/configuration/configure_input_player.h" + +class QPushButton; + +namespace Ui { +class ConfigureDebugController; +} + +class ConfigureDebugController : public QDialog { +    Q_OBJECT + +public: +    explicit ConfigureDebugController(QWidget* parent); +    ~ConfigureDebugController() override; + +    void ApplyConfiguration(); + +private: +    void changeEvent(QEvent* event) override; +    void RetranslateUI(); + +    ConfigureInputPlayer* debug_controller; + +    std::unique_ptr<Ui::ConfigureDebugController> ui; +}; diff --git a/src/yuzu/configuration/configure_debug_controller.ui b/src/yuzu/configuration/configure_debug_controller.ui new file mode 100644 index 000000000..a95ed50ff --- /dev/null +++ b/src/yuzu/configuration/configure_debug_controller.ui @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureDebugController</class> + <widget class="QDialog" name="ConfigureDebugController"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>780</width> +    <height>500</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Configure Debug Controller</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <property name="spacing"> +    <number>2</number> +   </property> +   <property name="leftMargin"> +    <number>9</number> +   </property> +   <property name="topMargin"> +    <number>9</number> +   </property> +   <property name="rightMargin"> +    <number>9</number> +   </property> +   <property name="bottomMargin"> +    <number>9</number> +   </property> +   <item> +    <layout class="QHBoxLayout" name="controllerLayout"/> +   </item> +   <item> +    <layout class="QHBoxLayout" name="horizontalLayout"> +     <item> +      <widget class="QPushButton" name="clear_all_button"> +       <property name="text"> +        <string>Clear</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QPushButton" name="restore_defaults_button"> +       <property name="text"> +        <string>Defaults</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QDialogButtonBox" name="buttonBox"> +       <property name="standardButtons"> +        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +       </property> +      </widget> +     </item> +    </layout> +   </item> +  </layout> + </widget> + <resources/> + <connections> +  <connection> +   <sender>buttonBox</sender> +   <signal>accepted()</signal> +   <receiver>ConfigureDebugController</receiver> +   <slot>accept()</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>140</x> +     <y>318</y> +    </hint> +    <hint type="destinationlabel"> +     <x>140</x> +     <y>169</y> +    </hint> +   </hints> +  </connection> +  <connection> +   <sender>buttonBox</sender> +   <signal>rejected()</signal> +   <receiver>ConfigureDebugController</receiver> +   <slot>reject()</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>140</x> +     <y>318</y> +    </hint> +    <hint type="destinationlabel"> +     <x>140</x> +     <y>169</y> +    </hint> +   </hints> +  </connection> + </connections> +</ui> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 4e30dc51e..857577591 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -80,12 +80,12 @@ Q_DECLARE_METATYPE(QList<QWidget*>);  void ConfigureDialog::PopulateSelectionList() {      const std::array<std::pair<QString, QList<QWidget*>>, 6> items{ -        {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}}, +        {{tr("General"), {ui->generalTab, ui->hotkeysTab, ui->uiTab, ui->webTab, ui->debugTab}},           {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}},           {tr("CPU"), {ui->cpuTab, ui->cpuDebugTab}},           {tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}},           {tr("Audio"), {ui->audioTab}}, -         {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}}, +         {tr("Controls"), ui->inputTab->GetSubTabs()}},      };      [[maybe_unused]] const QSignalBlocker blocker(ui->selectorList); @@ -117,7 +117,7 @@ void ConfigureDialog::UpdateVisibleTabs() {          {ui->generalTab, tr("General")},          {ui->systemTab, tr("System")},          {ui->profileManagerTab, tr("Profiles")}, -        {ui->inputTab, tr("Input")}, +        {ui->inputTab, tr("Controls")},          {ui->hotkeysTab, tr("Hotkeys")},          {ui->cpuTab, tr("CPU")},          {ui->cpuDebugTab, tr("Debug")}, @@ -138,6 +138,6 @@ void ConfigureDialog::UpdateVisibleTabs() {      const QList<QWidget*> tabs = qvariant_cast<QList<QWidget*>>(items[0]->data(Qt::UserRole));      for (const auto tab : tabs) { -        ui->tabWidget->addTab(tab, widgets.at(tab)); +        ui->tabWidget->addTab(tab, tab->accessibleName());      }  } diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index f2977719c..5200d2d0e 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -8,18 +8,32 @@  #include <QSignalBlocker>  #include <QTimer> -#include "configuration/configure_touchscreen_advanced.h"  #include "core/core.h"  #include "core/hle/service/am/am.h"  #include "core/hle/service/am/applet_ae.h"  #include "core/hle/service/am/applet_oe.h" -#include "core/hle/service/hid/controllers/npad.h"  #include "core/hle/service/sm/sm.h"  #include "ui_configure_input.h" +#include "ui_configure_input_advanced.h"  #include "ui_configure_input_player.h" +#include "yuzu/configuration/configure_debug_controller.h"  #include "yuzu/configuration/configure_input.h" +#include "yuzu/configuration/configure_input_advanced.h"  #include "yuzu/configuration/configure_input_player.h"  #include "yuzu/configuration/configure_mouse_advanced.h" +#include "yuzu/configuration/configure_touchscreen_advanced.h" + +namespace { +template <typename Dialog, typename... Args> +void CallConfigureDialog(ConfigureInput& parent, Args&&... args) { +    Dialog dialog(&parent, std::forward<Args>(args)...); + +    const auto res = dialog.exec(); +    if (res == QDialog::Accepted) { +        dialog.ApplyConfiguration(); +    } +} +} // Anonymous namespace  void OnDockedModeChanged(bool last_state, bool new_state) {      if (last_state == new_state) { @@ -48,97 +62,93 @@ void OnDockedModeChanged(bool last_state, bool new_state) {      }  } -namespace { -template <typename Dialog, typename... Args> -void CallConfigureDialog(ConfigureInput& parent, Args&&... args) { -    parent.ApplyConfiguration(); -    Dialog dialog(&parent, std::forward<Args>(args)...); - -    const auto res = dialog.exec(); -    if (res == QDialog::Accepted) { -        dialog.ApplyConfiguration(); -    } -} -} // Anonymous namespace -  ConfigureInput::ConfigureInput(QWidget* parent) -    : QDialog(parent), ui(std::make_unique<Ui::ConfigureInput>()) { +    : QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {      ui->setupUi(this); -    players_controller = { -        ui->player1_combobox, ui->player2_combobox, ui->player3_combobox, ui->player4_combobox, -        ui->player5_combobox, ui->player6_combobox, ui->player7_combobox, ui->player8_combobox, +    player_controllers = { +        new ConfigureInputPlayer(this, 0, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 1, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 2, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 3, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 4, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 5, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 6, ui->consoleInputSettings), +        new ConfigureInputPlayer(this, 7, ui->consoleInputSettings),      }; -    players_configure = { -        ui->player1_configure, ui->player2_configure, ui->player3_configure, ui->player4_configure, -        ui->player5_configure, ui->player6_configure, ui->player7_configure, ui->player8_configure, +    player_tabs = { +        ui->tabPlayer1, ui->tabPlayer2, ui->tabPlayer3, ui->tabPlayer4, +        ui->tabPlayer5, ui->tabPlayer6, ui->tabPlayer7, ui->tabPlayer8,      }; -    RetranslateUI(); -    LoadConfiguration(); -    UpdateUIEnabled(); - -    connect(ui->restore_defaults_button, &QPushButton::clicked, this, -            &ConfigureInput::RestoreDefaults); +    player_connected = { +        ui->checkboxPlayer1Connected, ui->checkboxPlayer2Connected, ui->checkboxPlayer3Connected, +        ui->checkboxPlayer4Connected, ui->checkboxPlayer5Connected, ui->checkboxPlayer6Connected, +        ui->checkboxPlayer7Connected, ui->checkboxPlayer8Connected, +    }; -    for (auto* enabled : players_controller) { -        connect(enabled, QOverload<int>::of(&QComboBox::currentIndexChanged), this, -                &ConfigureInput::UpdateUIEnabled); +    for (std::size_t i = 0; i < player_tabs.size(); ++i) { +        player_tabs[i]->setLayout(new QHBoxLayout(player_tabs[i])); +        player_tabs[i]->layout()->addWidget(player_controllers[i]); +        connect(player_controllers[i], &ConfigureInputPlayer::Connected, [&, i](bool is_connected) { +            if (is_connected) { +                for (std::size_t index = 0; index <= i; ++index) { +                    player_connected[index]->setChecked(is_connected); +                } +            } else { +                for (std::size_t index = i; index < player_tabs.size(); ++index) { +                    player_connected[index]->setChecked(is_connected); +                } +            } +        }); +        connect(player_controllers[i], &ConfigureInputPlayer::RefreshInputDevices, +                [&] { UpdateAllInputDevices(); }); +        connect(player_connected[i], &QCheckBox::stateChanged, +                [&, i](int state) { player_controllers[i]->ConnectPlayer(state == Qt::Checked); });      } -    connect(ui->use_docked_mode, &QCheckBox::stateChanged, this, &ConfigureInput::UpdateUIEnabled); -    connect(ui->handheld_connected, &QCheckBox::stateChanged, this, -            &ConfigureInput::UpdateUIEnabled); -    connect(ui->mouse_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::UpdateUIEnabled); -    connect(ui->keyboard_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::UpdateUIEnabled); -    connect(ui->debug_enabled, &QCheckBox::stateChanged, this, &ConfigureInput::UpdateUIEnabled); -    connect(ui->touchscreen_enabled, &QCheckBox::stateChanged, this, -            &ConfigureInput::UpdateUIEnabled); - -    for (std::size_t i = 0; i < players_configure.size(); ++i) { -        connect(players_configure[i], &QPushButton::clicked, this, -                [this, i] { CallConfigureDialog<ConfigureInputPlayer>(*this, i, false); }); -    } - -    connect(ui->handheld_configure, &QPushButton::clicked, this, -            [this] { CallConfigureDialog<ConfigureInputPlayer>(*this, 8, false); }); - -    connect(ui->debug_configure, &QPushButton::clicked, this, -            [this] { CallConfigureDialog<ConfigureInputPlayer>(*this, 9, true); }); - -    connect(ui->mouse_advanced, &QPushButton::clicked, this, +    // Only the first player can choose handheld mode so connect the signal just to player 1 +    connect(player_controllers[0], &ConfigureInputPlayer::HandheldStateChanged, +            [&](bool is_handheld) { UpdateDockedState(is_handheld); }); + +    advanced = new ConfigureInputAdvanced(this); +    ui->tabAdvanced->setLayout(new QHBoxLayout(ui->tabAdvanced)); +    ui->tabAdvanced->layout()->addWidget(advanced); +    connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog, +            [this] { CallConfigureDialog<ConfigureDebugController>(*this); }); +    connect(advanced, &ConfigureInputAdvanced::CallMouseConfigDialog,              [this] { CallConfigureDialog<ConfigureMouseAdvanced>(*this); }); - -    connect(ui->touchscreen_advanced, &QPushButton::clicked, this, +    connect(advanced, &ConfigureInputAdvanced::CallTouchscreenConfigDialog,              [this] { CallConfigureDialog<ConfigureTouchscreenAdvanced>(*this); }); + +    connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); +    connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); }); + +    RetranslateUI(); +    LoadConfiguration();  }  ConfigureInput::~ConfigureInput() = default; -void ConfigureInput::ApplyConfiguration() { -    for (std::size_t i = 0; i < players_controller.size(); ++i) { -        const auto controller_type_index = players_controller[i]->currentIndex(); - -        Settings::values.players[i].connected = controller_type_index != 0; +QList<QWidget*> ConfigureInput::GetSubTabs() const { +    return { +        ui->tabPlayer1, ui->tabPlayer2, ui->tabPlayer3, ui->tabPlayer4,  ui->tabPlayer5, +        ui->tabPlayer6, ui->tabPlayer7, ui->tabPlayer8, ui->tabAdvanced, +    }; +} -        if (controller_type_index > 0) { -            Settings::values.players[i].type = -                static_cast<Settings::ControllerType>(controller_type_index - 1); -        } else { -            Settings::values.players[i].type = Settings::ControllerType::DualJoycon; -        } +void ConfigureInput::ApplyConfiguration() { +    for (auto controller : player_controllers) { +        controller->ApplyConfiguration();      } +    advanced->ApplyConfiguration(); +      const bool pre_docked_mode = Settings::values.use_docked_mode; -    Settings::values.use_docked_mode = ui->use_docked_mode->isChecked(); +    Settings::values.use_docked_mode = ui->radioDocked->isChecked();      OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode); -    Settings::values -        .players[Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD)] -        .connected = ui->handheld_connected->isChecked(); -    Settings::values.debug_pad_enabled = ui->debug_enabled->isChecked(); -    Settings::values.mouse_enabled = ui->mouse_enabled->isChecked(); -    Settings::values.keyboard_enabled = ui->keyboard_enabled->isChecked(); -    Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked(); + +    Settings::values.vibration_enabled = ui->vibrationGroup->isChecked();  }  void ConfigureInput::changeEvent(QEvent* event) { @@ -146,94 +156,63 @@ void ConfigureInput::changeEvent(QEvent* event) {          RetranslateUI();      } -    QDialog::changeEvent(event); +    QWidget::changeEvent(event);  }  void ConfigureInput::RetranslateUI() {      ui->retranslateUi(this); -    RetranslateControllerComboBoxes();  } -void ConfigureInput::RetranslateControllerComboBoxes() { -    for (auto* controller_box : players_controller) { -        [[maybe_unused]] const QSignalBlocker blocker(controller_box); - -        controller_box->clear(); -        controller_box->addItems({tr("None"), tr("Pro Controller"), tr("Dual Joycons"), -                                  tr("Single Right Joycon"), tr("Single Left Joycon")}); -    } - +void ConfigureInput::LoadConfiguration() {      LoadPlayerControllerIndices(); -} +    UpdateDockedState(Settings::values.players[0].controller_type == +                      Settings::ControllerType::Handheld); -void ConfigureInput::UpdateUIEnabled() { -    bool hit_disabled = false; -    for (auto* player : players_controller) { -        player->setDisabled(hit_disabled); -        if (hit_disabled) { -            player->setCurrentIndex(0); -        } -        if (!hit_disabled && player->currentIndex() == 0) { -            hit_disabled = true; -        } -    } +    ui->vibrationGroup->setChecked(Settings::values.vibration_enabled); +} -    for (std::size_t i = 0; i < players_controller.size(); ++i) { -        players_configure[i]->setEnabled(players_controller[i]->currentIndex() != 0); +void ConfigureInput::LoadPlayerControllerIndices() { +    for (std::size_t i = 0; i < player_connected.size(); ++i) { +        const auto connected = Settings::values.players[i].connected || +                               (i == 0 && Settings::values.players[8].connected); +        player_connected[i]->setChecked(connected);      } +} -    ui->handheld_connected->setChecked(ui->handheld_connected->isChecked() && -                                       !ui->use_docked_mode->isChecked()); -    ui->handheld_connected->setEnabled(!ui->use_docked_mode->isChecked()); -    ui->handheld_configure->setEnabled(ui->handheld_connected->isChecked() && -                                       !ui->use_docked_mode->isChecked()); -    ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked()); -    ui->debug_configure->setEnabled(ui->debug_enabled->isChecked()); -    ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked()); +void ConfigureInput::ClearAll() { +    // We don't have a good way to know what tab is active, but we can find out by getting the +    // parent of the consoleInputSettings +    auto player_tab = static_cast<ConfigureInputPlayer*>(ui->consoleInputSettings->parent()); +    player_tab->ClearAll();  } -void ConfigureInput::LoadConfiguration() { -    std::stable_partition( -        Settings::values.players.begin(), -        Settings::values.players.begin() + -            Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD), -        [](const auto& player) { return player.connected; }); +void ConfigureInput::RestoreDefaults() { +    // We don't have a good way to know what tab is active, but we can find out by getting the +    // parent of the consoleInputSettings +    auto player_tab = static_cast<ConfigureInputPlayer*>(ui->consoleInputSettings->parent()); +    player_tab->RestoreDefaults(); + +    ui->radioDocked->setChecked(true); +    ui->radioUndocked->setChecked(false); +    ui->vibrationGroup->setChecked(true); +} -    LoadPlayerControllerIndices(); +void ConfigureInput::UpdateDockedState(bool is_handheld) { +    // If the controller type is handheld only, disallow changing docked mode +    ui->radioDocked->setEnabled(!is_handheld); +    ui->radioUndocked->setEnabled(!is_handheld); -    ui->use_docked_mode->setChecked(Settings::values.use_docked_mode); -    ui->handheld_connected->setChecked( -        Settings::values -            .players[Service::HID::Controller_NPad::NPadIdToIndex(Service::HID::NPAD_HANDHELD)] -            .connected); -    ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled); -    ui->mouse_enabled->setChecked(Settings::values.mouse_enabled); -    ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled); -    ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled); - -    UpdateUIEnabled(); -} +    ui->radioDocked->setChecked(Settings::values.use_docked_mode); +    ui->radioUndocked->setChecked(!Settings::values.use_docked_mode); -void ConfigureInput::LoadPlayerControllerIndices() { -    for (std::size_t i = 0; i < players_controller.size(); ++i) { -        const auto connected = Settings::values.players[i].connected; -        players_controller[i]->setCurrentIndex( -            connected ? static_cast<u8>(Settings::values.players[i].type) + 1 : 0); +    // If its handheld only, force docked mode off (since you can't play handheld in a dock) +    if (is_handheld) { +        ui->radioUndocked->setChecked(true);      }  } -void ConfigureInput::RestoreDefaults() { -    players_controller[0]->setCurrentIndex(2); - -    for (std::size_t i = 1; i < players_controller.size(); ++i) { -        players_controller[i]->setCurrentIndex(0); +void ConfigureInput::UpdateAllInputDevices() { +    for (const auto& player : player_controllers) { +        player->UpdateInputDevices();      } - -    ui->use_docked_mode->setCheckState(Qt::Unchecked); -    ui->handheld_connected->setCheckState(Qt::Unchecked); -    ui->mouse_enabled->setCheckState(Qt::Unchecked); -    ui->keyboard_enabled->setCheckState(Qt::Unchecked); -    ui->debug_enabled->setCheckState(Qt::Unchecked); -    ui->touchscreen_enabled->setCheckState(Qt::Checked); -    UpdateUIEnabled();  } diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h index 2f70cb3ca..8241d23ef 100644 --- a/src/yuzu/configuration/configure_input.h +++ b/src/yuzu/configuration/configure_input.h @@ -10,11 +10,14 @@  #include <QDialog>  #include <QKeyEvent> +#include "yuzu/configuration/configure_input_advanced.h" +#include "yuzu/configuration/configure_input_player.h" +  #include "ui_configure_input.h" -class QPushButton;  class QString;  class QTimer; +class QCheckBox;  namespace Ui {  class ConfigureInput; @@ -22,22 +25,25 @@ class ConfigureInput;  void OnDockedModeChanged(bool last_state, bool new_state); -class ConfigureInput : public QDialog { +class ConfigureInput : public QWidget {      Q_OBJECT  public:      explicit ConfigureInput(QWidget* parent = nullptr);      ~ConfigureInput() override; -    /// Save all button configurations to settings file +    /// Save all button configurations to settings file.      void ApplyConfiguration(); +    QList<QWidget*> GetSubTabs() const; +  private:      void changeEvent(QEvent* event) override;      void RetranslateUI(); -    void RetranslateControllerComboBoxes(); +    void ClearAll(); -    void UpdateUIEnabled(); +    void UpdateDockedState(bool is_handheld); +    void UpdateAllInputDevices();      /// Load configuration settings.      void LoadConfiguration(); @@ -48,6 +54,8 @@ private:      std::unique_ptr<Ui::ConfigureInput> ui; -    std::array<QComboBox*, 8> players_controller; -    std::array<QPushButton*, 8> players_configure; +    std::array<ConfigureInputPlayer*, 8> player_controllers; +    std::array<QWidget*, 8> player_tabs; +    std::array<QCheckBox*, 8> player_connected; +    ConfigureInputAdvanced* advanced;  }; diff --git a/src/yuzu/configuration/configure_input.ui b/src/yuzu/configuration/configure_input.ui index efffd8487..136955224 100644 --- a/src/yuzu/configuration/configure_input.ui +++ b/src/yuzu/configuration/configure_input.ui @@ -1,529 +1,554 @@  <?xml version="1.0" encoding="UTF-8"?>  <ui version="4.0">   <class>ConfigureInput</class> - <widget class="QDialog" name="ConfigureInput"> + <widget class="QWidget" name="ConfigureInput">    <property name="geometry">     <rect>      <x>0</x>      <y>0</y> -    <width>384</width> -    <height>576</height> +    <width>700</width> +    <height>540</height>     </rect>    </property>    <property name="windowTitle"> -   <string>Custom Input Settings</string> +   <string>ConfigureInput</string>    </property>    <layout class="QVBoxLayout" name="verticalLayout_5"> +   <property name="spacing"> +    <number>2</number> +   </property> +   <property name="leftMargin"> +    <number>3</number> +   </property> +   <property name="topMargin"> +    <number>3</number> +   </property> +   <property name="rightMargin"> +    <number>3</number> +   </property> +   <property name="bottomMargin"> +    <number>3</number> +   </property>     <item> -    <layout class="QVBoxLayout" name="verticalLayout"> -     <item> -      <widget class="QGroupBox" name="gridGroupBox_1"> -       <property name="title"> -        <string>Players</string> -       </property> -       <layout class="QGridLayout" name="gridLayout"> -        <item row="1" column="2"> -         <widget class="QComboBox" name="player1_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="1" column="3"> -         <widget class="QPushButton" name="player1_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="0" column="2"> -         <widget class="QLabel" name="label"> -          <property name="text"> -           <string>Controller Type</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -         </widget> -        </item> -        <item row="2" column="2"> -         <widget class="QComboBox" name="player2_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="3" column="2"> -         <widget class="QComboBox" name="player3_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="4" column="2"> -         <widget class="QComboBox" name="player4_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="5" column="2"> -         <widget class="QComboBox" name="player5_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="6" column="2"> -         <widget class="QComboBox" name="player6_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="7" column="2"> -         <widget class="QComboBox" name="player7_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="8" column="2"> -         <widget class="QComboBox" name="player8_combobox"> -          <property name="minimumSize"> -           <size> -            <width>110</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="2" column="3"> -         <widget class="QPushButton" name="player2_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="3" column="3"> -         <widget class="QPushButton" name="player3_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="4" column="3"> -         <widget class="QPushButton" name="player4_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="5" column="3"> -         <widget class="QPushButton" name="player5_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="6" column="3"> -         <widget class="QPushButton" name="player6_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="7" column="3"> -         <widget class="QPushButton" name="player7_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="8" column="3"> -         <widget class="QPushButton" name="player8_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="0" column="0"> -         <spacer name="horizontalSpacer"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="0" column="4"> -         <spacer name="horizontalSpacer_2"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="1"> -         <widget class="QLabel" name="label_3"> -          <property name="minimumSize"> -           <size> -            <width>55</width> -            <height>0</height> -           </size> -          </property> -          <property name="text"> -           <string>Player 1</string> -          </property> -         </widget> -        </item> -        <item row="2" column="1"> -         <widget class="QLabel" name="label_4"> -          <property name="text"> -           <string>Player 2</string> -          </property> -         </widget> -        </item> -        <item row="3" column="1"> -         <widget class="QLabel" name="label_5"> -          <property name="text"> -           <string>Player 3</string> -          </property> -         </widget> -        </item> -        <item row="4" column="1"> -         <widget class="QLabel" name="label_6"> -          <property name="text"> -           <string>Player 4</string> -          </property> -         </widget> -        </item> -        <item row="5" column="1"> -         <widget class="QLabel" name="label_7"> -          <property name="text"> -           <string>Player 5</string> -          </property> -         </widget> -        </item> -        <item row="6" column="1"> -         <widget class="QLabel" name="label_8"> -          <property name="text"> -           <string>Player 6</string> -          </property> -         </widget> -        </item> -        <item row="7" column="1"> -         <widget class="QLabel" name="label_9"> -          <property name="text"> -           <string>Player 7</string> -          </property> -         </widget> -        </item> -        <item row="8" column="1"> -         <widget class="QLabel" name="label_10"> -          <property name="text"> -           <string>Player 8</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item> -      <widget class="QGroupBox" name="gridGroupBox_2"> -       <property name="title"> -        <string>Handheld</string> -       </property> -       <layout class="QGridLayout" name="gridLayout_2"> -        <item row="1" column="2"> -         <spacer name="horizontalSpacer_5"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeType"> -           <enum>QSizePolicy::Fixed</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>72</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="4"> -         <spacer name="horizontalSpacer_4"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="3"> -         <widget class="QPushButton" name="handheld_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="1" column="0"> -         <spacer name="horizontalSpacer_3"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="1"> -         <widget class="QCheckBox" name="handheld_connected"> -          <property name="text"> -           <string>Joycons Docked</string> -          </property> -         </widget> -        </item> -        <item row="0" column="1"> -         <widget class="QCheckBox" name="use_docked_mode"> -          <property name="text"> -           <string>Use Docked Mode</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item> -      <widget class="QGroupBox" name="gridGroupBox_3"> -       <property name="title"> -        <string>Other</string> -       </property> -       <layout class="QGridLayout" name="gridLayout_3"> -        <item row="1" column="1"> -         <widget class="QCheckBox" name="keyboard_enabled"> -          <property name="minimumSize"> -           <size> -            <width>0</width> -            <height>23</height> -           </size> -          </property> -          <property name="text"> -           <string>Keyboard</string> -          </property> -         </widget> -        </item> -        <item row="2" column="1"> -         <widget class="QCheckBox" name="debug_enabled"> -          <property name="text"> -           <string>Debug Controller</string> -          </property> -         </widget> -        </item> -        <item row="3" column="1"> -         <widget class="QCheckBox" name="touchscreen_enabled"> -          <property name="text"> -           <string>Touchscreen</string> -          </property> -         </widget> -        </item> -        <item row="0" column="1"> -         <widget class="QCheckBox" name="mouse_enabled"> -          <property name="minimumSize"> -           <size> -            <width>0</width> -            <height>23</height> -           </size> -          </property> -          <property name="text"> -           <string>Mouse</string> -          </property> -         </widget> -        </item> -        <item row="0" column="4"> -         <spacer name="horizontalSpacer_7"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="0" column="2"> -         <spacer name="horizontalSpacer_8"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeType"> -           <enum>QSizePolicy::Fixed</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>76</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="0" column="0"> -         <spacer name="horizontalSpacer_6"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="3" column="3"> -         <widget class="QPushButton" name="touchscreen_advanced"> -          <property name="text"> -           <string>Advanced</string> -          </property> -         </widget> -        </item> -        <item row="2" column="3"> -         <widget class="QPushButton" name="debug_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="0" column="3"> -         <widget class="QPushButton" name="mouse_advanced"> -          <property name="text"> -           <string>Advanced</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item> -      <spacer name="verticalSpacer"> -       <property name="orientation"> -        <enum>Qt::Vertical</enum> -       </property> -       <property name="sizeHint" stdset="0"> -        <size> -         <width>20</width> -         <height>40</height> -        </size> -       </property> -      </spacer> -     </item> -     <item> -      <layout class="QHBoxLayout" name="horizontalLayout"> -       <item> -        <widget class="QPushButton" name="restore_defaults_button"> -         <property name="text"> -          <string>Restore Defaults</string> +    <widget class="QTabWidget" name="tabWidget"> +     <property name="currentIndex"> +      <number>0</number> +     </property> +     <widget class="QWidget" name="tabPlayer1"> +      <property name="accessibleName"> +       <string>Player 1</string> +      </property> +      <attribute name="title"> +       <string>Player 1</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer2"> +      <property name="accessibleName"> +       <string>Player 2</string> +      </property> +      <attribute name="title"> +       <string>Player 2</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer3"> +      <property name="accessibleName"> +       <string>Player 3</string> +      </property> +      <attribute name="title"> +       <string>Player 3</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer4"> +      <property name="accessibleName"> +       <string>Player 4</string> +      </property> +      <attribute name="title"> +       <string>Player 4</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer5"> +      <property name="accessibleName"> +       <string>Player 5</string> +      </property> +      <attribute name="title"> +       <string>Player 5</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer6"> +      <property name="accessibleName"> +       <string>Player 6</string> +      </property> +      <attribute name="title"> +       <string>Player 6</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer7"> +      <property name="accessibleName"> +       <string>Player 7</string> +      </property> +      <attribute name="title"> +       <string>Player 7</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabPlayer8"> +      <property name="accessibleName"> +       <string>Player 8</string> +      </property> +      <attribute name="title"> +       <string>Player 8</string> +      </attribute> +     </widget> +     <widget class="QWidget" name="tabAdvanced"> +      <property name="accessibleName"> +       <string>Advanced</string> +      </property> +      <attribute name="title"> +       <string>Advanced</string> +      </attribute> +     </widget> +    </widget> +   </item> +   <item alignment="Qt::AlignVCenter"> +    <widget class="QWidget" name="consoleInputSettings" native="true"> +     <layout class="QHBoxLayout" name="buttonsBottomRightHorizontalLayout"> +      <property name="spacing"> +       <number>3</number> +      </property> +      <property name="leftMargin"> +       <number>0</number> +      </property> +      <property name="topMargin"> +       <number>3</number> +      </property> +      <property name="rightMargin"> +       <number>0</number> +      </property> +      <property name="bottomMargin"> +       <number>0</number> +      </property> +      <item alignment="Qt::AlignVCenter"> +       <widget class="QGroupBox" name="handheldGroup"> +        <property name="maximumSize"> +         <size> +          <width>16777215</width> +          <height>16777215</height> +         </size> +        </property> +        <property name="title"> +         <string>Console Mode</string> +        </property> +        <layout class="QHBoxLayout" name="horizontalLayout"> +         <property name="spacing"> +          <number>6</number> +         </property> +         <property name="leftMargin"> +          <number>3</number> +         </property> +         <property name="topMargin"> +          <number>6</number> +         </property> +         <property name="rightMargin"> +          <number>3</number> +         </property> +         <property name="bottomMargin"> +          <number>6</number> +         </property> +         <item> +          <widget class="QRadioButton" name="radioDocked"> +           <property name="text"> +            <string>Docked</string> +           </property> +           <property name="checked"> +            <bool>true</bool> +           </property> +          </widget> +         </item> +         <item> +          <widget class="QRadioButton" name="radioUndocked"> +           <property name="text"> +            <string>Undocked</string> +           </property> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +      <item> +       <widget class="QGroupBox" name="vibrationGroup"> +        <property name="title"> +         <string>Vibration</string> +        </property> +        <property name="checkable"> +         <bool>true</bool> +        </property> +        <layout class="QHBoxLayout" name="horizontalLayout_2"> +         <property name="leftMargin"> +          <number>3</number> +         </property> +         <property name="topMargin"> +          <number>3</number> +         </property> +         <property name="rightMargin"> +          <number>3</number> +         </property> +         <property name="bottomMargin"> +          <number>3</number> +         </property> +         <item> +          <widget class="QSpinBox" name="vibrationSpin"> +           <property name="minimumSize"> +            <size> +             <width>65</width> +             <height>21</height> +            </size> +           </property> +           <property name="maximumSize"> +            <size> +             <width>65</width> +             <height>16777215</height> +            </size> +           </property> +           <property name="suffix"> +            <string>%</string> +           </property> +           <property name="minimum"> +            <number>1</number> +           </property> +           <property name="maximum"> +            <number>200</number> +           </property> +           <property name="value"> +            <number>100</number> +           </property> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +      <item> +       <widget class="QGroupBox" name="motionGroup"> +        <property name="title"> +         <string>Motion</string> +        </property> +        <property name="checkable"> +         <bool>true</bool> +        </property> +        <layout class="QHBoxLayout" name="horizontalLayout_3"> +         <property name="leftMargin"> +          <number>3</number> +         </property> +         <property name="topMargin"> +          <number>3</number> +         </property> +         <property name="rightMargin"> +          <number>3</number> +         </property> +         <property name="bottomMargin"> +          <number>3</number> +         </property> +         <item> +          <widget class="QPushButton" name="motionButton"> +           <property name="minimumSize"> +            <size> +             <width>57</width> +             <height>0</height> +            </size> +           </property> +           <property name="maximumSize"> +            <size> +             <width>55</width> +             <height>16777215</height> +            </size> +           </property> +           <property name="styleSheet"> +            <string notr="true">min-width: 55px;</string> +           </property> +           <property name="text"> +            <string>Configure</string> +           </property> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +      <item alignment="Qt::AlignVCenter"> +       <widget class="QWidget" name="widget" native="true"> +        <layout class="QGridLayout" name="gridLayout_2"> +         <property name="leftMargin"> +          <number>5</number> +         </property> +         <property name="topMargin"> +          <number>0</number>           </property> -        </widget> -       </item> -       <item> -        <spacer name="horizontalSpacer_9"> -         <property name="orientation"> -          <enum>Qt::Horizontal</enum> +         <property name="rightMargin"> +          <number>0</number>           </property> -         <property name="sizeHint" stdset="0"> -          <size> -           <width>40</width> -           <height>20</height> -          </size> +         <property name="bottomMargin"> +          <number>0</number>           </property> -        </spacer> -       </item> -       <item> -        <widget class="QDialogButtonBox" name="buttonBox"> -         <property name="standardButtons"> -          <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +         <property name="spacing"> +          <number>3</number>           </property> -        </widget> -       </item> -      </layout> -     </item> -    </layout> +         <item row="1" column="2"> +          <widget class="QCheckBox" name="checkboxPlayer2Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="1" column="0"> +          <widget class="QLabel" name="label_2"> +           <property name="text"> +            <string>Controllers</string> +           </property> +          </widget> +         </item> +         <item row="1" column="4"> +          <widget class="QCheckBox" name="checkboxPlayer4Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="1" column="3"> +          <widget class="QCheckBox" name="checkboxPlayer3Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="1" column="5"> +          <widget class="QCheckBox" name="checkboxPlayer5Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="0" column="1"> +          <widget class="QLabel" name="label"> +           <property name="text"> +            <string>1</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="1" column="7"> +          <widget class="QCheckBox" name="checkboxPlayer7Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="1" column="6"> +          <widget class="QCheckBox" name="checkboxPlayer6Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="1" column="1"> +          <widget class="QCheckBox" name="checkboxPlayer1Connected"> +           <property name="layoutDirection"> +            <enum>Qt::LeftToRight</enum> +           </property> +           <property name="checked"> +            <bool>true</bool> +           </property> +          </widget> +         </item> +         <item row="1" column="8"> +          <widget class="QCheckBox" name="checkboxPlayer8Connected"> +           <property name="text"> +            <string/> +           </property> +          </widget> +         </item> +         <item row="0" column="2"> +          <widget class="QLabel" name="label_3"> +           <property name="text"> +            <string>2</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="3"> +          <widget class="QLabel" name="label_4"> +           <property name="text"> +            <string>3</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="4"> +          <widget class="QLabel" name="label_5"> +           <property name="text"> +            <string>4</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="5"> +          <widget class="QLabel" name="label_6"> +           <property name="text"> +            <string>5</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="6"> +          <widget class="QLabel" name="label_7"> +           <property name="text"> +            <string>6</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="7"> +          <widget class="QLabel" name="label_8"> +           <property name="text"> +            <string>7</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="8"> +          <widget class="QLabel" name="label_9"> +           <property name="text"> +            <string>8</string> +           </property> +           <property name="alignment"> +            <set>Qt::AlignCenter</set> +           </property> +          </widget> +         </item> +         <item row="0" column="0"> +          <widget class="QLabel" name="label_10"> +           <property name="text"> +            <string>Connected</string> +           </property> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +      <item> +       <spacer name="horizontalSpacer"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>40</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +      <item alignment="Qt::AlignBottom"> +       <widget class="QPushButton" name="buttonRestoreDefaults"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> +          <horstretch>0</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>57</width> +          <height>0</height> +         </size> +        </property> +        <property name="maximumSize"> +         <size> +          <width>55</width> +          <height>16777215</height> +         </size> +        </property> +        <property name="sizeIncrement"> +         <size> +          <width>0</width> +          <height>0</height> +         </size> +        </property> +        <property name="baseSize"> +         <size> +          <width>0</width> +          <height>0</height> +         </size> +        </property> +        <property name="layoutDirection"> +         <enum>Qt::LeftToRight</enum> +        </property> +        <property name="styleSheet"> +         <string notr="true">min-width: 55px;</string> +        </property> +        <property name="text"> +         <string>Defaults</string> +        </property> +       </widget> +      </item> +      <item alignment="Qt::AlignBottom"> +       <widget class="QPushButton" name="buttonClearAll"> +        <property name="sizePolicy"> +         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> +          <horstretch>0</horstretch> +          <verstretch>0</verstretch> +         </sizepolicy> +        </property> +        <property name="minimumSize"> +         <size> +          <width>57</width> +          <height>0</height> +         </size> +        </property> +        <property name="maximumSize"> +         <size> +          <width>55</width> +          <height>16777215</height> +         </size> +        </property> +        <property name="sizeIncrement"> +         <size> +          <width>0</width> +          <height>0</height> +         </size> +        </property> +        <property name="baseSize"> +         <size> +          <width>0</width> +          <height>0</height> +         </size> +        </property> +        <property name="layoutDirection"> +         <enum>Qt::LeftToRight</enum> +        </property> +        <property name="styleSheet"> +         <string notr="true">min-width: 55px;</string> +        </property> +        <property name="text"> +         <string>Clear</string> +        </property> +       </widget> +      </item> +     </layout> +    </widget>     </item>    </layout>   </widget>   <resources/> - <connections> -  <connection> -   <sender>buttonBox</sender> -   <signal>accepted()</signal> -   <receiver>ConfigureInput</receiver> -   <slot>accept()</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>294</x> -     <y>553</y> -    </hint> -    <hint type="destinationlabel"> -     <x>191</x> -     <y>287</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>buttonBox</sender> -   <signal>rejected()</signal> -   <receiver>ConfigureInput</receiver> -   <slot>reject()</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>294</x> -     <y>553</y> -    </hint> -    <hint type="destinationlabel"> -     <x>191</x> -     <y>287</y> -    </hint> -   </hints> -  </connection> - </connections> + <connections/>  </ui> diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp new file mode 100644 index 000000000..18db04e7e --- /dev/null +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -0,0 +1,169 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QColorDialog> +#include "core/core.h" +#include "core/settings.h" +#include "ui_configure_input_advanced.h" +#include "yuzu/configuration/configure_input_advanced.h" + +ConfigureInputAdvanced::ConfigureInputAdvanced(QWidget* parent) +    : QWidget(parent), ui(new Ui::ConfigureInputAdvanced) { +    ui->setupUi(this); + +    controllers_color_buttons = {{ +        { +            ui->player1_left_body_button, +            ui->player1_left_buttons_button, +            ui->player1_right_body_button, +            ui->player1_right_buttons_button, +        }, +        { +            ui->player2_left_body_button, +            ui->player2_left_buttons_button, +            ui->player2_right_body_button, +            ui->player2_right_buttons_button, +        }, +        { +            ui->player3_left_body_button, +            ui->player3_left_buttons_button, +            ui->player3_right_body_button, +            ui->player3_right_buttons_button, +        }, +        { +            ui->player4_left_body_button, +            ui->player4_left_buttons_button, +            ui->player4_right_body_button, +            ui->player4_right_buttons_button, +        }, +        { +            ui->player5_left_body_button, +            ui->player5_left_buttons_button, +            ui->player5_right_body_button, +            ui->player5_right_buttons_button, +        }, +        { +            ui->player6_left_body_button, +            ui->player6_left_buttons_button, +            ui->player6_right_body_button, +            ui->player6_right_buttons_button, +        }, +        { +            ui->player7_left_body_button, +            ui->player7_left_buttons_button, +            ui->player7_right_body_button, +            ui->player7_right_buttons_button, +        }, +        { +            ui->player8_left_body_button, +            ui->player8_left_buttons_button, +            ui->player8_right_body_button, +            ui->player8_right_buttons_button, +        }, +    }}; + +    for (std::size_t player_idx = 0; player_idx < controllers_color_buttons.size(); ++player_idx) { +        auto& color_buttons = controllers_color_buttons[player_idx]; +        for (std::size_t button_idx = 0; button_idx < color_buttons.size(); ++button_idx) { +            connect(color_buttons[button_idx], &QPushButton::clicked, this, +                    [this, player_idx, button_idx] { +                        OnControllerButtonClick(static_cast<int>(player_idx), +                                                static_cast<int>(button_idx)); +                    }); +        } +    } + +    connect(ui->mouse_enabled, &QCheckBox::stateChanged, this, +            &ConfigureInputAdvanced::UpdateUIEnabled); +    connect(ui->debug_enabled, &QCheckBox::stateChanged, this, +            &ConfigureInputAdvanced::UpdateUIEnabled); +    connect(ui->touchscreen_enabled, &QCheckBox::stateChanged, this, +            &ConfigureInputAdvanced::UpdateUIEnabled); + +    connect(ui->debug_configure, &QPushButton::clicked, this, +            [this] { CallDebugControllerDialog(); }); +    connect(ui->mouse_advanced, &QPushButton::clicked, this, [this] { CallMouseConfigDialog(); }); +    connect(ui->touchscreen_advanced, &QPushButton::clicked, this, +            [this] { CallTouchscreenConfigDialog(); }); + +    LoadConfiguration(); +} + +ConfigureInputAdvanced::~ConfigureInputAdvanced() = default; + +void ConfigureInputAdvanced::OnControllerButtonClick(int player_idx, int button_idx) { +    const QColor new_bg_color = QColorDialog::getColor(controllers_colors[player_idx][button_idx]); +    if (!new_bg_color.isValid()) { +        return; +    } +    controllers_colors[player_idx][button_idx] = new_bg_color; +    controllers_color_buttons[player_idx][button_idx]->setStyleSheet( +        QStringLiteral("background-color: %1; min-width: 55px;") +            .arg(controllers_colors[player_idx][button_idx].name())); +} + +void ConfigureInputAdvanced::ApplyConfiguration() { +    for (std::size_t player_idx = 0; player_idx < controllers_color_buttons.size(); ++player_idx) { +        auto& player = Settings::values.players[player_idx]; +        std::array<u32, 4> colors{}; +        std::transform(controllers_colors[player_idx].begin(), controllers_colors[player_idx].end(), +                       colors.begin(), [](QColor color) { return color.rgb(); }); + +        player.body_color_left = colors[0]; +        player.button_color_left = colors[1]; +        player.body_color_right = colors[2]; +        player.button_color_right = colors[3]; +    } + +    Settings::values.debug_pad_enabled = ui->debug_enabled->isChecked(); +    Settings::values.mouse_enabled = ui->mouse_enabled->isChecked(); +    Settings::values.keyboard_enabled = ui->keyboard_enabled->isChecked(); +    Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked(); +} + +void ConfigureInputAdvanced::LoadConfiguration() { +    for (std::size_t player_idx = 0; player_idx < controllers_color_buttons.size(); ++player_idx) { +        auto& player = Settings::values.players[player_idx]; +        std::array<u32, 4> colors = { +            player.body_color_left, +            player.button_color_left, +            player.body_color_right, +            player.button_color_right, +        }; + +        std::transform(colors.begin(), colors.end(), controllers_colors[player_idx].begin(), +                       [](u32 rgb) { return QColor::fromRgb(rgb); }); + +        for (std::size_t button_idx = 0; button_idx < colors.size(); ++button_idx) { +            controllers_color_buttons[player_idx][button_idx]->setStyleSheet( +                QStringLiteral("background-color: %1; min-width: 55px;") +                    .arg(controllers_colors[player_idx][button_idx].name())); +        } +    } + +    ui->debug_enabled->setChecked(Settings::values.debug_pad_enabled); +    ui->mouse_enabled->setChecked(Settings::values.mouse_enabled); +    ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled); +    ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled); + +    UpdateUIEnabled(); +} + +void ConfigureInputAdvanced::changeEvent(QEvent* event) { +    if (event->type() == QEvent::LanguageChange) { +        RetranslateUI(); +    } + +    QWidget::changeEvent(event); +} + +void ConfigureInputAdvanced::RetranslateUI() { +    ui->retranslateUi(this); +} + +void ConfigureInputAdvanced::UpdateUIEnabled() { +    ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked()); +    ui->debug_configure->setEnabled(ui->debug_enabled->isChecked()); +    ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked()); +} diff --git a/src/yuzu/configuration/configure_input_advanced.h b/src/yuzu/configuration/configure_input_advanced.h new file mode 100644 index 000000000..d6e913675 --- /dev/null +++ b/src/yuzu/configuration/configure_input_advanced.h @@ -0,0 +1,44 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include <QWidget> + +class QColor; +class QPushButton; + +namespace Ui { +class ConfigureInputAdvanced; +} + +class ConfigureInputAdvanced : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureInputAdvanced(QWidget* parent = nullptr); +    ~ConfigureInputAdvanced() override; + +    void ApplyConfiguration(); + +signals: +    void CallDebugControllerDialog(); +    void CallMouseConfigDialog(); +    void CallTouchscreenConfigDialog(); + +private: +    void changeEvent(QEvent* event) override; +    void RetranslateUI(); +    void UpdateUIEnabled(); + +    void OnControllerButtonClick(int player_idx, int button_idx); + +    void LoadConfiguration(); + +    std::unique_ptr<Ui::ConfigureInputAdvanced> ui; + +    std::array<std::array<QColor, 4>, 8> controllers_colors; +    std::array<std::array<QPushButton*, 4>, 8> controllers_color_buttons; +}; diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui new file mode 100644 index 000000000..5958435fc --- /dev/null +++ b/src/yuzu/configuration/configure_input_advanced.ui @@ -0,0 +1,2688 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureInputAdvanced</class> + <widget class="QWidget" name="ConfigureInputAdvanced"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>710</width> +    <height>580</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Configure Input</string> +  </property> +  <property name="styleSheet"> +   <string notr="true"/> +  </property> +  <layout class="QHBoxLayout" name="horizontalLayout"> +   <property name="spacing"> +    <number>0</number> +   </property> +   <property name="leftMargin"> +    <number>0</number> +   </property> +   <property name="topMargin"> +    <number>0</number> +   </property> +   <property name="rightMargin"> +    <number>0</number> +   </property> +   <property name="bottomMargin"> +    <number>0</number> +   </property> +   <item> +    <widget class="QWidget" name="mainInputAdvanced" native="true"> +     <layout class="QHBoxLayout" name="main" stretch="1,1"> +      <property name="spacing"> +       <number>9</number> +      </property> +      <property name="leftMargin"> +       <number>0</number> +      </property> +      <property name="topMargin"> +       <number>0</number> +      </property> +      <property name="rightMargin"> +       <number>0</number> +      </property> +      <property name="bottomMargin"> +       <number>0</number> +      </property> +      <item> +       <widget class="QWidget" name="leftInputAdvanced" native="true"> +        <layout class="QVBoxLayout" name="leftLayout" stretch="0"> +         <property name="spacing"> +          <number>3</number> +         </property> +         <property name="leftMargin"> +          <number>0</number> +         </property> +         <property name="topMargin"> +          <number>0</number> +         </property> +         <property name="rightMargin"> +          <number>0</number> +         </property> +         <property name="bottomMargin"> +          <number>0</number> +         </property> +         <item> +          <widget class="QGroupBox" name="joyconColorsGroup"> +           <property name="title"> +            <string>Joycon Colors</string> +           </property> +           <layout class="QVBoxLayout" name="verticalLayout_3" stretch="1,1"> +            <property name="leftMargin"> +             <number>9</number> +            </property> +            <property name="topMargin"> +             <number>9</number> +            </property> +            <property name="rightMargin"> +             <number>9</number> +            </property> +            <property name="bottomMargin"> +             <number>9</number> +            </property> +            <item> +             <widget class="QWidget" name="topLeftInputAdvanced" native="true"> +              <layout class="QVBoxLayout" name="verticalLayout_4"> +               <property name="spacing"> +                <number>6</number> +               </property> +               <property name="leftMargin"> +                <number>0</number> +               </property> +               <property name="topMargin"> +                <number>0</number> +               </property> +               <property name="rightMargin"> +                <number>0</number> +               </property> +               <property name="bottomMargin"> +                <number>0</number> +               </property> +               <item> +                <widget class="QWidget" name="player12Widget" native="true"> +                 <layout class="QHBoxLayout" name="horizontalLayout_4"> +                  <property name="leftMargin"> +                   <number>0</number> +                  </property> +                  <property name="topMargin"> +                   <number>0</number> +                  </property> +                  <property name="rightMargin"> +                   <number>0</number> +                  </property> +                  <property name="bottomMargin"> +                   <number>0</number> +                  </property> +                  <item> +                   <widget class="QGroupBox" name="player1Group"> +                    <property name="title"> +                     <string>Player 1</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_2"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player1LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_14"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player1LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_66"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player1_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player1LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_67"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player1_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player1RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_14"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player1RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_64"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player1_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player1RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_65"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player1_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                  <item> +                   <widget class="QGroupBox" name="player2Group"> +                    <property name="title"> +                     <string>Player 2</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_14"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player2LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_15"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player2LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_70"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player2_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player2LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_71"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player2_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player2RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_15"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player2RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_68"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player2_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player2RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_69"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player2_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                 </layout> +                </widget> +               </item> +               <item> +                <widget class="QWidget" name="player34Widget" native="true"> +                 <layout class="QHBoxLayout" name="horizontalLayout_5"> +                  <property name="leftMargin"> +                   <number>0</number> +                  </property> +                  <property name="topMargin"> +                   <number>0</number> +                  </property> +                  <property name="rightMargin"> +                   <number>0</number> +                  </property> +                  <property name="bottomMargin"> +                   <number>0</number> +                  </property> +                  <item> +                   <widget class="QGroupBox" name="player3Group"> +                    <property name="title"> +                     <string>Player 3</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_15"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player3LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_16"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player3LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_74"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player3_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player3LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_75"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player3_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player3RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_16"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player3RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_72"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player3_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player3RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_73"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player3_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                  <item> +                   <widget class="QGroupBox" name="player4Group"> +                    <property name="title"> +                     <string>Player 4</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_16"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player4LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_17"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player4LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_78"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player4_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player4LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_79"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player4_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player4RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_17"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player4RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_76"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player4_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player4RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_77"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player4_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                 </layout> +                </widget> +               </item> +              </layout> +             </widget> +            </item> +            <item> +             <widget class="QWidget" name="bottomLeftInputAdvanced" native="true"> +              <layout class="QVBoxLayout" name="verticalLayout_5"> +               <property name="spacing"> +                <number>6</number> +               </property> +               <property name="leftMargin"> +                <number>0</number> +               </property> +               <property name="topMargin"> +                <number>0</number> +               </property> +               <property name="rightMargin"> +                <number>0</number> +               </property> +               <property name="bottomMargin"> +                <number>0</number> +               </property> +               <item> +                <widget class="QWidget" name="player56Widget" native="true"> +                 <layout class="QHBoxLayout" name="horizontalLayout_6"> +                  <property name="leftMargin"> +                   <number>0</number> +                  </property> +                  <property name="topMargin"> +                   <number>0</number> +                  </property> +                  <property name="rightMargin"> +                   <number>0</number> +                  </property> +                  <property name="bottomMargin"> +                   <number>0</number> +                  </property> +                  <item> +                   <widget class="QGroupBox" name="player5Group"> +                    <property name="title"> +                     <string>Player 5</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_10"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player5LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_10"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player5LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_50"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player5_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player5LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_51"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player5_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player5RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_10"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player5RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_48"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player5_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player5RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_49"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player5_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                  <item> +                   <widget class="QGroupBox" name="player6Group"> +                    <property name="title"> +                     <string>Player 6</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_11"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player6LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_11"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player6LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_54"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player6_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player6LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_55"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player6_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player6RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_11"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player6RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_52"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player6_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player6RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_53"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player6_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                 </layout> +                </widget> +               </item> +               <item> +                <widget class="QWidget" name="player78Widget" native="true"> +                 <layout class="QHBoxLayout" name="horizontalLayout_7"> +                  <property name="leftMargin"> +                   <number>0</number> +                  </property> +                  <property name="topMargin"> +                   <number>0</number> +                  </property> +                  <property name="rightMargin"> +                   <number>0</number> +                  </property> +                  <property name="bottomMargin"> +                   <number>0</number> +                  </property> +                  <item> +                   <widget class="QGroupBox" name="player7Group"> +                    <property name="title"> +                     <string>Player 7</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_12"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player7LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_12"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player7LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_58"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player7_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player7LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_59"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player7_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player7RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_12"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player7RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_56"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player7_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player7RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_57"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player7_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                  <item> +                   <widget class="QGroupBox" name="player8Group"> +                    <property name="title"> +                     <string>Player 8</string> +                    </property> +                    <layout class="QHBoxLayout" name="horizontalLayout_13"> +                     <property name="spacing"> +                      <number>6</number> +                     </property> +                     <property name="leftMargin"> +                      <number>6</number> +                     </property> +                     <property name="topMargin"> +                      <number>0</number> +                     </property> +                     <property name="rightMargin"> +                      <number>6</number> +                     </property> +                     <property name="bottomMargin"> +                      <number>6</number> +                     </property> +                     <item> +                      <widget class="QWidget" name="player8LeftJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsLeftJoyconVerticalLayout_13"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player8LeftBodyGroup"> +                          <property name="title"> +                           <string>L Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_62"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player8_left_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player8LeftButtonsGroup"> +                          <property name="title"> +                           <string>L Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_63"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player8_left_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                     <item> +                      <widget class="QWidget" name="player8RightJoycon" native="true"> +                       <layout class="QVBoxLayout" name="buttonMiscButtonsRightJoyconVerticalLayout_13"> +                        <property name="spacing"> +                         <number>0</number> +                        </property> +                        <property name="leftMargin"> +                         <number>0</number> +                        </property> +                        <property name="topMargin"> +                         <number>0</number> +                        </property> +                        <property name="rightMargin"> +                         <number>0</number> +                        </property> +                        <property name="bottomMargin"> +                         <number>0</number> +                        </property> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player8RightBodyGroup"> +                          <property name="title"> +                           <string>R Body</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_60"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player8_right_body_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                        <item alignment="Qt::AlignHCenter"> +                         <widget class="QGroupBox" name="player8RightButtonsGroup"> +                          <property name="title"> +                           <string>R Button</string> +                          </property> +                          <property name="alignment"> +                           <set>Qt::AlignCenter</set> +                          </property> +                          <layout class="QVBoxLayout" name="verticalLayout_61"> +                           <property name="spacing"> +                            <number>3</number> +                           </property> +                           <property name="leftMargin"> +                            <number>3</number> +                           </property> +                           <property name="topMargin"> +                            <number>3</number> +                           </property> +                           <property name="rightMargin"> +                            <number>3</number> +                           </property> +                           <property name="bottomMargin"> +                            <number>3</number> +                           </property> +                           <item> +                            <widget class="QPushButton" name="player8_right_buttons_button"> +                             <property name="sizePolicy"> +                              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +                               <horstretch>0</horstretch> +                               <verstretch>0</verstretch> +                              </sizepolicy> +                             </property> +                             <property name="minimumSize"> +                              <size> +                               <width>57</width> +                               <height>0</height> +                              </size> +                             </property> +                             <property name="maximumSize"> +                              <size> +                               <width>55</width> +                               <height>16777215</height> +                              </size> +                             </property> +                             <property name="styleSheet"> +                              <string notr="true">min-width: 55px;</string> +                             </property> +                             <property name="text"> +                              <string/> +                             </property> +                            </widget> +                           </item> +                          </layout> +                         </widget> +                        </item> +                       </layout> +                      </widget> +                     </item> +                    </layout> +                   </widget> +                  </item> +                 </layout> +                </widget> +               </item> +              </layout> +             </widget> +            </item> +           </layout> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +      <item> +       <widget class="QWidget" name="rightInputAdvanced" native="true"> +        <layout class="QVBoxLayout" name="rightLayout" stretch="1,1"> +         <property name="spacing"> +          <number>3</number> +         </property> +         <property name="leftMargin"> +          <number>0</number> +         </property> +         <property name="topMargin"> +          <number>0</number> +         </property> +         <property name="rightMargin"> +          <number>0</number> +         </property> +         <property name="bottomMargin"> +          <number>0</number> +         </property> +         <item> +          <widget class="QWidget" name="topRightInputAdvanced" native="true"> +           <layout class="QVBoxLayout" name="verticalLayout"> +            <property name="leftMargin"> +             <number>0</number> +            </property> +            <property name="topMargin"> +             <number>0</number> +            </property> +            <property name="rightMargin"> +             <number>0</number> +            </property> +            <property name="bottomMargin"> +             <number>0</number> +            </property> +            <item> +             <widget class="QGroupBox" name="gridGroupBox_3"> +              <property name="title"> +               <string>Other</string> +              </property> +              <layout class="QGridLayout" name="gridLayout_3"> +               <item row="0" column="0"> +                <widget class="QCheckBox" name="keyboard_enabled"> +                 <property name="minimumSize"> +                  <size> +                   <width>0</width> +                   <height>23</height> +                  </size> +                 </property> +                 <property name="text"> +                  <string>Keyboard</string> +                 </property> +                </widget> +               </item> +               <item row="4" column="2"> +                <widget class="QPushButton" name="touchscreen_advanced"> +                 <property name="text"> +                  <string>Advanced</string> +                 </property> +                </widget> +               </item> +               <item row="1" column="1"> +                <spacer name="horizontalSpacer_8"> +                 <property name="orientation"> +                  <enum>Qt::Horizontal</enum> +                 </property> +                 <property name="sizeType"> +                  <enum>QSizePolicy::Fixed</enum> +                 </property> +                 <property name="sizeHint" stdset="0"> +                  <size> +                   <width>76</width> +                   <height>20</height> +                  </size> +                 </property> +                </spacer> +               </item> +               <item row="1" column="2"> +                <widget class="QPushButton" name="mouse_advanced"> +                 <property name="text"> +                  <string>Advanced</string> +                 </property> +                </widget> +               </item> +               <item row="4" column="0"> +                <widget class="QCheckBox" name="touchscreen_enabled"> +                 <property name="text"> +                  <string>Touchscreen</string> +                 </property> +                </widget> +               </item> +               <item row="1" column="0"> +                <widget class="QCheckBox" name="mouse_enabled"> +                 <property name="minimumSize"> +                  <size> +                   <width>0</width> +                   <height>23</height> +                  </size> +                 </property> +                 <property name="text"> +                  <string>Mouse</string> +                 </property> +                </widget> +               </item> +               <item row="6" column="0"> +                <widget class="QLabel" name="motion_touch"> +                 <property name="text"> +                  <string>Motion / Touch</string> +                 </property> +                </widget> +               </item> +               <item row="6" column="2"> +                <widget class="QPushButton" name="buttonMotionTouch"> +                 <property name="text"> +                  <string>Configure</string> +                 </property> +                </widget> +               </item> +               <item row="5" column="0"> +                <widget class="QCheckBox" name="debug_enabled"> +                 <property name="text"> +                  <string>Debug Controller</string> +                 </property> +                </widget> +               </item> +               <item row="5" column="2"> +                <widget class="QPushButton" name="debug_configure"> +                 <property name="text"> +                  <string>Configure</string> +                 </property> +                </widget> +               </item> +              </layout> +             </widget> +            </item> +            <item> +             <spacer name="verticalSpacer"> +              <property name="orientation"> +               <enum>Qt::Vertical</enum> +              </property> +              <property name="sizeHint" stdset="0"> +               <size> +                <width>20</width> +                <height>40</height> +               </size> +              </property> +             </spacer> +            </item> +           </layout> +          </widget> +         </item> +         <item> +          <widget class="QWidget" name="bottomRightInputAdvanced" native="true"> +           <layout class="QVBoxLayout" name="verticalLayout_2"> +            <property name="leftMargin"> +             <number>0</number> +            </property> +            <property name="topMargin"> +             <number>0</number> +            </property> +            <property name="rightMargin"> +             <number>0</number> +            </property> +            <property name="bottomMargin"> +             <number>0</number> +            </property> +            <item> +             <spacer name="mainVerticalSpacer"> +              <property name="orientation"> +               <enum>Qt::Vertical</enum> +              </property> +              <property name="sizeHint" stdset="0"> +               <size> +                <width>20</width> +                <height>40</height> +               </size> +              </property> +             </spacer> +            </item> +           </layout> +          </widget> +         </item> +        </layout> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +  </layout> + </widget> + <resources> + </resources> + <connections/> +</ui> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 597defe8c..4d79a51f3 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -5,38 +5,86 @@  #include <algorithm>  #include <memory>  #include <utility> -#include <QColorDialog>  #include <QGridLayout> +#include <QInputDialog>  #include <QKeyEvent>  #include <QMenu>  #include <QMessageBox>  #include <QTimer>  #include "common/assert.h"  #include "common/param_package.h" +#include "core/core.h" +#include "core/hle/service/hid/controllers/npad.h" +#include "core/hle/service/hid/hid.h" +#include "core/hle/service/sm/sm.h"  #include "input_common/main.h"  #include "ui_configure_input_player.h"  #include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_input_player.h" +constexpr std::size_t HANDHELD_INDEX = 8; +  const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM>      ConfigureInputPlayer::analog_sub_buttons{{          "up",          "down",          "left",          "right", -        "modifier",      }}; -static void LayerGridElements(QGridLayout* grid, QWidget* item, QWidget* onTopOf) { -    const int index1 = grid->indexOf(item); -    const int index2 = grid->indexOf(onTopOf); -    int row, column, rowSpan, columnSpan; -    grid->getItemPosition(index2, &row, &column, &rowSpan, &columnSpan); -    grid->takeAt(index1); -    grid->addWidget(item, row, column, rowSpan, columnSpan); +namespace { + +void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index, +                      bool connected) { +    Core::System& system{Core::System::GetInstance()}; +    if (!system.IsPoweredOn()) { +        return; +    } +    Service::SM::ServiceManager& sm = system.ServiceManager(); + +    auto& npad = +        sm.GetService<Service::HID::Hid>("hid") +            ->GetAppletResource() +            ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad); + +    npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected); +} + +/// Maps the controller type combobox index to Controller Type enum +constexpr Settings::ControllerType GetControllerTypeFromIndex(int index) { +    switch (index) { +    case 0: +    default: +        return Settings::ControllerType::ProController; +    case 1: +        return Settings::ControllerType::DualJoyconDetached; +    case 2: +        return Settings::ControllerType::LeftJoycon; +    case 3: +        return Settings::ControllerType::RightJoycon; +    case 4: +        return Settings::ControllerType::Handheld; +    } +} + +/// Maps the Controller Type enum to controller type combobox index +constexpr int GetIndexFromControllerType(Settings::ControllerType type) { +    switch (type) { +    case Settings::ControllerType::ProController: +    default: +        return 0; +    case Settings::ControllerType::DualJoyconDetached: +        return 1; +    case Settings::ControllerType::LeftJoycon: +        return 2; +    case Settings::ControllerType::RightJoycon: +        return 3; +    case Settings::ControllerType::Handheld: +        return 4; +    }  } -static QString GetKeyName(int key_code) { +QString GetKeyName(int key_code) {      switch (key_code) {      case Qt::Key_Shift:          return QObject::tr("Shift"); @@ -51,9 +99,16 @@ static QString GetKeyName(int key_code) {      }  } -static void SetAnalogButton(const Common::ParamPackage& input_param, -                            Common::ParamPackage& analog_param, const std::string& button_name) { -    if (analog_param.Get("engine", "") != "analog_from_button") { +void SetAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackage& analog_param, +                    const std::string& button_name) { +    // The poller returned a complete axis, so set all the buttons +    if (input_param.Has("axis_x") && input_param.Has("axis_y")) { +        analog_param = input_param; +        return; +    } +    // Check if the current configuration has either no engine or an axis binding. +    // Clears out the old binding and adds one with analog_from_button. +    if (!analog_param.Has("engine") || analog_param.Has("axis_x") || analog_param.Has("axis_y")) {          analog_param = {              {"engine", "analog_from_button"},          }; @@ -61,7 +116,7 @@ static void SetAnalogButton(const Common::ParamPackage& input_param,      analog_param.Set(button_name, input_param.Serialize());  } -static QString ButtonToText(const Common::ParamPackage& param) { +QString ButtonToText(const Common::ParamPackage& param) {      if (!param.Has("engine")) {          return QObject::tr("[not set]");      } @@ -111,7 +166,7 @@ static QString ButtonToText(const Common::ParamPackage& param) {      return QObject::tr("[unknown]");  } -static QString AnalogToText(const Common::ParamPackage& param, const std::string& dir) { +QString AnalogToText(const Common::ParamPackage& param, const std::string& dir) {      if (!param.Has("engine")) {          return QObject::tr("[not set]");      } @@ -161,22 +216,24 @@ static QString AnalogToText(const Common::ParamPackage& param, const std::string      }      return QObject::tr("[unknown]");  } +} // namespace -ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_index, bool debug) -    : QDialog(parent), ui(std::make_unique<Ui::ConfigureInputPlayer>()), player_index(player_index), +ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_index, +                                           QWidget* bottom_row, bool debug) +    : QWidget(parent), ui(std::make_unique<Ui::ConfigureInputPlayer>()), player_index(player_index),        debug(debug), timeout_timer(std::make_unique<QTimer>()), -      poll_timer(std::make_unique<QTimer>()) { +      poll_timer(std::make_unique<QTimer>()), bottom_row(bottom_row) {      ui->setupUi(this); +      setFocusPolicy(Qt::ClickFocus);      button_map = { -        ui->buttonA,          ui->buttonB,        ui->buttonX,           ui->buttonY, -        ui->buttonLStick,     ui->buttonRStick,   ui->buttonL,           ui->buttonR, -        ui->buttonZL,         ui->buttonZR,       ui->buttonPlus,        ui->buttonMinus, -        ui->buttonDpadLeft,   ui->buttonDpadUp,   ui->buttonDpadRight,   ui->buttonDpadDown, -        ui->buttonLStickLeft, ui->buttonLStickUp, ui->buttonLStickRight, ui->buttonLStickDown, -        ui->buttonRStickLeft, ui->buttonRStickUp, ui->buttonRStickRight, ui->buttonRStickDown, -        ui->buttonSL,         ui->buttonSR,       ui->buttonHome,        ui->buttonScreenshot, +        ui->buttonA,         ui->buttonB,         ui->buttonX,         ui->buttonY, +        ui->buttonLStick,    ui->buttonRStick,    ui->buttonL,         ui->buttonR, +        ui->buttonZL,        ui->buttonZR,        ui->buttonPlus,      ui->buttonMinus, +        ui->buttonDpadLeft,  ui->buttonDpadUp,    ui->buttonDpadRight, ui->buttonDpadDown, +        ui->buttonSL,        ui->buttonSR,        ui->buttonHome,      ui->buttonScreenshot, +        ui->buttonLStickMod, ui->buttonRStickMod,      };      analog_map_buttons = {{ @@ -185,208 +242,159 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i              ui->buttonLStickDown,              ui->buttonLStickLeft,              ui->buttonLStickRight, -            ui->buttonLStickMod,          },          {              ui->buttonRStickUp,              ui->buttonRStickDown,              ui->buttonRStickLeft,              ui->buttonRStickRight, -            ui->buttonRStickMod,          },      }}; -    debug_hidden = { -        ui->buttonSL,         ui->labelSL, -        ui->buttonSR,         ui->labelSR, -        ui->buttonLStick,     ui->labelLStickPressed, -        ui->buttonRStick,     ui->labelRStickPressed, -        ui->buttonHome,       ui->labelHome, -        ui->buttonScreenshot, ui->labelScreenshot, -    }; - -    auto layout = Settings::values.players[player_index].type; -    if (debug) -        layout = Settings::ControllerType::DualJoycon; - -    switch (layout) { -    case Settings::ControllerType::ProController: -    case Settings::ControllerType::DualJoycon: -        layout_hidden = { -            ui->buttonSL, -            ui->labelSL, -            ui->buttonSR, -            ui->labelSR, -        }; -        break; -    case Settings::ControllerType::LeftJoycon: -        layout_hidden = { -            ui->right_body_button, -            ui->right_buttons_button, -            ui->right_body_label, -            ui->right_buttons_label, -            ui->buttonR, -            ui->labelR, -            ui->buttonZR, -            ui->labelZR, -            ui->labelHome, -            ui->buttonHome, -            ui->buttonPlus, -            ui->labelPlus, -            ui->RStick, -            ui->faceButtons, -        }; -        break; -    case Settings::ControllerType::RightJoycon: -        layout_hidden = { -            ui->left_body_button, ui->left_buttons_button, -            ui->left_body_label,  ui->left_buttons_label, -            ui->buttonL,          ui->labelL, -            ui->buttonZL,         ui->labelZL, -            ui->labelScreenshot,  ui->buttonScreenshot, -            ui->buttonMinus,      ui->labelMinus, -            ui->LStick,           ui->Dpad, -        }; -        break; -    } - -    if (debug || layout == Settings::ControllerType::ProController) { -        ui->controller_color->hide(); -    } else { -        if (layout == Settings::ControllerType::LeftJoycon || -            layout == Settings::ControllerType::RightJoycon) { -            ui->horizontalSpacer_4->setGeometry({0, 0, 0, 0}); - -            LayerGridElements(ui->buttons, ui->shoulderButtons, ui->Dpad); -            LayerGridElements(ui->buttons, ui->misc, ui->RStick); -            LayerGridElements(ui->buttons, ui->Dpad, ui->faceButtons); -            LayerGridElements(ui->buttons, ui->RStick, ui->LStick); -        } -    } - -    for (auto* widget : layout_hidden) -        widget->setVisible(false); - -    analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog}; -    analog_map_deadzone_and_modifier_slider = {ui->sliderLStickDeadzoneAndModifier, -                                               ui->sliderRStickDeadzoneAndModifier}; -    analog_map_deadzone_and_modifier_slider_label = {ui->labelLStickDeadzoneAndModifier, -                                                     ui->labelRStickDeadzoneAndModifier}; - -    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { -        auto* const button = button_map[button_id]; -        if (button == nullptr) { -            continue; -        } - -        button->setContextMenuPolicy(Qt::CustomContextMenu); +    analog_map_deadzone_label = {ui->labelLStickDeadzone, ui->labelRStickDeadzone}; +    analog_map_deadzone_slider = {ui->sliderLStickDeadzone, ui->sliderRStickDeadzone}; +    analog_map_modifier_groupbox = {ui->buttonLStickModGroup, ui->buttonRStickModGroup}; +    analog_map_modifier_button = {ui->buttonLStickMod, ui->buttonRStickMod}; +    analog_map_modifier_label = {ui->labelLStickModifierRange, ui->labelRStickModifierRange}; +    analog_map_modifier_slider = {ui->sliderLStickModifierRange, ui->sliderRStickModifierRange}; +    analog_map_range_groupbox = {ui->buttonLStickRangeGroup, ui->buttonRStickRangeGroup}; +    analog_map_range_spinbox = {ui->spinboxLStickRange, ui->spinboxRStickRange}; + +    const auto ConfigureButtonClick = [&](QPushButton* button, Common::ParamPackage* param, +                                          int default_val) {          connect(button, &QPushButton::clicked, [=, this] {              HandleClick( -                button_map[button_id], +                button,                  [=, this](Common::ParamPackage params) { -                    // Workaround for ZL & ZR for analog triggers like on XBOX controllors. -                    // Analog triggers (from controllers like the XBOX controller) would not -                    // work due to a different range of their signals (from 0 to 255 on -                    // analog triggers instead of -32768 to 32768 on analog joysticks). The -                    // SDL driver misinterprets analog triggers as analog joysticks. +                    // Workaround for ZL & ZR for analog triggers like on XBOX +                    // controllers. Analog triggers (from controllers like the XBOX +                    // controller) would not work due to a different range of their +                    // signals (from 0 to 255 on analog triggers instead of -32768 to +                    // 32768 on analog joysticks). The SDL driver misinterprets analog +                    // triggers as analog joysticks.                      // TODO: reinterpret the signal range for analog triggers to map the -                    // values correctly. This is required for the correct emulation of the -                    // analog triggers of the GameCube controller. -                    if (button_id == Settings::NativeButton::ZL || -                        button_id == Settings::NativeButton::ZR) { +                    // values correctly. This is required for the correct emulation of +                    // the analog triggers of the GameCube controller. +                    if (button == ui->buttonZL || button == ui->buttonZR) {                          params.Set("direction", "+");                          params.Set("threshold", "0.5");                      } -                    buttons_param[button_id] = std::move(params); +                    (*param) = std::move(params);                  },                  InputCommon::Polling::DeviceType::Button);          }); -        connect(button, &QPushButton::customContextMenuRequested, -                [=, this](const QPoint& menu_location) { -                    QMenu context_menu; -                    context_menu.addAction(tr("Clear"), [&] { -                        buttons_param[button_id].Clear(); -                        button_map[button_id]->setText(tr("[not set]")); -                    }); -                    context_menu.addAction(tr("Restore Default"), [&] { -                        buttons_param[button_id] = Common::ParamPackage{ -                            InputCommon::GenerateKeyboardParam(Config::default_buttons[button_id])}; -                        button_map[button_id]->setText(ButtonToText(buttons_param[button_id])); -                    }); -                    context_menu.exec(button_map[button_id]->mapToGlobal(menu_location)); -                }); +    }; + +    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) { +        auto* const button = button_map[button_id]; +        if (button == nullptr) { +            continue; +        } +        ConfigureButtonClick(button_map[button_id], &buttons_param[button_id], +                             Config::default_buttons[button_id]);      } -    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++) { +    // Handle clicks for the modifier buttons as well. +    ConfigureButtonClick(ui->buttonLStickMod, &lstick_mod, Config::default_lstick_mod); +    ConfigureButtonClick(ui->buttonRStickMod, &rstick_mod, Config::default_rstick_mod); + +    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) {              auto* const analog_button = analog_map_buttons[analog_id][sub_button_id]; +              if (analog_button == nullptr) {                  continue;              } -            analog_button->setContextMenuPolicy(Qt::CustomContextMenu);              connect(analog_button, &QPushButton::clicked, [=, this] {                  HandleClick(                      analog_map_buttons[analog_id][sub_button_id],                      [=, this](const Common::ParamPackage& params) { -                        SetAnalogButton(params, analogs_param[analog_id], -                                        analog_sub_buttons[sub_button_id]); +                        SetAnalogParam(params, analogs_param[analog_id], +                                       analog_sub_buttons[sub_button_id]);                      }, -                    InputCommon::Polling::DeviceType::Button); +                    InputCommon::Polling::DeviceType::AnalogPreferred);              }); -            connect(analog_button, &QPushButton::customContextMenuRequested, -                    [=, this](const QPoint& menu_location) { -                        QMenu context_menu; -                        context_menu.addAction(tr("Clear"), [&] { -                            analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]); -                            analog_map_buttons[analog_id][sub_button_id]->setText(tr("[not set]")); -                        }); -                        context_menu.addAction(tr("Restore Default"), [&] { -                            Common::ParamPackage params{InputCommon::GenerateKeyboardParam( -                                Config::default_analogs[analog_id][sub_button_id])}; -                            SetAnalogButton(params, analogs_param[analog_id], -                                            analog_sub_buttons[sub_button_id]); -                            analog_map_buttons[analog_id][sub_button_id]->setText(AnalogToText( -                                analogs_param[analog_id], analog_sub_buttons[sub_button_id])); -                        }); -                        context_menu.exec(analog_map_buttons[analog_id][sub_button_id]->mapToGlobal( -                            menu_location)); -                    });          } -        connect(analog_map_stick[analog_id], &QPushButton::clicked, [=, this] { -            if (QMessageBox::information( -                    this, tr("Information"), -                    tr("After pressing OK, first move your joystick horizontally, " -                       "and then vertically."), -                    QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { -                HandleClick( -                    analog_map_stick[analog_id], -                    [=, this](const Common::ParamPackage& params) { -                        analogs_param[analog_id] = params; -                    }, -                    InputCommon::Polling::DeviceType::Analog); -            } + +        connect(analog_map_modifier_button[analog_id], &QPushButton::clicked, [=, this] { +            HandleClick( +                analog_map_modifier_button[analog_id], +                [=, this](const Common::ParamPackage& params) { +                    SetAnalogParam(params, analogs_param[analog_id], "modifier"); +                }, +                InputCommon::Polling::DeviceType::AnalogPreferred);          }); -        connect(analog_map_deadzone_and_modifier_slider[analog_id], &QSlider::valueChanged, +        connect(analog_map_range_spinbox[analog_id], qOverload<int>(&QSpinBox::valueChanged),                  [=, this] { -                    const float slider_value = -                        analog_map_deadzone_and_modifier_slider[analog_id]->value(); -                    if (analogs_param[analog_id].Get("engine", "") == "sdl" || -                        analogs_param[analog_id].Get("engine", "") == "gcpad") { -                        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); -                    } +                    const auto spinbox_value = analog_map_range_spinbox[analog_id]->value(); +                    analogs_param[analog_id].Set("range", spinbox_value / 100.0f);                  }); + +        connect(analog_map_deadzone_slider[analog_id], &QSlider::valueChanged, [=, this] { +            const auto slider_value = analog_map_deadzone_slider[analog_id]->value(); +            analog_map_deadzone_label[analog_id]->setText(tr("Deadzone: %1%").arg(slider_value)); +            analogs_param[analog_id].Set("deadzone", slider_value / 100.0f); +        }); + +        connect(analog_map_modifier_slider[analog_id], &QSlider::valueChanged, [=, this] { +            const auto slider_value = analog_map_modifier_slider[analog_id]->value(); +            analog_map_modifier_label[analog_id]->setText( +                tr("Modifier Range: %1%").arg(slider_value)); +            analogs_param[analog_id].Set("modifier_scale", slider_value / 100.0f); +        });      } -    connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); -    connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); }); +    // Player Connected checkbox +    connect(ui->groupConnectedController, &QGroupBox::toggled, +            [&](bool checked) { emit Connected(checked); }); + +    // Set up controller type. Only Player 1 can choose Handheld. +    ui->comboControllerType->clear(); + +    QStringList controller_types = { +        QStringLiteral("Pro Controller"), +        QStringLiteral("Dual Joycons"), +        QStringLiteral("Left Joycon"), +        QStringLiteral("Right Joycon"), +    }; + +    if (player_index == 0) { +        controller_types.append(QStringLiteral("Handheld")); +        connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), +                [&](int index) { +                    emit HandheldStateChanged(GetControllerTypeFromIndex(index) == +                                              Settings::ControllerType::Handheld); +                }); +    } + +    // The Debug Controller can only choose the Pro Controller. +    if (debug) { +        ui->buttonScreenshot->setEnabled(false); +        ui->buttonHome->setEnabled(false); +        ui->groupConnectedController->setCheckable(false); +        QStringList debug_controller_types = { +            QStringLiteral("Pro Controller"), +        }; +        ui->comboControllerType->addItems(debug_controller_types); +    } else { +        ui->comboControllerType->addItems(controller_types); +    } + +    UpdateControllerIcon(); +    UpdateControllerAvailableButtons(); +    connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), [&](int) { +        UpdateControllerIcon(); +        UpdateControllerAvailableButtons(); +    }); + +    connect(ui->comboDevices, qOverload<int>(&QComboBox::currentIndexChanged), +            [&] { UpdateMappingWithDefaults(); }); + +    ui->buttonRefreshDevices->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh"))); +    UpdateInputDevices(); +    connect(ui->buttonRefreshDevices, &QPushButton::clicked, [&] { emit RefreshInputDevices(); });      timeout_timer->setSingleShot(true);      connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); }); @@ -416,20 +424,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          }      }); -    controller_color_buttons = { -        ui->left_body_button, -        ui->left_buttons_button, -        ui->right_body_button, -        ui->right_buttons_button, -    }; - -    for (std::size_t i = 0; i < controller_color_buttons.size(); ++i) { -        connect(controller_color_buttons[i], &QPushButton::clicked, this, -                [this, i] { OnControllerButtonClick(static_cast<int>(i)); }); -    } -      LoadConfiguration(); -    resize(0, 0);      // TODO(wwylele): enable this when we actually emulate it      ui->buttonHome->setEnabled(false); @@ -438,27 +433,43 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i  ConfigureInputPlayer::~ConfigureInputPlayer() = default;  void ConfigureInputPlayer::ApplyConfiguration() { -    auto& buttons = -        debug ? Settings::values.debug_pad_buttons : Settings::values.players[player_index].buttons; -    auto& analogs = -        debug ? Settings::values.debug_pad_analogs : Settings::values.players[player_index].analogs; +    auto& player = Settings::values.players[player_index]; +    auto& buttons = debug ? Settings::values.debug_pad_buttons : player.buttons; +    auto& analogs = debug ? Settings::values.debug_pad_analogs : player.analogs;      std::transform(buttons_param.begin(), buttons_param.end(), buttons.begin(),                     [](const Common::ParamPackage& param) { return param.Serialize(); });      std::transform(analogs_param.begin(), analogs_param.end(), analogs.begin(),                     [](const Common::ParamPackage& param) { return param.Serialize(); }); -    if (debug) +    if (debug) {          return; +    } -    std::array<u32, 4> colors{}; -    std::transform(controller_colors.begin(), controller_colors.end(), colors.begin(), -                   [](QColor color) { return color.rgb(); }); +    player.controller_type = +        static_cast<Settings::ControllerType>(ui->comboControllerType->currentIndex()); +    player.connected = ui->groupConnectedController->isChecked(); -    Settings::values.players[player_index].body_color_left = colors[0]; -    Settings::values.players[player_index].button_color_left = colors[1]; -    Settings::values.players[player_index].body_color_right = colors[2]; -    Settings::values.players[player_index].button_color_right = colors[3]; +    // Player 2-8 +    if (player_index != 0) { +        UpdateController(player.controller_type, player_index, player.connected); +        return; +    } + +    // Player 1 and Handheld +    auto& handheld = Settings::values.players[HANDHELD_INDEX]; +    // If Handheld is selected, copy all the settings from Player 1 to Handheld. +    if (player.controller_type == Settings::ControllerType::Handheld) { +        handheld = player; +        handheld.connected = ui->groupConnectedController->isChecked(); +        player.connected = false; // Disconnect Player 1 +    } else { +        player.connected = ui->groupConnectedController->isChecked(); +        handheld.connected = false; // Disconnect Handheld +    } + +    UpdateController(player.controller_type, player_index, player.connected); +    UpdateController(Settings::ControllerType::Handheld, HANDHELD_INDEX, handheld.connected);  }  void ConfigureInputPlayer::changeEvent(QEvent* event) { @@ -466,24 +477,16 @@ void ConfigureInputPlayer::changeEvent(QEvent* event) {          RetranslateUI();      } -    QDialog::changeEvent(event); +    QWidget::changeEvent(event);  }  void ConfigureInputPlayer::RetranslateUI() {      ui->retranslateUi(this); -    UpdateButtonLabels(); -} - -void ConfigureInputPlayer::OnControllerButtonClick(int i) { -    const QColor new_bg_color = QColorDialog::getColor(controller_colors[i]); -    if (!new_bg_color.isValid()) -        return; -    controller_colors[i] = new_bg_color; -    controller_color_buttons[i]->setStyleSheet( -        QStringLiteral("QPushButton { background-color: %1 }").arg(controller_colors[i].name())); +    UpdateUI();  }  void ConfigureInputPlayer::LoadConfiguration() { +    auto& player = Settings::values.players[player_index];      if (debug) {          std::transform(Settings::values.debug_pad_buttons.begin(),                         Settings::values.debug_pad_buttons.end(), buttons_param.begin(), @@ -492,56 +495,53 @@ void ConfigureInputPlayer::LoadConfiguration() {                         Settings::values.debug_pad_analogs.end(), analogs_param.begin(),                         [](const std::string& str) { return Common::ParamPackage(str); });      } else { -        std::transform(Settings::values.players[player_index].buttons.begin(), -                       Settings::values.players[player_index].buttons.end(), buttons_param.begin(), +        std::transform(player.buttons.begin(), player.buttons.end(), buttons_param.begin(),                         [](const std::string& str) { return Common::ParamPackage(str); }); -        std::transform(Settings::values.players[player_index].analogs.begin(), -                       Settings::values.players[player_index].analogs.end(), analogs_param.begin(), +        std::transform(player.analogs.begin(), player.analogs.end(), analogs_param.begin(),                         [](const std::string& str) { return Common::ParamPackage(str); });      } -    UpdateButtonLabels(); +    UpdateUI(); -    if (debug) +    if (debug) {          return; +    } -    std::array<u32, 4> colors = { -        Settings::values.players[player_index].body_color_left, -        Settings::values.players[player_index].button_color_left, -        Settings::values.players[player_index].body_color_right, -        Settings::values.players[player_index].button_color_right, -    }; - -    std::transform(colors.begin(), colors.end(), controller_colors.begin(), -                   [](u32 rgb) { return QColor::fromRgb(rgb); }); +    ui->comboControllerType->setCurrentIndex(static_cast<int>(player.controller_type)); +    ui->groupConnectedController->setChecked( +        player.connected || +        (player_index == 0 && Settings::values.players[HANDHELD_INDEX].connected)); +} -    for (std::size_t i = 0; i < colors.size(); ++i) { -        controller_color_buttons[i]->setStyleSheet( -            QStringLiteral("QPushButton { background-color: %1 }") -                .arg(controller_colors[i].name())); +void ConfigureInputPlayer::UpdateInputDevices() { +    input_devices = InputCommon::GetInputDevices(); +    ui->comboDevices->clear(); +    for (auto device : input_devices) { +        ui->comboDevices->addItem(QString::fromStdString(device.Get("display", "Unknown")), {});      }  }  void ConfigureInputPlayer::RestoreDefaults() { -    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { +    // Reset Buttons +    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) {          buttons_param[button_id] = Common::ParamPackage{              InputCommon::GenerateKeyboardParam(Config::default_buttons[button_id])};      } - -    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++) { +    // Reset Analogs +    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) {              Common::ParamPackage params{InputCommon::GenerateKeyboardParam(                  Config::default_analogs[analog_id][sub_button_id])}; -            SetAnalogButton(params, analogs_param[analog_id], analog_sub_buttons[sub_button_id]); +            SetAnalogParam(params, analogs_param[analog_id], analog_sub_buttons[sub_button_id]);          }      } - -    UpdateButtonLabels(); -    ApplyConfiguration(); +    UpdateUI(); +    UpdateInputDevices(); +    ui->comboControllerType->setCurrentIndex(0);  }  void ConfigureInputPlayer::ClearAll() { -    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) { +    for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) {          const auto* const button = button_map[button_id];          if (button == nullptr || !button->isEnabled()) {              continue; @@ -550,8 +550,8 @@ void ConfigureInputPlayer::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++) { +    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) {              const auto* const analog_button = analog_map_buttons[analog_id][sub_button_id];              if (analog_button == nullptr || !analog_button->isEnabled()) {                  continue; @@ -561,17 +561,17 @@ void ConfigureInputPlayer::ClearAll() {          }      } -    UpdateButtonLabels(); -    ApplyConfiguration(); +    UpdateUI(); +    UpdateInputDevices();  } -void ConfigureInputPlayer::UpdateButtonLabels() { -    for (int button = 0; button < Settings::NativeButton::NumButtons; button++) { +void ConfigureInputPlayer::UpdateUI() { +    for (int button = 0; button < Settings::NativeButton::NumButtons; ++button) {          button_map[button]->setText(ButtonToText(buttons_param[button]));      } -    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++) { +    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) {              auto* const analog_button = analog_map_buttons[analog_id][sub_button_id];              if (analog_button == nullptr) { @@ -581,52 +581,75 @@ void ConfigureInputPlayer::UpdateButtonLabels() {              analog_button->setText(                  AnalogToText(analogs_param[analog_id], analog_sub_buttons[sub_button_id]));          } -        analog_map_stick[analog_id]->setText(tr("Set Analog Stick")); +        const auto deadzone_label = analog_map_deadzone_label[analog_id]; +        const auto deadzone_slider = analog_map_deadzone_slider[analog_id]; +        const auto modifier_groupbox = analog_map_modifier_groupbox[analog_id]; +        const auto modifier_label = analog_map_modifier_label[analog_id]; +        const auto modifier_slider = analog_map_modifier_slider[analog_id]; +        const auto range_groupbox = analog_map_range_groupbox[analog_id]; +        const auto range_spinbox = analog_map_range_spinbox[analog_id]; + +        int slider_value;          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" || param.Get("engine", "") == "gcpad") { -                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%")); -                } +        const bool is_controller = +            param.Get("engine", "") == "sdl" || param.Get("engine", "") == "gcpad"; + +        if (is_controller) { +            if (!param.Has("deadzone")) { +                param.Set("deadzone", 0.1f);              } +            slider_value = static_cast<int>(param.Get("deadzone", 0.1f) * 100); +            deadzone_label->setText(tr("Deadzone: %1%").arg(slider_value)); +            deadzone_slider->setValue(slider_value); +            if (!param.Has("range")) { +                param.Set("range", 1.0f); +            } +            range_spinbox->setValue(static_cast<int>(param.Get("range", 1.0f) * 100)); +        } else { +            if (!param.Has("modifier_scale")) { +                param.Set("modifier_scale", 0.5f); +            } +            slider_value = static_cast<int>(param.Get("modifier_scale", 0.5f) * 100); +            modifier_label->setText(tr("Modifier Range: %1%").arg(slider_value)); +            modifier_slider->setValue(slider_value);          } + +        deadzone_label->setVisible(is_controller); +        deadzone_slider->setVisible(is_controller); +        modifier_groupbox->setVisible(!is_controller); +        modifier_label->setVisible(!is_controller); +        modifier_slider->setVisible(!is_controller); +        range_groupbox->setVisible(is_controller);      }  } +void ConfigureInputPlayer::UpdateMappingWithDefaults() { +    if (ui->comboDevices->currentIndex() < 2) { +        return; +    } +    const auto& device = input_devices[ui->comboDevices->currentIndex()]; +    auto button_mapping = InputCommon::GetButtonMappingForDevice(device); +    auto analog_mapping = InputCommon::GetAnalogMappingForDevice(device); +    for (int i = 0; i < buttons_param.size(); ++i) { +        buttons_param[i] = button_mapping[static_cast<Settings::NativeButton::Values>(i)]; +    } +    for (int i = 0; i < analogs_param.size(); ++i) { +        analogs_param[i] = analog_mapping[static_cast<Settings::NativeAnalog::Values>(i)]; +    } + +    UpdateUI(); +} +  void ConfigureInputPlayer::HandleClick(      QPushButton* button, std::function<void(const Common::ParamPackage&)> new_input_setter,      InputCommon::Polling::DeviceType type) { -    button->setText(tr("[press key]")); +    button->setText(tr("[waiting]"));      button->setFocus(); -    // Keyboard keys can only be used as button devices -    want_keyboard_keys = type == InputCommon::Polling::DeviceType::Button; -    if (want_keyboard_keys) { -        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); -    } +    // The first two input devices are always Any and Keyboard. If the user filtered to a +    // controller, then they don't want keyboard input +    want_keyboard_keys = ui->comboDevices->currentIndex() < 2;      input_setter = new_input_setter; @@ -636,20 +659,17 @@ void ConfigureInputPlayer::HandleClick(          poller->Start();      } -    grabKeyboard(); -    grabMouse();      if (type == InputCommon::Polling::DeviceType::Button) {          InputCommon::GetGCButtons()->BeginConfiguration();      } else {          InputCommon::GetGCAnalogs()->BeginConfiguration();      } -    timeout_timer->start(5000); // Cancel after 5 seconds -    poll_timer->start(200);     // Check for new inputs every 200ms + +    timeout_timer->start(2500); // Cancel after 2.5 seconds +    poll_timer->start(50);      // Check for new inputs every 50ms  }  void ConfigureInputPlayer::SetPollingResult(const Common::ParamPackage& params, bool abort) { -    releaseKeyboard(); -    releaseMouse();      timeout_timer->stop();      poll_timer->stop();      for (auto& poller : device_pollers) { @@ -663,7 +683,7 @@ void ConfigureInputPlayer::SetPollingResult(const Common::ParamPackage& params,          (*input_setter)(params);      } -    UpdateButtonLabels(); +    UpdateUI();      input_setter = std::nullopt;  } @@ -683,3 +703,114 @@ void ConfigureInputPlayer::keyPressEvent(QKeyEvent* event) {      }      SetPollingResult({}, true);  } + +void ConfigureInputPlayer::UpdateControllerIcon() { +    // We aren't using Qt's built in theme support here since we aren't drawing an icon (and its +    // "nonstandard" to use an image through the icon support) +    QString stylesheet{}; +    switch (GetControllerTypeFromIndex(ui->comboControllerType->currentIndex())) { +    case Settings::ControllerType::ProController: +        stylesheet = QStringLiteral("image: url(:/controller/pro_controller%0)"); +        break; +    case Settings::ControllerType::DualJoyconDetached: +        stylesheet = QStringLiteral("image: url(:/controller/dual_joycon%0)"); +        break; +    case Settings::ControllerType::LeftJoycon: +        stylesheet = QStringLiteral("image: url(:/controller/single_joycon_left_vertical%0)"); +        break; +    case Settings::ControllerType::RightJoycon: +        stylesheet = QStringLiteral("image: url(:/controller/single_joycon_right_vertical%0)"); +        break; +    case Settings::ControllerType::Handheld: +        stylesheet = QStringLiteral("image: url(:/controller/handheld%0)"); +        break; +    default: +        break; +    } + +    const QString theme = [this] { +        if (QIcon::themeName().contains(QStringLiteral("dark"))) { +            return QStringLiteral("_dark"); +        } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) { +            return QStringLiteral("_midnight"); +        } else { +            return QString{}; +        } +    }(); + +    ui->controllerFrame->setStyleSheet(stylesheet.arg(theme)); +} + +void ConfigureInputPlayer::UpdateControllerAvailableButtons() { +    auto layout = GetControllerTypeFromIndex(ui->comboControllerType->currentIndex()); +    if (debug) { +        layout = Settings::ControllerType::DualJoyconDetached; +    } + +    // List of all the widgets that will be hidden by any of the following layouts that need +    // "unhidden" after the controller type changes +    const std::vector<QWidget*> layout_show = { +        ui->buttonShoulderButtonsSLSR, +        ui->horizontalSpacerShoulderButtonsWidget, +        ui->horizontalSpacerShoulderButtonsWidget2, +        ui->buttonShoulderButtonsLeft, +        ui->buttonMiscButtonsMinusScreenshot, +        ui->bottomLeft, +        ui->buttonShoulderButtonsRight, +        ui->buttonMiscButtonsPlusHome, +        ui->bottomRight, +    }; + +    for (auto* widget : layout_show) { +        widget->show(); +    } + +    std::vector<QWidget*> layout_hidden; +    switch (layout) { +    case Settings::ControllerType::ProController: +        layout_hidden = { +            ui->buttonShoulderButtonsSLSR, +            ui->horizontalSpacerShoulderButtonsWidget2, +        }; +        break; +    case Settings::ControllerType::DualJoyconDetached: +    case Settings::ControllerType::Handheld: +        layout_hidden = { +            ui->buttonShoulderButtonsSLSR, +            ui->horizontalSpacerShoulderButtonsWidget2, +        }; +        break; +    case Settings::ControllerType::LeftJoycon: +        layout_hidden = { +            ui->horizontalSpacerShoulderButtonsWidget2, +            ui->buttonShoulderButtonsRight, +            ui->buttonMiscButtonsPlusHome, +            ui->bottomRight, +        }; +        break; +    case Settings::ControllerType::RightJoycon: +        layout_hidden = { +            ui->horizontalSpacerShoulderButtonsWidget, +            ui->buttonShoulderButtonsLeft, +            ui->buttonMiscButtonsMinusScreenshot, +            ui->bottomLeft, +        }; +        break; +    } + +    for (auto* widget : layout_hidden) { +        widget->hide(); +    } +} + +void ConfigureInputPlayer::showEvent(QShowEvent* event) { +    if (bottom_row == nullptr) { +        return; +    } +    QWidget::showEvent(event); +    ui->main->addWidget(bottom_row); +} + +void ConfigureInputPlayer::ConnectPlayer(bool connected) { +    ui->groupConnectedController->setChecked(connected); +} diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h index 95afa5375..a86db8200 100644 --- a/src/yuzu/configuration/configure_input_player.h +++ b/src/yuzu/configuration/configure_input_player.h @@ -15,11 +15,17 @@  #include "common/param_package.h"  #include "core/settings.h"  #include "ui_configure_input.h" +#include "yuzu/uisettings.h" +class QCheckBox;  class QKeyEvent; +class QLabel;  class QPushButton; +class QSlider; +class QSpinBox;  class QString;  class QTimer; +class QWidget;  namespace InputCommon::Polling {  class DevicePoller; @@ -30,43 +36,73 @@ namespace Ui {  class ConfigureInputPlayer;  } -class ConfigureInputPlayer : public QDialog { +class ConfigureInputPlayer : public QWidget {      Q_OBJECT  public: -    explicit ConfigureInputPlayer(QWidget* parent, std::size_t player_index, bool debug = false); +    explicit ConfigureInputPlayer(QWidget* parent, std::size_t player_index, QWidget* bottom_row, +                                  bool debug = false);      ~ConfigureInputPlayer() override; -    /// Save all button configurations to settings file +    /// Save all button configurations to settings file.      void ApplyConfiguration(); +    /// Update the input devices combobox. +    void UpdateInputDevices(); + +    /// Restore all buttons to their default values. +    void RestoreDefaults(); + +    /// Clear all input configuration. +    void ClearAll(); + +    /// Set the connection state checkbox (used to sync state). +    void ConnectPlayer(bool connected); + +signals: +    /// Emitted when this controller is connected by the user. +    void Connected(bool connected); +    /// Emitted when the Handheld mode is selected (undocked with dual joycons attached). +    void HandheldStateChanged(bool is_handheld); +    /// Emitted when the input devices combobox is being refreshed. +    void RefreshInputDevices(); + +protected: +    void showEvent(QShowEvent* event) override; +  private:      void changeEvent(QEvent* event) override;      void RetranslateUI(); -    void OnControllerButtonClick(int i); -      /// Load configuration settings.      void LoadConfiguration(); -    /// Restore all buttons to their default values. -    void RestoreDefaults(); -    /// Clear all input configuration -    void ClearAll(); - -    /// Update UI to reflect current configuration. -    void UpdateButtonLabels();      /// Called when the button was pressed.      void HandleClick(QPushButton* button,                       std::function<void(const Common::ParamPackage&)> new_input_setter,                       InputCommon::Polling::DeviceType type); -    /// Finish polling and configure input using the input_setter +    /// Finish polling and configure input using the input_setter.      void SetPollingResult(const Common::ParamPackage& params, bool abort);      /// Handle key press events.      void keyPressEvent(QKeyEvent* event) override; +    /// Update UI to reflect current configuration. +    void UpdateUI(); + +    /// Update the controller selection combobox +    void UpdateControllerCombobox(); + +    /// Update the current controller icon. +    void UpdateControllerIcon(); + +    /// Hides and disables controller settings based on the current controller type. +    void UpdateControllerAvailableButtons(); + +    /// Gets the default controller mapping for this device and auto configures the input to match. +    void UpdateMappingWithDefaults(); +      std::unique_ptr<Ui::ConfigureInputPlayer> ui;      std::size_t player_index; @@ -75,32 +111,38 @@ private:      std::unique_ptr<QTimer> timeout_timer;      std::unique_ptr<QTimer> poll_timer; +    static constexpr int PLAYER_COUNT = 8; +    std::array<QCheckBox*, PLAYER_COUNT> player_connected_checkbox; +      /// This will be the the setting function when an input is awaiting configuration.      std::optional<std::function<void(const Common::ParamPackage&)>> input_setter;      std::array<Common::ParamPackage, Settings::NativeButton::NumButtons> buttons_param;      std::array<Common::ParamPackage, Settings::NativeAnalog::NumAnalogs> analogs_param; -    static constexpr int ANALOG_SUB_BUTTONS_NUM = 5; +    static constexpr int ANALOG_SUB_BUTTONS_NUM = 4; +    // Adds room for two extra push buttons LStick Modifier and RStick Modifier. +    static constexpr int BUTTON_MAP_COUNT = Settings::NativeButton::NumButtons + 2;      /// Each button input is represented by a QPushButton. -    std::array<QPushButton*, Settings::NativeButton::NumButtons> button_map; - -    std::vector<QWidget*> debug_hidden; -    std::vector<QWidget*> layout_hidden; +    std::array<QPushButton*, BUTTON_MAP_COUNT> button_map; +    /// Extra buttons for the modifiers. +    Common::ParamPackage lstick_mod; +    Common::ParamPackage rstick_mod; -    /// A group of five QPushButtons represent one analog input. The buttons each represent up, -    /// down, left, right, and modifier, respectively. +    /// A group of four QPushButtons represent one analog input. The buttons each represent up, +    /// down, left, right, respectively.      std::array<std::array<QPushButton*, ANALOG_SUB_BUTTONS_NUM>, Settings::NativeAnalog::NumAnalogs>          analog_map_buttons; -    /// 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; +    std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone_label; +    std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone_slider; +    std::array<QGroupBox*, Settings::NativeAnalog::NumAnalogs> analog_map_modifier_groupbox; +    std::array<QPushButton*, Settings::NativeAnalog::NumAnalogs> analog_map_modifier_button; +    std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> analog_map_modifier_label; +    std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> analog_map_modifier_slider; +    std::array<QGroupBox*, Settings::NativeAnalog::NumAnalogs> analog_map_range_groupbox; +    std::array<QSpinBox*, Settings::NativeAnalog::NumAnalogs> analog_map_range_spinbox;      static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons; @@ -110,6 +152,12 @@ private:      /// keyboard events are ignored.      bool want_keyboard_keys = false; -    std::array<QPushButton*, 4> controller_color_buttons; -    std::array<QColor, 4> controller_colors; +    /// List of physical devices users can map with. If a SDL backed device is selected, then you +    /// can usue this device to get a default mapping. +    std::vector<Common::ParamPackage> input_devices; + +    /// Bottom row is where console wide settings are held, and its "owned" by the parent +    /// ConfigureInput widget. On show, add this widget to the main layout. This will change the +    /// parent of the widget to this widget (but thats fine). +    QWidget* bottom_row;  }; diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui index f27a77180..eb826a935 100644 --- a/src/yuzu/configuration/configure_input_player.ui +++ b/src/yuzu/configuration/configure_input_player.ui @@ -1,1243 +1,2974 @@  <?xml version="1.0" encoding="UTF-8"?>  <ui version="4.0">   <class>ConfigureInputPlayer</class> - <widget class="QDialog" name="ConfigureInputPlayer"> + <widget class="QWidget" name="ConfigureInputPlayer">    <property name="geometry">     <rect>      <x>0</x>      <y>0</y> -    <width>408</width> -    <height>731</height> +    <width>780</width> +    <height>487</height>     </rect>    </property>    <property name="windowTitle">     <string>Configure Input</string>    </property> -  <layout class="QVBoxLayout" name="verticalLayout_5"> +  <layout class="QHBoxLayout" name="horizontalLayout_2"> +   <property name="spacing"> +    <number>0</number> +   </property> +   <property name="leftMargin"> +    <number>0</number> +   </property> +   <property name="topMargin"> +    <number>0</number> +   </property> +   <property name="rightMargin"> +    <number>0</number> +   </property> +   <property name="bottomMargin"> +    <number>0</number> +   </property>     <item> -    <layout class="QGridLayout" name="buttons"> -     <item row="1" column="1"> -      <widget class="QGroupBox" name="RStick"> -       <property name="title"> -        <string>Right Stick</string> -       </property> -       <property name="alignment"> -        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> -       </property> -       <property name="flat"> -        <bool>false</bool> +    <layout class="QVBoxLayout" name="main"> +     <property name="spacing"> +      <number>0</number> +     </property> +     <property name="leftMargin"> +      <number>0</number> +     </property> +     <property name="topMargin"> +      <number>0</number> +     </property> +     <property name="rightMargin"> +      <number>0</number> +     </property> +     <property name="bottomMargin"> +      <number>0</number> +     </property> +     <item> +      <layout class="QHBoxLayout" name="top" stretch="0,1,2"> +       <property name="spacing"> +        <number>3</number>         </property> -       <property name="checkable"> -        <bool>false</bool> +       <property name="topMargin"> +        <number>0</number>         </property> -       <layout class="QGridLayout" name="gridLayout_5"> -        <item row="1" column="1"> -         <layout class="QVBoxLayout" name="buttonRStickDownVerticalLayout"> +       <item> +        <widget class="QGroupBox" name="groupConnectedController"> +         <property name="layoutDirection"> +          <enum>Qt::LeftToRight</enum> +         </property> +         <property name="title"> +          <string>Connect Controller</string> +         </property> +         <property name="flat"> +          <bool>false</bool> +         </property> +         <property name="checkable"> +          <bool>true</bool> +         </property> +         <layout class="QHBoxLayout" name="horizontalLayout_3"> +          <property name="leftMargin"> +           <number>5</number> +          </property> +          <property name="topMargin"> +           <number>5</number> +          </property> +          <property name="rightMargin"> +           <number>5</number> +          </property> +          <property name="bottomMargin"> +           <number>5</number> +          </property>            <item> -           <layout class="QHBoxLayout" name="buttonRStickDownHorizontalLayout"> +           <widget class="QComboBox" name="comboControllerType">              <item> -             <widget class="QLabel" name="labelRStickDown"> -              <property name="text"> -               <string>Down:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Pro Controller</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStickDown"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonRStickRightVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonRStickRightHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickRight"> -              <property name="text"> -               <string>Right:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Dual Joycons</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStickRight"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="3" column="0" colspan="2"> -         <widget class="QPushButton" name="buttonRStickAnalog"> -          <property name="text"> -           <string>Set Analog Stick</string> -          </property> -         </widget> -        </item> -        <item row="0" column="0"> -         <layout class="QVBoxLayout" name="buttonRStickLeftVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonRStickLeftHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickLeft"> -              <property name="text"> -               <string>Left:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Left Joycon</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStickLeft"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="0"> -         <layout class="QVBoxLayout" name="buttonRStickUpVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonRStickUpHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickUp"> -              <property name="text"> -               <string>Up:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Right Joycon</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStickUp"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="2" column="0"> -         <layout class="QVBoxLayout" name="buttonRStickPressedVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonRStickPressedHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickPressed"> -              <property name="text"> -               <string>Pressed:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Handheld</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStick"> -            <property name="text"> -             <string/> -            </property>             </widget>            </item>           </layout> -        </item> -        <item row="2" column="1"> -         <layout class="QVBoxLayout" name="buttonRStickModVerticalLayout"> +        </widget> +       </item> +       <item> +        <widget class="QGroupBox" name="devicesGroup"> +         <property name="title"> +          <string>Input Device</string> +         </property> +         <layout class="QHBoxLayout" name="horizontalLayout_5"> +          <property name="spacing"> +           <number>3</number> +          </property> +          <property name="leftMargin"> +           <number>5</number> +          </property> +          <property name="topMargin"> +           <number>5</number> +          </property> +          <property name="rightMargin"> +           <number>5</number> +          </property> +          <property name="bottomMargin"> +           <number>5</number> +          </property>            <item> -           <layout class="QHBoxLayout" name="buttonRStickModHorizontalLayout"> +           <widget class="QComboBox" name="comboDevices">              <item> -             <widget class="QLabel" name="labelRStickMod"> -              <property name="text"> -               <string>Modifier:</string> -              </property> -             </widget> +             <property name="text"> +              <string>Any</string> +             </property>              </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonRStickMod"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="4" column="0" colspan="2"> -         <layout class="QVBoxLayout" name="sliderRStickDeadzoneAndModifierVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="sliderRStickDeadzoneAndModifierHorizontalLayout">              <item> -             <widget class="QLabel" name="labelRStickDeadzoneAndModifier"> -              <property name="text"> -               <string>Deadzone: 0</string> -              </property> -              <property name="alignment"> -               <enum>Qt::AlignHCenter</enum> -              </property> -             </widget> +             <property name="text"> +              <string>Keyboard</string> +             </property>              </item> -           </layout> +           </widget>            </item>            <item> -           <widget class="QSlider" name="sliderRStickDeadzoneAndModifier"> -            <property name="orientation"> -             <enum>Qt::Horizontal</enum> +           <widget class="QPushButton" name="buttonRefreshDevices"> +            <property name="minimumSize"> +             <size> +              <width>24</width> +              <height>22</height> +             </size> +            </property> +            <property name="maximumSize"> +             <size> +              <width>24</width> +              <height>22</height> +             </size> +            </property> +            <property name="styleSheet"> +             <string notr="true"/>              </property>             </widget>            </item>           </layout> -        </item> -        <item row="5" column="0"> -         <spacer name="RStick_verticalSpacer"> -          <property name="orientation"> -           <enum>Qt::Vertical</enum> +        </widget> +       </item> +       <item> +        <widget class="QGroupBox" name="profilesGroup"> +         <property name="minimumSize"> +          <size> +           <width>0</width> +           <height>0</height> +          </size> +         </property> +         <property name="title"> +          <string>Profile</string> +         </property> +         <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="2,0,0,0"> +          <property name="spacing"> +           <number>3</number>            </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>0</width> -            <height>0</height> -           </size> +          <property name="leftMargin"> +           <number>5</number> +          </property> +          <property name="topMargin"> +           <number>5</number> +          </property> +          <property name="rightMargin"> +           <number>5</number> +          </property> +          <property name="bottomMargin"> +           <number>5</number>            </property> -         </spacer> -        </item> -       </layout> -      </widget> -     </item> -     <item row="0" column="1"> -      <widget class="QGroupBox" name="Dpad"> -       <property name="title"> -        <string>Directional Pad</string> -       </property> -       <property name="flat"> -        <bool>false</bool> -       </property> -       <property name="checkable"> -        <bool>false</bool> -       </property> -       <layout class="QGridLayout" name="gridLayout_2"> -        <item row="1" column="0"> -         <layout class="QVBoxLayout" name="buttonDpadUpVerticalLayout">            <item> -           <layout class="QHBoxLayout" name="buttonDpadUpHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelDpadUp"> -              <property name="text"> -               <string>Up:</string> -              </property> -             </widget> -            </item> -           </layout> +           <widget class="QComboBox" name="comboProfiles"/>            </item>            <item> -           <widget class="QPushButton" name="buttonDpadUp"> -            <property name="text"> -             <string/> +           <widget class="QPushButton" name="buttonProfilesSave"> +            <property name="maximumSize"> +             <size> +              <width>55</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="styleSheet"> +             <string notr="true">min-width: 55px;</string>              </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="1"> -         <layout class="QVBoxLayout" name="buttonDpadDownVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonDpadDownHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelDpadDown"> -              <property name="text"> -               <string>Down:</string> -              </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonDpadDown">              <property name="text"> -             <string/> +             <string>Save</string>              </property>             </widget>            </item> -         </layout> -        </item> -        <item row="0" column="0"> -         <layout class="QVBoxLayout" name="buttonDpadLeftVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonDpadLeftHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelDpadLeft"> -              <property name="minimumSize"> -               <size> -                <width>80</width> -                <height>0</height> -               </size> -              </property> -              <property name="text"> -               <string>Left:</string> -              </property> -             </widget> -            </item> -           </layout> -          </item>            <item> -           <widget class="QPushButton" name="buttonDpadLeft"> +           <widget class="QPushButton" name="buttonProfilesNew"> +            <property name="maximumSize"> +             <size> +              <width>55</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="styleSheet"> +             <string notr="true">min-width: 55px;</string> +            </property>              <property name="text"> -             <string/> +             <string>New</string>              </property>             </widget>            </item> -         </layout> -        </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonDpadRightVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonDpadRightHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelDpadRight"> -              <property name="minimumSize"> -               <size> -                <width>80</width> -                <height>0</height> -               </size> -              </property> -              <property name="text"> -               <string>Right:</string> -              </property> -             </widget> -            </item> -           </layout> -          </item>            <item> -           <widget class="QPushButton" name="buttonDpadRight"> +           <widget class="QPushButton" name="buttonProfilesDelete"> +            <property name="maximumSize"> +             <size> +              <width>55</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="styleSheet"> +             <string notr="true">min-width: 55px;</string> +            </property>              <property name="text"> -             <string/> +             <string>Delete</string>              </property>             </widget>            </item>           </layout> -        </item> -       </layout> -      </widget> +        </widget> +       </item> +      </layout>       </item> -     <item row="0" column="0"> -      <widget class="QGroupBox" name="faceButtons"> -       <property name="title"> -        <string>Face Buttons</string> -       </property> -       <property name="flat"> -        <bool>false</bool> -       </property> -       <property name="checkable"> -        <bool>false</bool> +     <item> +      <widget class="QFrame" name="bottom"> +       <property name="sizePolicy"> +        <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> +         <horstretch>0</horstretch> +         <verstretch>0</verstretch> +        </sizepolicy>         </property> -       <layout class="QGridLayout" name="gridLayout"> -        <item row="0" column="0"> -         <layout class="QVBoxLayout" name="buttonFaceButtonsAVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonFaceButtonsAHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelA"> -              <property name="minimumSize"> -               <size> -                <width>80</width> -                <height>0</height> -               </size> +       <layout class="QHBoxLayout" name="_2"> +        <property name="sizeConstraint"> +         <enum>QLayout::SetMinimumSize</enum> +        </property> +        <property name="leftMargin"> +         <number>0</number> +        </property> +        <property name="topMargin"> +         <number>0</number> +        </property> +        <property name="rightMargin"> +         <number>0</number> +        </property> +        <property name="bottomMargin"> +         <number>0</number> +        </property> +        <item> +         <widget class="QWidget" name="bottomLeft" native="true"> +          <layout class="QVBoxLayout" name="bottomLeftLayout" stretch="0,0,0,0"> +           <property name="spacing"> +            <number>0</number> +           </property> +           <property name="sizeConstraint"> +            <enum>QLayout::SetDefaultConstraint</enum> +           </property> +           <property name="leftMargin"> +            <number>0</number> +           </property> +           <property name="topMargin"> +            <number>0</number> +           </property> +           <property name="rightMargin"> +            <number>0</number> +           </property> +           <property name="bottomMargin"> +            <number>0</number> +           </property> +           <item> +            <widget class="QGroupBox" name="LStick"> +             <property name="sizePolicy"> +              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +               <horstretch>0</horstretch> +               <verstretch>0</verstretch> +              </sizepolicy> +             </property> +             <property name="title"> +              <string>Left Stick</string> +             </property> +             <property name="alignment"> +              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> +             </property> +             <layout class="QVBoxLayout" name="verticalLayout_3"> +              <property name="spacing"> +               <number>0</number>                </property> -              <property name="text"> -               <string>A:</string> +              <property name="sizeConstraint"> +               <enum>QLayout::SetDefaultConstraint</enum>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonA"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonFaceButtonsBVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonFaceButtonsBHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelB"> -              <property name="minimumSize"> -               <size> -                <width>80</width> -                <height>0</height> -               </size> +              <property name="leftMargin"> +               <number>3</number>                </property> -              <property name="text"> -               <string>B:</string> +              <property name="topMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonB"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="0"> -         <layout class="QVBoxLayout" name="buttonFaceButtonsXVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonFaceButtonsXHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelX"> -              <property name="text"> -               <string>X:</string> +              <property name="rightMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonX"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="1"> -         <layout class="QVBoxLayout" name="buttonFaceButtonsYVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonFaceButtonsYHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelY"> -              <property name="text"> -               <string>Y:</string> +              <property name="bottomMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonY"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -       </layout> -      </widget> -     </item> -     <item row="5" column="0" colspan="2"> -      <widget class="QGroupBox" name="controller_color"> -       <property name="title"> -        <string>Controller Color</string> -       </property> -       <layout class="QGridLayout" name="gridLayout_10" columnstretch="0,0,0,0,0,0,0"> -        <item row="0" column="0"> -         <spacer name="horizontalSpacer_2"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="0" column="1"> -         <widget class="QLabel" name="left_body_label"> -          <property name="text"> -           <string>Left Body</string> -          </property> -         </widget> -        </item> -        <item row="0" column="6"> -         <spacer name="horizontalSpacer_3"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="1"> -         <widget class="QLabel" name="left_buttons_label"> -          <property name="minimumSize"> -           <size> -            <width>90</width> -            <height>0</height> -           </size> -          </property> -          <property name="text"> -           <string>Left Buttons</string> -          </property> -         </widget> -        </item> -        <item row="1" column="5"> -         <widget class="QPushButton" name="right_buttons_button"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="minimumSize"> -           <size> -            <width>32</width> -            <height>0</height> -           </size> -          </property> -          <property name="maximumSize"> -           <size> -            <width>40</width> -            <height>16777215</height> -           </size> -          </property> -          <property name="text"> -           <string/> -          </property> -         </widget> -        </item> -        <item row="0" column="4"> -         <widget class="QLabel" name="right_body_label"> -          <property name="text"> -           <string>Right Body</string> -          </property> -         </widget> -        </item> -        <item row="1" column="4"> -         <widget class="QLabel" name="right_buttons_label"> -          <property name="minimumSize"> -           <size> -            <width>90</width> -            <height>0</height> -           </size> -          </property> -          <property name="text"> -           <string>Right Buttons</string> -          </property> -         </widget> -        </item> -        <item row="1" column="2"> -         <widget class="QPushButton" name="left_buttons_button"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="minimumSize"> -           <size> -            <width>32</width> -            <height>0</height> -           </size> -          </property> -          <property name="maximumSize"> -           <size> -            <width>40</width> -            <height>16777215</height> -           </size> -          </property> -          <property name="text"> -           <string/> -          </property> -         </widget> -        </item> -        <item row="0" column="2"> -         <widget class="QPushButton" name="left_body_button"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="minimumSize"> -           <size> -            <width>32</width> -            <height>0</height> -           </size> -          </property> -          <property name="maximumSize"> -           <size> -            <width>40</width> -            <height>16777215</height> -           </size> -          </property> -          <property name="text"> -           <string/> -          </property> -         </widget> -        </item> -        <item row="0" column="5"> -         <widget class="QPushButton" name="right_body_button"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="minimumSize"> -           <size> -            <width>32</width> -            <height>0</height> -           </size> -          </property> -          <property name="maximumSize"> -           <size> -            <width>40</width> -            <height>16777215</height> -           </size> -          </property> -          <property name="text"> -           <string/> -          </property> -         </widget> -        </item> -        <item row="0" column="3"> -         <spacer name="horizontalSpacer_4"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeType"> -           <enum>QSizePolicy::Fixed</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>20</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -       </layout> -      </widget> -     </item> -     <item row="1" column="0"> -      <widget class="QGroupBox" name="LStick"> -       <property name="title"> -        <string>Left Stick</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="buttonLStickUpVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickUpHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickUp"> -              <property name="text"> -               <string>Up:</string> +              <item> +               <widget class="QWidget" name="buttonLStickUpWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_20"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerLStickUpLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonLStickUpGroup"> +                   <property name="title"> +                    <string>Up</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <property name="flat"> +                    <bool>false</bool> +                   </property> +                   <layout class="QVBoxLayout" name="buttonLStickUpVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonLStickUp"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Up</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerLStickUpRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonLStickLeftRightHorizontaLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonLStickLeftGroup"> +                  <property name="title"> +                   <string>Left</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonLStickLeftVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonLStickLeft"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Left</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonLStickRightGroup"> +                  <property name="title"> +                   <string>Right</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonLStickRightVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonLStickRight"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Right</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <widget class="QWidget" name="buttonLStickDownWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_22"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerLStickDownLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonLStickDownGroup"> +                   <property name="title"> +                    <string>Down</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonLStickDownVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonLStickDown"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Down</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerLStickDownRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonLStickPressedModifierHorizontalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonLStickPressedGroup"> +                  <property name="title"> +                   <string>Pressed</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonLStickPressedVerticalLayout" stretch="0"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonLStick"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Pressed</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonLStickModGroup"> +                  <property name="title"> +                   <string>Modifier</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonLStickModVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonLStickMod"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Modifier</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item> +                 <widget class="QGroupBox" name="buttonLStickRangeGroup"> +                  <property name="title"> +                   <string>Range</string> +                  </property> +                  <layout class="QHBoxLayout" name="buttonLStickRangeGroupHorizontalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QSpinBox" name="spinboxLStickRange"> +                     <property name="minimumSize"> +                      <size> +                       <width>55</width> +                       <height>21</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="suffix"> +                      <string>%</string> +                     </property> +                     <property name="minimum"> +                      <number>50</number> +                     </property> +                     <property name="maximum"> +                      <number>150</number> +                     </property> +                     <property name="value"> +                      <number>100</number> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <layout class="QVBoxLayout" name="sliderLStickDeadzoneModifierRangeVerticalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <property name="sizeConstraint"> +                 <enum>QLayout::SetDefaultConstraint</enum> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>2</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>3</number> +                </property> +                <item> +                 <layout class="QHBoxLayout" name="sliderLStickDeadzoneHorizontalLayout"> +                  <item> +                   <widget class="QLabel" name="labelLStickDeadzone"> +                    <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="sliderLStickDeadzone"> +                  <property name="maximum"> +                   <number>100</number> +                  </property> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                 </widget> +                </item> +                <item> +                 <layout class="QHBoxLayout" name="sliderLStickModifierRangeHorizontalLayout"> +                  <item> +                   <widget class="QLabel" name="labelLStickModifierRange"> +                    <property name="text"> +                     <string>Modifier Range: 0%</string> +                    </property> +                    <property name="alignment"> +                     <set>Qt::AlignHCenter</set> +                    </property> +                   </widget> +                  </item> +                 </layout> +                </item> +                <item> +                 <widget class="QSlider" name="sliderLStickModifierRange"> +                  <property name="maximum"> +                   <number>100</number> +                  </property> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                 </widget> +                </item> +               </layout> +              </item> +             </layout> +            </widget> +           </item> +           <item> +            <spacer name="verticalSpacerBottomLeft"> +             <property name="orientation"> +              <enum>Qt::Vertical</enum> +             </property> +             <property name="sizeHint" stdset="0"> +              <size> +               <width>20</width> +               <height>0</height> +              </size> +             </property> +            </spacer> +           </item> +           <item> +            <widget class="QGroupBox" name="Dpad"> +             <property name="sizePolicy"> +              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +               <horstretch>0</horstretch> +               <verstretch>0</verstretch> +              </sizepolicy> +             </property> +             <property name="title"> +              <string>D-Pad</string> +             </property> +             <property name="flat"> +              <bool>false</bool> +             </property> +             <property name="checkable"> +              <bool>false</bool> +             </property> +             <layout class="QVBoxLayout" name="verticalLayout_5"> +              <property name="spacing"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStickUp"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="0" column="2"> -         <layout class="QVBoxLayout" name="buttonLStickRightVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickRightHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickRight"> -              <property name="text"> -               <string>Right:</string> +              <property name="leftMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStickRight"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="4" column="1" colspan="2"> -         <widget class="QPushButton" name="buttonLStickAnalog"> -          <property name="text"> -           <string>Set Analog Stick</string> -          </property> -         </widget> -        </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonLStickLeftVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickLeftHorizontalLayout_2"> -            <item> -             <widget class="QLabel" name="labelLStickLeft"> -              <property name="text"> -               <string>Left:</string> +              <property name="topMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStickLeft"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="2"> -         <layout class="QVBoxLayout" name="buttonLStickDownVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickDownHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickDown"> -              <property name="text"> -               <string>Down:</string> +              <property name="rightMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStickDown"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="3" column="2"> -         <layout class="QVBoxLayout" name="buttonLStickModVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickModHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickMod"> -              <property name="text"> -               <string>Modifier:</string> +              <property name="bottomMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStickMod"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> +              <item> +               <widget class="QWidget" name="buttonDpadUpWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_23"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerDpadUpLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonDpadUpGroup"> +                   <property name="title"> +                    <string>Up</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonDpadUpVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonDpadUp"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Up</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerDpadUpRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonDpadLeftRightHorizontalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonDpadLeftGroup"> +                  <property name="title"> +                   <string>Left</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonDpadLeftVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonDpadLeft"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Left</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonDpadRightGroup"> +                  <property name="title"> +                   <string>Right</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonDpadRightVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonDpadRight"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Right</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <widget class="QWidget" name="buttonDpadDownWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_24"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerDpadDownLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonDpadDownGroup"> +                   <property name="title"> +                    <string>Down</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonDpadDownVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonDpadDown"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Down</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerDpadDownRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +             </layout> +            </widget> +           </item> +           <item> +            <spacer name="verticalSpacerBottomLeft_2"> +             <property name="orientation"> +              <enum>Qt::Vertical</enum> +             </property> +             <property name="sizeHint" stdset="0"> +              <size> +               <width>20</width> +               <height>0</height> +              </size> +             </property> +            </spacer> +           </item> +          </layout> +         </widget>          </item> -        <item row="3" column="1"> -         <layout class="QVBoxLayout" name="buttonLStickPressedVerticalLayout" stretch="0,0"> -          <item> -           <layout class="QHBoxLayout" name="buttonLStickPressedHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickPressed"> -              <property name="text"> -               <string>Pressed:</string> +        <item> +         <widget class="QWidget" name="bottomMiddle" native="true"> +          <layout class="QVBoxLayout" stretch="0,0,0"> +           <property name="spacing"> +            <number>6</number> +           </property> +           <property name="leftMargin"> +            <number>0</number> +           </property> +           <property name="topMargin"> +            <number>0</number> +           </property> +           <property name="rightMargin"> +            <number>0</number> +           </property> +           <property name="bottomMargin"> +            <number>0</number> +           </property> +           <item> +            <layout class="QHBoxLayout" name="shoulderButtons"> +             <property name="spacing"> +              <number>3</number> +             </property> +             <item> +              <widget class="QWidget" name="buttonShoulderButtonsLeft" native="true"> +               <layout class="QVBoxLayout" name="buttonShoulderButtonsLeftVerticalLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item> +                 <widget class="QGroupBox" name="buttonShoulderButtonsButtonLGroup"> +                  <property name="title"> +                   <string>L</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsLVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonL"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>L</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item> +                 <widget class="QGroupBox" name="buttonShoulderButtonsButtonZLGroup"> +                  <property name="title"> +                   <string>ZL</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsZLVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonZL"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>ZL</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="horizontalSpacerShoulderButtonsWidget" native="true"> +               <layout class="QHBoxLayout" name="horizontalSpacerShoulderButtonsWidgetLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item> +                 <spacer name="horizontalSpacerShoulderButtons1"> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                  <property name="sizeHint" stdset="0"> +                   <size> +                    <width>0</width> +                    <height>20</height> +                   </size> +                  </property> +                 </spacer> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="buttonMiscButtonsMinusScreenshot" native="true"> +               <layout class="QVBoxLayout" name="buttonMiscButtonsMinusScreenshotVerticalLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonMiscButtonsMinusGroup"> +                  <property name="title"> +                   <string>Minus</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonMiscMinusVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonMinus"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Minus</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonMiscButtonsScreenshotGroup"> +                  <property name="title"> +                   <string>Capture</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonMiscScrCapVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonScreenshot"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Capture</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="buttonMiscButtonsPlusHome" native="true"> +               <layout class="QVBoxLayout" name="buttonMiscButtonsPlusHomeVerticalLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonMiscButtonsPlusGroup"> +                  <property name="title"> +                   <string>Plus</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonMiscPlusVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonPlus"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Plus</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonMiscButtonsHomeGroup"> +                  <property name="title"> +                   <string>Home</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonMiscHomeVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonHome"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Home</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="horizontalSpacerShoulderButtonsWidget3" native="true"> +               <layout class="QHBoxLayout" name="horizontalSpacerShoulderButtonsWidget3Layout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item> +                 <spacer name="horizontalSpacerShoulderButtons2"> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                  <property name="sizeHint" stdset="0"> +                   <size> +                    <width>0</width> +                    <height>20</height> +                   </size> +                  </property> +                 </spacer> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="buttonShoulderButtonsRight" native="true"> +               <layout class="QVBoxLayout" name="buttonShoulderButtonsRightVerticalLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item> +                 <widget class="QGroupBox" name="buttonShoulderButtonsRGroup"> +                  <property name="title"> +                   <string>R</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsRVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonR"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>R</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item> +                 <widget class="QGroupBox" name="buttonShoulderButtonsZRGroup"> +                  <property name="title"> +                   <string>ZR</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsZRVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonZR"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>ZR</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="horizontalSpacerShoulderButtonsWidget2" native="true"> +               <layout class="QHBoxLayout" name="horizontalSpacerShoulderButtonsWidget2Layout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item> +                 <spacer name="horizontalSpacerShoulderButtons3"> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                  <property name="sizeHint" stdset="0"> +                   <size> +                    <width>0</width> +                    <height>20</height> +                   </size> +                  </property> +                 </spacer> +                </item> +               </layout> +              </widget> +             </item> +             <item> +              <widget class="QWidget" name="buttonShoulderButtonsSLSR" native="true"> +               <layout class="QVBoxLayout" name="buttonShoulderButtonsSLSRVerticalLayout"> +                <property name="spacing"> +                 <number>0</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>0</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>0</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonShoulderButtonsSLGroup"> +                  <property name="title"> +                   <string>SL</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsSLVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonSL"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>SL</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonShoulderButtonsSRGroup"> +                  <property name="title"> +                   <string>SR</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonShoulderButtonsSRVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonSR"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>SR</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </widget> +             </item> +            </layout> +           </item> +           <item> +            <widget class="QFrame" name="controllerFrame"> +             <property name="sizePolicy"> +              <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> +               <horstretch>0</horstretch> +               <verstretch>0</verstretch> +              </sizepolicy> +             </property> +             <property name="font"> +              <font> +               <weight>75</weight> +               <bold>true</bold> +              </font> +             </property> +             <property name="styleSheet"> +              <string notr="true">image: url(:/controller/pro);</string> +             </property> +             <layout class="QVBoxLayout" name="verticalLayout_4"> +              <property name="leftMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonLStick"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="5" column="1" colspan="2"> -         <layout class="QVBoxLayout" name="sliderLStickDeadzoneAndModifierVerticalLayout"> -          <property name="sizeConstraint"> -           <enum>QLayout::SetDefaultConstraint</enum> -          </property> -          <item> -           <layout class="QHBoxLayout" name="sliderLStickDeadzoneAndModifierHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelLStickDeadzoneAndModifier"> -              <property name="text"> -               <string>Deadzone: 0</string> +              <property name="topMargin"> +               <number>0</number>                </property> -              <property name="alignment"> -               <enum>Qt::AlignHCenter</enum> +              <property name="rightMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QSlider" name="sliderLStickDeadzoneAndModifier"> -            <property name="orientation"> -             <enum>Qt::Horizontal</enum> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="6" column="1"> -         <spacer name="LStick_verticalSpacer"> -          <property name="orientation"> -           <enum>Qt::Vertical</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>0</width> -            <height>0</height> -           </size> -          </property> -         </spacer> -        </item> -       </layout> -      </widget> -     </item> -     <item row="3" column="0"> -      <widget class="QGroupBox" name="shoulderButtons"> -       <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="buttonShoulderButtonsLVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsLHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelL"> -              <property name="text"> -               <string>L:</string> +              <property name="bottomMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonL"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> +             </layout> +            </widget> +           </item> +           <item> +            <layout class="QHBoxLayout" name="miscButtons"> +             <property name="spacing"> +              <number>3</number> +             </property> +             <item> +              <spacer name="horizontalSpacerMiscButtons1"> +               <property name="orientation"> +                <enum>Qt::Horizontal</enum> +               </property> +               <property name="sizeHint" stdset="0"> +                <size> +                 <width>40</width> +                 <height>0</height> +                </size> +               </property> +              </spacer> +             </item> +             <item> +              <spacer name="horizontalSpacerMiscButtons4"> +               <property name="orientation"> +                <enum>Qt::Horizontal</enum> +               </property> +               <property name="sizeHint" stdset="0"> +                <size> +                 <width>40</width> +                 <height>0</height> +                </size> +               </property> +              </spacer> +             </item> +            </layout> +           </item> +          </layout> +         </widget>          </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonShoulderButtonsRVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsRHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelR"> -              <property name="text"> -               <string>R:</string> +        <item> +         <widget class="QWidget" name="bottomRight" native="true"> +          <layout class="QVBoxLayout" name="bottomRightLayout"> +           <property name="spacing"> +            <number>0</number> +           </property> +           <property name="leftMargin"> +            <number>0</number> +           </property> +           <property name="topMargin"> +            <number>0</number> +           </property> +           <property name="rightMargin"> +            <number>0</number> +           </property> +           <property name="bottomMargin"> +            <number>0</number> +           </property> +           <item> +            <widget class="QGroupBox" name="faceButtons"> +             <property name="sizePolicy"> +              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +               <horstretch>0</horstretch> +               <verstretch>0</verstretch> +              </sizepolicy> +             </property> +             <property name="title"> +              <string>Face Buttons</string> +             </property> +             <property name="flat"> +              <bool>false</bool> +             </property> +             <property name="checkable"> +              <bool>false</bool> +             </property> +             <layout class="QVBoxLayout" name="verticalLayout"> +              <property name="spacing"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </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="buttonShoulderButtonsZLVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsZLHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelZL"> -              <property name="text"> -               <string>ZL:</string> +              <property name="leftMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </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="buttonShoulderButtonsZRVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsZRHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelZR"> -              <property name="text"> -               <string>ZR:</string> +              <property name="topMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonZR"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="0" column="2"> -         <layout class="QVBoxLayout" name="buttonShoulderButtonsSLVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsSLHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelSL"> -              <property name="text"> -               <string>SL:</string> +              <property name="rightMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonSL"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="2"> -         <layout class="QVBoxLayout" name="buttonShoulderButtonsSRVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonShoulderButtonsSRHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelSR"> -              <property name="text"> -               <string>SR:</string> +              <property name="bottomMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonSR"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -       </layout> -      </widget> -     </item> -     <item row="3" column="1"> -      <widget class="QGroupBox" name="misc"> -       <property name="title"> -        <string>Misc.</string> -       </property> -       <property name="flat"> -        <bool>false</bool> -       </property> -       <property name="checkable"> -        <bool>false</bool> -       </property> -       <layout class="QGridLayout" name="gridLayout_6"> -        <item row="1" column="0"> -         <layout class="QVBoxLayout" name="buttonMiscMinusVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonMiscMinusHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelMinus"> -              <property name="text"> -               <string>Minus:</string> +              <item> +               <widget class="QWidget" name="buttonFaceButtonsBWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_6"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerBLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonFaceButtonsXGroup"> +                   <property name="title"> +                    <string>X</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonFaceButtonsXVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonX"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>X</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerBRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonFaceButtonsYAHorizontalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonFaceButtonsYGroup"> +                  <property name="title"> +                   <string>Y</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonFaceButtonsYVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonY"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Y</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonFaceButtonsAGroup"> +                  <property name="title"> +                   <string>A</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonFaceButtonsAVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonA"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>A</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <widget class="QWidget" name="buttonFaceButtonsXWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_10"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerXLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonFaceButtonsBWidget_2"> +                   <property name="title"> +                    <string>B</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonFaceButtonsBVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonB"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>B</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerXRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +             </layout> +            </widget> +           </item> +           <item> +            <spacer name="verticalSpacerBottomRight"> +             <property name="orientation"> +              <enum>Qt::Vertical</enum> +             </property> +             <property name="sizeHint" stdset="0"> +              <size> +               <width>20</width> +               <height>0</height> +              </size> +             </property> +            </spacer> +           </item> +           <item> +            <widget class="QGroupBox" name="RStick"> +             <property name="sizePolicy"> +              <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +               <horstretch>0</horstretch> +               <verstretch>0</verstretch> +              </sizepolicy> +             </property> +             <property name="title"> +              <string>Right Stick</string> +             </property> +             <property name="alignment"> +              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> +             </property> +             <property name="flat"> +              <bool>false</bool> +             </property> +             <property name="checkable"> +              <bool>false</bool> +             </property> +             <layout class="QVBoxLayout" name="verticalLayout_2"> +              <property name="spacing"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonMinus"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="3" column="1"> -         <spacer name="verticalSpacer_2"> -          <property name="orientation"> -           <enum>Qt::Vertical</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>20</width> -            <height>40</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="0" column="0"> -         <layout class="QVBoxLayout" name="buttonMiscPlusVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonMiscPlusHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelPlus"> -              <property name="text"> -               <string>Plus:</string> +              <property name="leftMargin"> +               <number>3</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonPlus"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="0" column="1"> -         <layout class="QVBoxLayout" name="buttonMiscHomeVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonMiscHomeHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelHome"> -              <property name="text"> -               <string>Home:</string> +              <property name="topMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonHome"> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item row="1" column="1"> -         <layout class="QVBoxLayout" name="buttonMiscScrCapVerticalLayout"> -          <item> -           <layout class="QHBoxLayout" name="buttonMiscScrCapHorizontalLayout"> -            <item> -             <widget class="QLabel" name="labelScreenshot"> -              <property name="text"> -               <string>Screen Capture:</string> +              <property name="rightMargin"> +               <number>3</number>                </property> -              <property name="wordWrap"> -               <bool>false</bool> +              <property name="bottomMargin"> +               <number>0</number>                </property> -             </widget> -            </item> -           </layout> -          </item> -          <item> -           <widget class="QPushButton" name="buttonScreenshot"> -            <property name="sizePolicy"> -             <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> -              <horstretch>0</horstretch> -              <verstretch>0</verstretch> -             </sizepolicy> -            </property> -            <property name="maximumSize"> -             <size> -              <width>80</width> -              <height>16777215</height> -             </size> -            </property> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -         </layout> +              <item> +               <widget class="QWidget" name="buttonRStickUpWidget" native="true"> +                <property name="minimumSize"> +                 <size> +                  <width>0</width> +                  <height>0</height> +                 </size> +                </property> +                <layout class="QHBoxLayout" name="horizontalLayout_9"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerRStickUpLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item alignment="Qt::AlignHCenter"> +                  <widget class="QGroupBox" name="buttonRStickUpGroup"> +                   <property name="title"> +                    <string>Up</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonRStickUpVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonRStickUp"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Up</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerRStickUpRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonRStickLeftRightHorizontalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonRStickLeftGroup"> +                  <property name="title"> +                   <string>Left</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonRStickLeftVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonRStickLeft"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Left</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonRStickRightGroup"> +                  <property name="title"> +                   <string>Right</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonRStickRightVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonRStickRight"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Right</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <widget class="QWidget" name="buttonRStickDownWidget" native="true"> +                <layout class="QHBoxLayout" name="horizontalLayout_11"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>0</number> +                 </property> +                 <item> +                  <spacer name="horizontalSpacerRStickDownLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item> +                  <widget class="QGroupBox" name="buttonRStickDownGroup"> +                   <property name="title"> +                    <string>Down</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="buttonRStickDownVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="buttonRStickDown"> +                      <property name="minimumSize"> +                       <size> +                        <width>57</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>55</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 55px;</string> +                      </property> +                      <property name="text"> +                       <string>Down</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="horizontalSpacerRStickDownRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item> +              <item> +               <layout class="QHBoxLayout" name="buttonRStickPressedModifierHorizontalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="groupRStickPressed"> +                  <property name="title"> +                   <string>Pressed</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonRStickPressedVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonRStick"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Pressed</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item alignment="Qt::AlignHCenter"> +                 <widget class="QGroupBox" name="buttonRStickModGroup"> +                  <property name="title"> +                   <string>Modifier</string> +                  </property> +                  <property name="alignment"> +                   <set>Qt::AlignCenter</set> +                  </property> +                  <layout class="QVBoxLayout" name="buttonRStickModVerticalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QPushButton" name="buttonRStickMod"> +                     <property name="minimumSize"> +                      <size> +                       <width>57</width> +                       <height>0</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="styleSheet"> +                      <string notr="true">min-width: 55px;</string> +                     </property> +                     <property name="text"> +                      <string>Modifier</string> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +                <item> +                 <widget class="QGroupBox" name="buttonRStickRangeGroup"> +                  <property name="title"> +                   <string>Range</string> +                  </property> +                  <layout class="QHBoxLayout" name="buttonRStickRangeGroupHorizontalLayout"> +                   <property name="spacing"> +                    <number>3</number> +                   </property> +                   <property name="leftMargin"> +                    <number>3</number> +                   </property> +                   <property name="topMargin"> +                    <number>3</number> +                   </property> +                   <property name="rightMargin"> +                    <number>3</number> +                   </property> +                   <property name="bottomMargin"> +                    <number>3</number> +                   </property> +                   <item> +                    <widget class="QSpinBox" name="spinboxRStickRange"> +                     <property name="minimumSize"> +                      <size> +                       <width>55</width> +                       <height>21</height> +                      </size> +                     </property> +                     <property name="maximumSize"> +                      <size> +                       <width>55</width> +                       <height>16777215</height> +                      </size> +                     </property> +                     <property name="suffix"> +                      <string>%</string> +                     </property> +                     <property name="minimum"> +                      <number>50</number> +                     </property> +                     <property name="maximum"> +                      <number>150</number> +                     </property> +                     <property name="value"> +                      <number>100</number> +                     </property> +                    </widget> +                   </item> +                  </layout> +                 </widget> +                </item> +               </layout> +              </item> +              <item> +               <layout class="QVBoxLayout" name="sliderRStickDeadzoneModifierRangeVerticalLayout"> +                <property name="spacing"> +                 <number>3</number> +                </property> +                <property name="leftMargin"> +                 <number>0</number> +                </property> +                <property name="topMargin"> +                 <number>2</number> +                </property> +                <property name="rightMargin"> +                 <number>0</number> +                </property> +                <property name="bottomMargin"> +                 <number>3</number> +                </property> +                <item> +                 <layout class="QHBoxLayout" name="sliderRStickDeadzoneHorizontalLayout"> +                  <item> +                   <widget class="QLabel" name="labelRStickDeadzone"> +                    <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="sliderRStickDeadzone"> +                  <property name="maximum"> +                   <number>100</number> +                  </property> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                 </widget> +                </item> +                <item> +                 <layout class="QHBoxLayout" name="sliderRStickModifierRangeHorizontalLayout"> +                  <item> +                   <widget class="QLabel" name="labelRStickModifierRange"> +                    <property name="text"> +                     <string>Modifier Range: 0%</string> +                    </property> +                    <property name="alignment"> +                     <set>Qt::AlignHCenter</set> +                    </property> +                   </widget> +                  </item> +                 </layout> +                </item> +                <item> +                 <widget class="QSlider" name="sliderRStickModifierRange"> +                  <property name="maximum"> +                   <number>100</number> +                  </property> +                  <property name="orientation"> +                   <enum>Qt::Horizontal</enum> +                  </property> +                 </widget> +                </item> +               </layout> +              </item> +             </layout> +            </widget> +           </item> +           <item> +            <spacer name="verticalSpacerBottomRight_2"> +             <property name="orientation"> +              <enum>Qt::Vertical</enum> +             </property> +             <property name="sizeHint" stdset="0"> +              <size> +               <width>20</width> +               <height>0</height> +              </size> +             </property> +            </spacer> +           </item> +          </layout> +         </widget>          </item>         </layout>        </widget>       </item>      </layout>     </item> -   <item> -    <spacer name="verticalSpacer"> -     <property name="orientation"> -      <enum>Qt::Vertical</enum> -     </property> -     <property name="sizeHint" stdset="0"> -      <size> -       <width>20</width> -       <height>40</height> -      </size> -     </property> -    </spacer> -   </item> -   <item> -    <layout class="QHBoxLayout" name="horizontalLayout"/> -   </item> -   <item> -    <layout class="QHBoxLayout" name="horizontalLayout_2"> -     <item> -      <widget class="QPushButton" name="buttonClearAll"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <property name="sizeIncrement"> -        <size> -         <width>0</width> -         <height>0</height> -        </size> -       </property> -       <property name="baseSize"> -        <size> -         <width>0</width> -         <height>0</height> -        </size> -       </property> -       <property name="layoutDirection"> -        <enum>Qt::LeftToRight</enum> -       </property> -       <property name="text"> -        <string>Clear All</string> -       </property> -      </widget> -     </item> -     <item> -      <widget class="QPushButton" name="buttonRestoreDefaults"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <property name="sizeIncrement"> -        <size> -         <width>0</width> -         <height>0</height> -        </size> -       </property> -       <property name="baseSize"> -        <size> -         <width>0</width> -         <height>0</height> -        </size> -       </property> -       <property name="layoutDirection"> -        <enum>Qt::LeftToRight</enum> -       </property> -       <property name="text"> -        <string>Restore Defaults</string> -       </property> -      </widget> -     </item> -     <item> -      <spacer name="horizontalSpacer"> -       <property name="orientation"> -        <enum>Qt::Horizontal</enum> -       </property> -       <property name="sizeHint" stdset="0"> -        <size> -         <width>40</width> -         <height>20</height> -        </size> -       </property> -      </spacer> -     </item> -     <item> -      <widget class="QDialogButtonBox" name="buttonBox"> -       <property name="standardButtons"> -        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> -       </property> -      </widget> -     </item> -    </layout> -   </item>    </layout>   </widget> - <resources/> - <connections> -  <connection> -   <sender>buttonBox</sender> -   <signal>accepted()</signal> -   <receiver>ConfigureInputPlayer</receiver> -   <slot>accept()</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>371</x> -     <y>730</y> -    </hint> -    <hint type="destinationlabel"> -     <x>229</x> -     <y>375</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>buttonBox</sender> -   <signal>rejected()</signal> -   <receiver>ConfigureInputPlayer</receiver> -   <slot>reject()</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>371</x> -     <y>730</y> -    </hint> -    <hint type="destinationlabel"> -     <x>229</x> -     <y>375</y> -    </hint> -   </hints> -  </connection> - </connections> + <resources> +  <include location="../../../dist/icons/controller/controller.qrc"/> + </resources> + <connections/>  </ui> diff --git a/src/yuzu/configuration/configure_input_simple.cpp b/src/yuzu/configuration/configure_input_simple.cpp deleted file mode 100644 index 0e0e8f113..000000000 --- a/src/yuzu/configuration/configure_input_simple.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include <array> -#include <tuple> - -#include "ui_configure_input_simple.h" -#include "yuzu/configuration/configure_input.h" -#include "yuzu/configuration/configure_input_player.h" -#include "yuzu/configuration/configure_input_simple.h" -#include "yuzu/uisettings.h" - -namespace { - -template <typename Dialog, typename... Args> -void CallConfigureDialog(ConfigureInputSimple* caller, Args&&... args) { -    caller->ApplyConfiguration(); -    Dialog dialog(caller, std::forward<Args>(args)...); - -    const auto res = dialog.exec(); -    if (res == QDialog::Accepted) { -        dialog.ApplyConfiguration(); -    } -} - -// OnProfileSelect functions should (when applicable): -// - Set controller types -// - Set controller enabled -// - Set docked mode -// - Set advanced controller config/enabled (i.e. debug, kbd, mouse, touch) -// -// OnProfileSelect function should NOT however: -// - Reset any button mappings -// - Open any dialogs -// - Block in any way - -constexpr std::size_t PLAYER_0_INDEX = 0; -constexpr std::size_t HANDHELD_INDEX = 8; - -void HandheldOnProfileSelect() { -    Settings::values.players[HANDHELD_INDEX].connected = true; -    Settings::values.players[HANDHELD_INDEX].type = Settings::ControllerType::DualJoycon; - -    for (std::size_t player = 0; player < HANDHELD_INDEX; ++player) { -        Settings::values.players[player].connected = false; -    } - -    Settings::values.use_docked_mode = false; -    Settings::values.keyboard_enabled = false; -    Settings::values.mouse_enabled = false; -    Settings::values.debug_pad_enabled = false; -    Settings::values.touchscreen.enabled = true; -} - -void DualJoyconsDockedOnProfileSelect() { -    Settings::values.players[PLAYER_0_INDEX].connected = true; -    Settings::values.players[PLAYER_0_INDEX].type = Settings::ControllerType::DualJoycon; - -    for (std::size_t player = 1; player <= HANDHELD_INDEX; ++player) { -        Settings::values.players[player].connected = false; -    } - -    Settings::values.use_docked_mode = true; -    Settings::values.keyboard_enabled = false; -    Settings::values.mouse_enabled = false; -    Settings::values.debug_pad_enabled = false; -    Settings::values.touchscreen.enabled = true; -} - -// Name, OnProfileSelect (called when selected in drop down), OnConfigure (called when configure -// is clicked) -using InputProfile = std::tuple<const char*, void (*)(), void (*)(ConfigureInputSimple*)>; - -constexpr std::array<InputProfile, 3> INPUT_PROFILES{{ -    {QT_TR_NOOP("Single Player - Handheld - Undocked"), HandheldOnProfileSelect, -     [](ConfigureInputSimple* caller) { -         CallConfigureDialog<ConfigureInputPlayer>(caller, HANDHELD_INDEX, false); -     }}, -    {QT_TR_NOOP("Single Player - Dual Joycons - Docked"), DualJoyconsDockedOnProfileSelect, -     [](ConfigureInputSimple* caller) { -         CallConfigureDialog<ConfigureInputPlayer>(caller, PLAYER_0_INDEX, false); -     }}, -    {QT_TR_NOOP("Custom"), [] {}, CallConfigureDialog<ConfigureInput>}, -}}; - -} // namespace - -void ApplyInputProfileConfiguration(int profile_index) { -    std::get<1>( -        INPUT_PROFILES.at(std::min(profile_index, static_cast<int>(INPUT_PROFILES.size() - 1))))(); -} - -ConfigureInputSimple::ConfigureInputSimple(QWidget* parent) -    : QWidget(parent), ui(std::make_unique<Ui::ConfigureInputSimple>()) { -    ui->setupUi(this); - -    for (const auto& profile : INPUT_PROFILES) { -        const QString label = tr(std::get<0>(profile)); -        ui->profile_combobox->addItem(label, label); -    } - -    connect(ui->profile_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, -            &ConfigureInputSimple::OnSelectProfile); -    connect(ui->profile_configure, &QPushButton::clicked, this, &ConfigureInputSimple::OnConfigure); - -    LoadConfiguration(); -} - -ConfigureInputSimple::~ConfigureInputSimple() = default; - -void ConfigureInputSimple::ApplyConfiguration() { -    auto index = ui->profile_combobox->currentIndex(); -    // Make the stored index for "Custom" very large so that if new profiles are added it -    // doesn't change. -    if (index >= static_cast<int>(INPUT_PROFILES.size() - 1)) { -        index = std::numeric_limits<int>::max(); -    } - -    UISettings::values.profile_index = index; -} - -void ConfigureInputSimple::changeEvent(QEvent* event) { -    if (event->type() == QEvent::LanguageChange) { -        RetranslateUI(); -    } - -    QWidget::changeEvent(event); -} - -void ConfigureInputSimple::RetranslateUI() { -    ui->retranslateUi(this); -} - -void ConfigureInputSimple::LoadConfiguration() { -    const auto index = UISettings::values.profile_index; -    if (index >= static_cast<int>(INPUT_PROFILES.size()) || index < 0) { -        ui->profile_combobox->setCurrentIndex(static_cast<int>(INPUT_PROFILES.size() - 1)); -    } else { -        ui->profile_combobox->setCurrentIndex(index); -    } -} - -void ConfigureInputSimple::OnSelectProfile(int index) { -    const auto old_docked = Settings::values.use_docked_mode; -    ApplyInputProfileConfiguration(index); -    OnDockedModeChanged(old_docked, Settings::values.use_docked_mode); -} - -void ConfigureInputSimple::OnConfigure() { -    std::get<2>(INPUT_PROFILES.at(ui->profile_combobox->currentIndex()))(this); -} diff --git a/src/yuzu/configuration/configure_input_simple.h b/src/yuzu/configuration/configure_input_simple.h deleted file mode 100644 index bb5050224..000000000 --- a/src/yuzu/configuration/configure_input_simple.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include <memory> - -#include <QWidget> - -class QPushButton; -class QString; -class QTimer; - -namespace Ui { -class ConfigureInputSimple; -} - -// Used by configuration loader to apply a profile if the input is invalid. -void ApplyInputProfileConfiguration(int profile_index); - -class ConfigureInputSimple : public QWidget { -    Q_OBJECT - -public: -    explicit ConfigureInputSimple(QWidget* parent = nullptr); -    ~ConfigureInputSimple() override; - -    /// Save all button configurations to settings file -    void ApplyConfiguration(); - -private: -    void changeEvent(QEvent* event) override; -    void RetranslateUI(); - -    /// Load configuration settings. -    void LoadConfiguration(); - -    void OnSelectProfile(int index); -    void OnConfigure(); - -    std::unique_ptr<Ui::ConfigureInputSimple> ui; -}; diff --git a/src/yuzu/configuration/configure_input_simple.ui b/src/yuzu/configuration/configure_input_simple.ui deleted file mode 100644 index c4889caa9..000000000 --- a/src/yuzu/configuration/configure_input_simple.ui +++ /dev/null @@ -1,97 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>ConfigureInputSimple</class> - <widget class="QWidget" name="ConfigureInputSimple"> -  <property name="geometry"> -   <rect> -    <x>0</x> -    <y>0</y> -    <width>473</width> -    <height>685</height> -   </rect> -  </property> -  <property name="windowTitle"> -   <string>ConfigureInputSimple</string> -  </property> -  <layout class="QVBoxLayout" name="verticalLayout_5"> -   <item> -    <layout class="QVBoxLayout" name="verticalLayout"> -     <item> -      <widget class="QGroupBox" name="gridGroupBox"> -       <property name="title"> -        <string>Profile</string> -       </property> -       <layout class="QGridLayout" name="gridLayout"> -        <item row="1" column="2"> -         <widget class="QPushButton" name="profile_configure"> -          <property name="text"> -           <string>Configure</string> -          </property> -         </widget> -        </item> -        <item row="1" column="0"> -         <spacer name="horizontalSpacer"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="3"> -         <spacer name="horizontalSpacer_2"> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>40</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item row="1" column="1"> -         <widget class="QComboBox" name="profile_combobox"> -          <property name="minimumSize"> -           <size> -            <width>250</width> -            <height>0</height> -           </size> -          </property> -         </widget> -        </item> -        <item row="0" column="1" colspan="2"> -         <widget class="QLabel" name="label"> -          <property name="text"> -           <string>Choose a controller configuration:</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -    </layout> -   </item> -   <item> -    <spacer name="verticalSpacer"> -     <property name="orientation"> -      <enum>Qt::Vertical</enum> -     </property> -     <property name="sizeHint" stdset="0"> -      <size> -       <width>20</width> -       <height>40</height> -      </size> -     </property> -    </spacer> -   </item> -  </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/yuzu/configuration/configure_mouse_advanced.cpp b/src/yuzu/configuration/configure_mouse_advanced.cpp index 5bcf5ffa8..95e1ae873 100644 --- a/src/yuzu/configuration/configure_mouse_advanced.cpp +++ b/src/yuzu/configuration/configure_mouse_advanced.cpp @@ -205,15 +205,11 @@ void ConfigureMouseAdvanced::HandleClick(          poller->Start();      } -    grabKeyboard(); -    grabMouse(); -    timeout_timer->start(5000); // Cancel after 5 seconds -    poll_timer->start(200);     // Check for new inputs every 200ms +    timeout_timer->start(2500); // Cancel after 2.5 seconds +    poll_timer->start(50);      // Check for new inputs every 50ms  }  void ConfigureMouseAdvanced::SetPollingResult(const Common::ParamPackage& params, bool abort) { -    releaseKeyboard(); -    releaseMouse();      timeout_timer->stop();      poll_timer->stop();      for (auto& poller : device_pollers) { diff --git a/src/yuzu/configuration/configure_mouse_advanced.ui b/src/yuzu/configuration/configure_mouse_advanced.ui index 08245ecf0..74552fdbd 100644 --- a/src/yuzu/configuration/configure_mouse_advanced.ui +++ b/src/yuzu/configuration/configure_mouse_advanced.ui @@ -6,13 +6,18 @@     <rect>      <x>0</x>      <y>0</y> -    <width>250</width> -    <height>261</height> +    <width>310</width> +    <height>193</height>     </rect>    </property>    <property name="windowTitle">     <string>Configure Mouse</string>    </property> +  <property name="styleSheet"> +   <string notr="true">QPushButton { +  min-width: 55px; +}</string> +  </property>    <layout class="QVBoxLayout" name="verticalLayout">     <item>      <widget class="QGroupBox" name="gridGroupBox"> @@ -20,81 +25,33 @@        <string>Mouse Buttons</string>       </property>       <layout class="QGridLayout" name="gridLayout"> -      <item row="0" column="4"> -       <spacer name="horizontalSpacer_2"> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="sizeType"> -         <enum>QSizePolicy::Fixed</enum> -        </property> -        <property name="sizeHint" stdset="0"> -         <size> -          <width>20</width> -          <height>20</height> -         </size> -        </property> -       </spacer> -      </item> -      <item row="0" column="3"> -       <layout class="QVBoxLayout" name="verticalLayout_4"> +      <item row="3" column="5"> +       <layout class="QVBoxLayout" name="verticalLayout_6">          <item> -         <layout class="QHBoxLayout" name="horizontalLayout_3"> +         <layout class="QHBoxLayout" name="horizontalLayout_5">            <item> -           <widget class="QLabel" name="label_3"> +           <widget class="QLabel" name="label_5">              <property name="text"> -             <string>Right:</string> +             <string>Forward:</string>              </property>             </widget>            </item>           </layout>          </item>          <item> -         <widget class="QPushButton" name="right_button"> +         <widget class="QPushButton" name="forward_button">            <property name="minimumSize">             <size> -            <width>75</width> +            <width>57</width>              <height>0</height>             </size>            </property> -          <property name="text"> -           <string/> +          <property name="maximumSize"> +           <size> +            <width>16777215</width> +            <height>16777215</height> +           </size>            </property> -         </widget> -        </item> -       </layout> -      </item> -      <item row="0" column="0"> -       <spacer name="horizontalSpacer"> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="sizeType"> -         <enum>QSizePolicy::Fixed</enum> -        </property> -        <property name="sizeHint" stdset="0"> -         <size> -          <width>20</width> -          <height>20</height> -         </size> -        </property> -       </spacer> -      </item> -      <item row="2" column="1"> -       <layout class="QVBoxLayout" name="verticalLayout_3"> -        <item> -         <layout class="QHBoxLayout" name="horizontalLayout_2"> -          <item> -           <widget class="QLabel" name="label_2"> -            <property name="text"> -             <string>Middle:</string> -            </property> -           </widget> -          </item> -         </layout> -        </item> -        <item> -         <widget class="QPushButton" name="middle_button">            <property name="text">             <string/>            </property> @@ -123,6 +80,12 @@          </item>          <item>           <widget class="QPushButton" name="back_button"> +          <property name="minimumSize"> +           <size> +            <width>57</width> +            <height>0</height> +           </size> +          </property>            <property name="text">             <string/>            </property> @@ -147,7 +110,7 @@           <widget class="QPushButton" name="left_button">            <property name="minimumSize">             <size> -            <width>75</width> +            <width>57</width>              <height>0</height>             </size>            </property> @@ -158,21 +121,99 @@          </item>         </layout>        </item> -      <item row="3" column="3"> -       <layout class="QVBoxLayout" name="verticalLayout_6"> +      <item row="0" column="3"> +       <layout class="QVBoxLayout" name="verticalLayout_3">          <item> -         <layout class="QHBoxLayout" name="horizontalLayout_5"> +         <layout class="QHBoxLayout" name="horizontalLayout_2">            <item> -           <widget class="QLabel" name="label_5"> +           <widget class="QLabel" name="label_2">              <property name="text"> -             <string>Forward:</string> +             <string>Middle:</string>              </property>             </widget>            </item>           </layout>          </item>          <item> -         <widget class="QPushButton" name="forward_button"> +         <widget class="QPushButton" name="middle_button"> +          <property name="minimumSize"> +           <size> +            <width>57</width> +            <height>0</height> +           </size> +          </property> +          <property name="maximumSize"> +           <size> +            <width>16777215</width> +            <height>16777215</height> +           </size> +          </property> +          <property name="text"> +           <string/> +          </property> +         </widget> +        </item> +       </layout> +      </item> +      <item row="0" column="6"> +       <spacer name="horizontalSpacer_2"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeType"> +         <enum>QSizePolicy::Fixed</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>0</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +      <item row="0" column="0"> +       <spacer name="horizontalSpacer"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeType"> +         <enum>QSizePolicy::Fixed</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>0</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +      <item row="0" column="5"> +       <layout class="QVBoxLayout" name="verticalLayout_4"> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_3"> +          <item> +           <widget class="QLabel" name="label_3"> +            <property name="text"> +             <string>Right:</string> +            </property> +           </widget> +          </item> +         </layout> +        </item> +        <item> +         <widget class="QPushButton" name="right_button"> +          <property name="minimumSize"> +           <size> +            <width>57</width> +            <height>0</height> +           </size> +          </property> +          <property name="maximumSize"> +           <size> +            <width>16777215</width> +            <height>16777215</height> +           </size> +          </property>            <property name="text">             <string/>            </property> @@ -180,6 +221,32 @@          </item>         </layout>        </item> +      <item row="0" column="2"> +       <spacer name="horizontalSpacer_4"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>0</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item> +      <item row="0" column="4"> +       <spacer name="horizontalSpacer_5"> +        <property name="orientation"> +         <enum>Qt::Horizontal</enum> +        </property> +        <property name="sizeHint" stdset="0"> +         <size> +          <width>0</width> +          <height>20</height> +         </size> +        </property> +       </spacer> +      </item>       </layout>      </widget>     </item> @@ -187,15 +254,39 @@      <layout class="QHBoxLayout" name="horizontalLayout_6">       <item>        <widget class="QPushButton" name="buttonClearAll"> +       <property name="minimumSize"> +        <size> +         <width>57</width> +         <height>0</height> +        </size> +       </property> +       <property name="maximumSize"> +        <size> +         <width>16777215</width> +         <height>16777215</height> +        </size> +       </property>         <property name="text"> -        <string>Clear All</string> +        <string>Clear</string>         </property>        </widget>       </item>       <item>        <widget class="QPushButton" name="buttonRestoreDefaults"> +       <property name="minimumSize"> +        <size> +         <width>57</width> +         <height>0</height> +        </size> +       </property> +       <property name="maximumSize"> +        <size> +         <width>16777215</width> +         <height>16777215</height> +        </size> +       </property>         <property name="text"> -        <string>Restore Defaults</string> +        <string>Defaults</string>         </property>        </widget>       </item> @@ -206,21 +297,24 @@         </property>         <property name="sizeHint" stdset="0">          <size> -         <width>40</width> +         <width>0</width>           <height>20</height>          </size>         </property>        </spacer>       </item> +     <item> +      <widget class="QDialogButtonBox" name="buttonBox"> +       <property name="styleSheet"> +        <string notr="true"/> +       </property> +       <property name="standardButtons"> +        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +       </property> +      </widget> +     </item>      </layout>     </item> -   <item> -    <widget class="QDialogButtonBox" name="buttonBox"> -     <property name="standardButtons"> -      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> -     </property> -    </widget> -   </item>    </layout>   </widget>   <resources/> | 
