diff options
Diffstat (limited to 'src/yuzu/configuration')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.ui | 116 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 94 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.h | 12 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.ui | 72 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 26 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.ui | 79 | 
9 files changed, 372 insertions, 39 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 59918847a..280d81ba9 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -624,6 +624,10 @@ void Config::ReadPathValues() {  void Config::ReadRendererValues() {      qt_config->beginGroup(QStringLiteral("Renderer")); +    Settings::values.renderer_backend = +        static_cast<Settings::RendererBackend>(ReadSetting(QStringLiteral("backend"), 0).toInt()); +    Settings::values.renderer_debug = ReadSetting(QStringLiteral("debug"), false).toBool(); +    Settings::values.vulkan_device = ReadSetting(QStringLiteral("vulkan_device"), 0).toInt();      Settings::values.resolution_factor =          ReadSetting(QStringLiteral("resolution_factor"), 1.0).toFloat();      Settings::values.use_frame_limit = @@ -1056,6 +1060,9 @@ void Config::SavePathValues() {  void Config::SaveRendererValues() {      qt_config->beginGroup(QStringLiteral("Renderer")); +    WriteSetting(QStringLiteral("backend"), static_cast<int>(Settings::values.renderer_backend), 0); +    WriteSetting(QStringLiteral("debug"), Settings::values.renderer_debug, false); +    WriteSetting(QStringLiteral("vulkan_device"), Settings::values.vulkan_device, 0);      WriteSetting(QStringLiteral("resolution_factor"),                   static_cast<double>(Settings::values.resolution_factor), 1.0);      WriteSetting(QStringLiteral("use_frame_limit"), Settings::values.use_frame_limit, true); diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 90c1f9459..9631059c7 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -36,6 +36,8 @@ void ConfigureDebug::SetConfiguration() {      ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args));      ui->reporting_services->setChecked(Settings::values.reporting_services);      ui->quest_flag->setChecked(Settings::values.quest_flag); +    ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn()); +    ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug);  }  void ConfigureDebug::ApplyConfiguration() { @@ -46,6 +48,7 @@ void ConfigureDebug::ApplyConfiguration() {      Settings::values.program_args = ui->homebrew_args_edit->text().toStdString();      Settings::values.reporting_services = ui->reporting_services->isChecked();      Settings::values.quest_flag = ui->quest_flag->isChecked(); +    Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();      Debugger::ToggleConsole();      Log::Filter filter;      filter.ParseFilterString(Settings::values.log_filter); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index ce49569bb..e028c4c80 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -7,7 +7,7 @@      <x>0</x>      <y>0</y>      <width>400</width> -    <height>474</height> +    <height>467</height>     </rect>    </property>    <property name="windowTitle"> @@ -103,6 +103,80 @@          </item>         </layout>        </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QGroupBox" name="groupBox_3"> +     <property name="title"> +      <string>Homebrew</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_5"> +      <item> +       <layout class="QHBoxLayout" name="horizontalLayout_4"> +        <item> +         <widget class="QLabel" name="label_3"> +          <property name="text"> +           <string>Arguments String</string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QLineEdit" name="homebrew_args_edit"/> +        </item> +       </layout> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QGroupBox" name="groupBox_4"> +     <property name="title"> +      <string>Graphics</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_6"> +      <item> +       <widget class="QCheckBox" name="enable_graphics_debugging"> +        <property name="enabled"> +         <bool>true</bool> +        </property> +        <property name="whatsThis"> +         <string>When checked, the graphics API enters in a slower debugging mode</string> +        </property> +        <property name="text"> +         <string>Enable Graphics Debugging</string> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QGroupBox" name="groupBox_5"> +     <property name="title"> +      <string>Dump</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_6"> +      <item> +       <widget class="QCheckBox" name="dump_decompressed_nso"> +        <property name="whatsThis"> +         <string>When checked, any NSO yuzu tries to load or patch will be copied decompressed to the yuzu/dump directory.</string> +        </property> +        <property name="text"> +         <string>Dump Decompressed NSOs</string> +        </property> +       </widget> +      </item> +      <item> +       <widget class="QCheckBox" name="dump_exefs"> +        <property name="whatsThis"> +         <string>When checked, any game that yuzu loads will have its ExeFS dumped to the yuzu/dump directory.</string> +        </property> +        <property name="text"> +         <string>Dump ExeFS</string> +        </property> +       </widget> +      </item>        <item>         <widget class="QCheckBox" name="reporting_services">          <property name="text"> @@ -129,11 +203,11 @@      </widget>     </item>     <item> -    <widget class="QGroupBox" name="groupBox_5"> +    <widget class="QGroupBox" name="groupBox_6">       <property name="title">        <string>Advanced</string>       </property> -     <layout class="QVBoxLayout" name="verticalLayout"> +     <layout class="QVBoxLayout" name="verticalLayout_7">        <item>         <widget class="QCheckBox" name="quest_flag">          <property name="text"> @@ -145,29 +219,6 @@      </widget>     </item>     <item> -    <widget class="QGroupBox" name="groupBox_3"> -     <property name="title"> -      <string>Homebrew</string> -     </property> -     <layout class="QVBoxLayout" name="verticalLayout_5"> -      <item> -       <layout class="QHBoxLayout" name="horizontalLayout_4"> -        <item> -         <widget class="QLabel" name="label_3"> -          <property name="text"> -           <string>Arguments String</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QLineEdit" name="homebrew_args_edit"/> -        </item> -       </layout> -      </item> -     </layout> -    </widget> -   </item> -   <item>      <spacer name="verticalSpacer">       <property name="orientation">        <enum>Qt::Vertical</enum> @@ -185,6 +236,19 @@     </item>    </layout>   </widget> + <tabstops> +  <tabstop>toggle_gdbstub</tabstop> +  <tabstop>gdbport_spinbox</tabstop> +  <tabstop>log_filter_edit</tabstop> +  <tabstop>toggle_console</tabstop> +  <tabstop>open_log_button</tabstop> +  <tabstop>homebrew_args_edit</tabstop> +  <tabstop>enable_graphics_debugging</tabstop> +  <tabstop>dump_decompressed_nso</tabstop> +  <tabstop>dump_exefs</tabstop> +  <tabstop>reporting_services</tabstop> +  <tabstop>quest_flag</tabstop> + </tabstops>   <resources/>   <connections>    <connection> diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 2c9e322c9..f57a24e36 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -3,6 +3,13 @@  // Refer to the license.txt file included.  #include <QColorDialog> +#include <QComboBox> +#ifdef HAS_VULKAN +#include <QVulkanInstance> +#endif + +#include "common/common_types.h" +#include "common/logging/log.h"  #include "core/core.h"  #include "core/settings.h"  #include "ui_configure_graphics.h" @@ -51,10 +58,18 @@ Resolution FromResolutionFactor(float factor) {  ConfigureGraphics::ConfigureGraphics(QWidget* parent)      : QWidget(parent), ui(new Ui::ConfigureGraphics) { +    vulkan_device = Settings::values.vulkan_device; +    RetrieveVulkanDevices(); +      ui->setupUi(this);      SetConfiguration(); +    connect(ui->api, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, +            [this] { UpdateDeviceComboBox(); }); +    connect(ui->device, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, +            [this](int device) { UpdateDeviceSelection(device); }); +      connect(ui->bg_button, &QPushButton::clicked, this, [this] {          const QColor new_bg_color = QColorDialog::getColor(bg_color);          if (!new_bg_color.isValid()) { @@ -64,11 +79,22 @@ ConfigureGraphics::ConfigureGraphics(QWidget* parent)      });  } +void ConfigureGraphics::UpdateDeviceSelection(int device) { +    if (device == -1) { +        return; +    } +    if (GetCurrentGraphicsBackend() == Settings::RendererBackend::Vulkan) { +        vulkan_device = device; +    } +} +  ConfigureGraphics::~ConfigureGraphics() = default;  void ConfigureGraphics::SetConfiguration() {      const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); +    ui->api->setEnabled(runtime_lock); +    ui->api->setCurrentIndex(static_cast<int>(Settings::values.renderer_backend));      ui->resolution_factor_combobox->setCurrentIndex(          static_cast<int>(FromResolutionFactor(Settings::values.resolution_factor)));      ui->use_disk_shader_cache->setEnabled(runtime_lock); @@ -80,9 +106,12 @@ void ConfigureGraphics::SetConfiguration() {      ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode);      UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green,                                                   Settings::values.bg_blue)); +    UpdateDeviceComboBox();  }  void ConfigureGraphics::ApplyConfiguration() { +    Settings::values.renderer_backend = GetCurrentGraphicsBackend(); +    Settings::values.vulkan_device = vulkan_device;      Settings::values.resolution_factor =          ToResolutionFactor(static_cast<Resolution>(ui->resolution_factor_combobox->currentIndex()));      Settings::values.use_disk_shader_cache = ui->use_disk_shader_cache->isChecked(); @@ -116,3 +145,68 @@ void ConfigureGraphics::UpdateBackgroundColorButton(QColor color) {      const QIcon color_icon(pixmap);      ui->bg_button->setIcon(color_icon);  } + +void ConfigureGraphics::UpdateDeviceComboBox() { +    ui->device->clear(); + +    bool enabled = false; +    switch (GetCurrentGraphicsBackend()) { +    case Settings::RendererBackend::OpenGL: +        ui->device->addItem(tr("OpenGL Graphics Device")); +        enabled = false; +        break; +    case Settings::RendererBackend::Vulkan: +        for (const auto device : vulkan_devices) { +            ui->device->addItem(device); +        } +        ui->device->setCurrentIndex(vulkan_device); +        enabled = !vulkan_devices.empty(); +        break; +    } +    ui->device->setEnabled(enabled && !Core::System::GetInstance().IsPoweredOn()); +} + +void ConfigureGraphics::RetrieveVulkanDevices() { +#ifdef HAS_VULKAN +    QVulkanInstance instance; +    instance.setApiVersion(QVersionNumber(1, 1, 0)); +    if (!instance.create()) { +        LOG_INFO(Frontend, "Vulkan 1.1 not available"); +        return; +    } +    const auto vkEnumeratePhysicalDevices{reinterpret_cast<PFN_vkEnumeratePhysicalDevices>( +        instance.getInstanceProcAddr("vkEnumeratePhysicalDevices"))}; +    if (vkEnumeratePhysicalDevices == nullptr) { +        LOG_INFO(Frontend, "Failed to get pointer to vkEnumeratePhysicalDevices"); +        return; +    } +    u32 physical_device_count; +    if (vkEnumeratePhysicalDevices(instance.vkInstance(), &physical_device_count, nullptr) != +        VK_SUCCESS) { +        LOG_INFO(Frontend, "Failed to get physical devices count"); +        return; +    } +    std::vector<VkPhysicalDevice> physical_devices(physical_device_count); +    if (vkEnumeratePhysicalDevices(instance.vkInstance(), &physical_device_count, +                                   physical_devices.data()) != VK_SUCCESS) { +        LOG_INFO(Frontend, "Failed to get physical devices"); +        return; +    } + +    const auto vkGetPhysicalDeviceProperties{reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>( +        instance.getInstanceProcAddr("vkGetPhysicalDeviceProperties"))}; +    if (vkGetPhysicalDeviceProperties == nullptr) { +        LOG_INFO(Frontend, "Failed to get pointer to vkGetPhysicalDeviceProperties"); +        return; +    } +    for (const auto physical_device : physical_devices) { +        VkPhysicalDeviceProperties properties; +        vkGetPhysicalDeviceProperties(physical_device, &properties); +        vulkan_devices.push_back(QString::fromUtf8(properties.deviceName)); +    } +#endif +} + +Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { +    return static_cast<Settings::RendererBackend>(ui->api->currentIndex()); +} diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index fae28d98e..7e0596d9c 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -5,7 +5,10 @@  #pragma once  #include <memory> +#include <vector> +#include <QString>  #include <QWidget> +#include "core/settings.h"  namespace Ui {  class ConfigureGraphics; @@ -27,7 +30,16 @@ private:      void SetConfiguration();      void UpdateBackgroundColorButton(QColor color); +    void UpdateDeviceComboBox(); +    void UpdateDeviceSelection(int device); + +    void RetrieveVulkanDevices(); + +    Settings::RendererBackend GetCurrentGraphicsBackend() const;      std::unique_ptr<Ui::ConfigureGraphics> ui;      QColor bg_color; + +    std::vector<QString> vulkan_devices; +    u32 vulkan_device{};  }; diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index 0309ee300..e24372204 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -7,21 +7,69 @@      <x>0</x>      <y>0</y>      <width>400</width> -    <height>300</height> +    <height>321</height>     </rect>    </property>    <property name="windowTitle">     <string>Form</string>    </property> -  <layout class="QVBoxLayout" name="verticalLayout"> +  <layout class="QVBoxLayout" name="verticalLayout_1">     <item> -    <layout class="QVBoxLayout" name="verticalLayout_3"> +    <layout class="QVBoxLayout" name="verticalLayout_2"> +     <item> +      <widget class="QGroupBox" name="groupBox_2"> +       <property name="title"> +        <string>API Settings</string> +       </property> +       <layout class="QVBoxLayout" name="verticalLayout_3"> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_4"> +          <item> +           <widget class="QLabel" name="label_2"> +            <property name="text"> +             <string>API:</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QComboBox" name="api"> +            <item> +             <property name="text"> +              <string notr="true">OpenGL</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string notr="true">Vulkan</string> +             </property> +            </item> +           </widget> +          </item> +         </layout> +        </item> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_5"> +          <item> +           <widget class="QLabel" name="label_3"> +            <property name="text"> +             <string>Device:</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QComboBox" name="device"/> +          </item> +         </layout> +        </item> +       </layout> +      </widget> +     </item>       <item>        <widget class="QGroupBox" name="groupBox">         <property name="title"> -        <string>Graphics</string> +        <string>Graphics Settings</string>         </property> -       <layout class="QVBoxLayout" name="verticalLayout_2"> +       <layout class="QVBoxLayout" name="verticalLayout_4">          <item>           <widget class="QCheckBox" name="use_disk_shader_cache">            <property name="text"> @@ -30,16 +78,16 @@           </widget>          </item>          <item> -         <widget class="QCheckBox" name="use_accurate_gpu_emulation"> +         <widget class="QCheckBox" name="use_asynchronous_gpu_emulation">            <property name="text"> -           <string>Use accurate GPU emulation (slow)</string> +           <string>Use asynchronous GPU emulation</string>            </property>           </widget>          </item>          <item> -         <widget class="QCheckBox" name="use_asynchronous_gpu_emulation"> +         <widget class="QCheckBox" name="use_accurate_gpu_emulation">            <property name="text"> -           <string>Use asynchronous GPU emulation</string> +           <string>Use accurate GPU emulation (slow)</string>            </property>           </widget>          </item> @@ -51,11 +99,11 @@           </widget>          </item>          <item> -         <layout class="QHBoxLayout" name="horizontalLayout"> +         <layout class="QHBoxLayout" name="horizontalLayout_2">            <item>             <widget class="QLabel" name="label">              <property name="text"> -             <string>Internal Resolution</string> +             <string>Internal Resolution:</string>              </property>             </widget>            </item> @@ -91,7 +139,7 @@           </layout>          </item>          <item> -         <layout class="QHBoxLayout" name="horizontalLayout_6"> +         <layout class="QHBoxLayout" name="horizontalLayout_3">            <item>             <widget class="QLabel" name="bg_label">              <property name="text"> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 67c9a7c6d..96dec50e2 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -236,6 +236,8 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          widget->setVisible(false);      analog_map_stick = {ui->buttonLStickAnalog, ui->buttonRStickAnalog}; +    analog_map_deadzone = {ui->sliderLStickDeadzone, ui->sliderRStickDeadzone}; +    analog_map_deadzone_label = {ui->labelLStickDeadzone, ui->labelRStickDeadzone};      for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; button_id++) {          auto* const button = button_map[button_id]; @@ -326,6 +328,11 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                      InputCommon::Polling::DeviceType::Analog);              }          }); +        connect(analog_map_deadzone[analog_id], &QSlider::valueChanged, [=] { +            const float deadzone = analog_map_deadzone[analog_id]->value() / 100.0f; +            analog_map_deadzone_label[analog_id]->setText(tr("Deadzone: %1").arg(deadzone)); +            analogs_param[analog_id].Set("deadzone", deadzone); +        });      }      connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); @@ -484,7 +491,7 @@ void ConfigureInputPlayer::ClearAll() {                  continue;              } -            analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]); +            analogs_param[analog_id].Clear();          }      } @@ -508,6 +515,23 @@ void ConfigureInputPlayer::UpdateButtonLabels() {                  AnalogToText(analogs_param[analog_id], analog_sub_buttons[sub_button_id]));          }          analog_map_stick[analog_id]->setText(tr("Set Analog Stick")); + +        auto& param = analogs_param[analog_id]; +        auto* const analog_deadzone_slider = analog_map_deadzone[analog_id]; +        auto* const analog_deadzone_label = analog_map_deadzone_label[analog_id]; + +        if (param.Has("engine") && param.Get("engine", "") == "sdl") { +            if (!param.Has("deadzone")) { +                param.Set("deadzone", 0.1f); +            } + +            analog_deadzone_slider->setValue(static_cast<int>(param.Get("deadzone", 0.1f) * 100)); +            analog_deadzone_slider->setVisible(true); +            analog_deadzone_label->setVisible(true); +        } else { +            analog_deadzone_slider->setVisible(false); +            analog_deadzone_label->setVisible(false); +        }      }  } diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h index c66027651..045704e47 100644 --- a/src/yuzu/configuration/configure_input_player.h +++ b/src/yuzu/configuration/configure_input_player.h @@ -97,6 +97,8 @@ private:      /// Analog inputs are also represented each with a single button, used to configure with an      /// actual analog stick      std::array<QPushButton*, Settings::NativeAnalog::NumAnalogs> analog_map_stick; +    std::array<QSlider*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone; +    std::array<QLabel*, Settings::NativeAnalog::NumAnalogs> analog_map_deadzone_label;      static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons; diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui index 42db020be..1556481d0 100644 --- a/src/yuzu/configuration/configure_input_player.ui +++ b/src/yuzu/configuration/configure_input_player.ui @@ -170,6 +170,44 @@            </item>           </layout>          </item> +        <item row="4" column="0" colspan="2"> +         <layout class="QVBoxLayout" name="sliderRStickDeadzoneVerticalLayout"> +          <item> +           <layout class="QHBoxLayout" name="sliderRStickDeadzoneHorizontalLayout"> +            <item> +             <widget class="QLabel" name="labelRStickDeadzone"> +              <property name="text"> +               <string>Deadzone: 0</string> +              </property> +              <property name="alignment"> +               <enum>Qt::AlignHCenter</enum> +              </property> +             </widget> +            </item> +           </layout> +          </item> +          <item> +           <widget class="QSlider" name="sliderRStickDeadzone"> +            <property name="orientation"> +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </item> +        <item row="5" column="0"> +         <spacer name="RStick_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> @@ -745,6 +783,47 @@            </item>           </layout>          </item> +        <item row="5" column="1" colspan="2"> +         <layout class="QVBoxLayout" name="sliderLStickDeadzoneVerticalLayout"> +          <property name="sizeConstraint"> +           <enum>QLayout::SetDefaultConstraint</enum> +          </property> +          <item> +           <layout class="QHBoxLayout" name="sliderLStickDeadzoneHorizontalLayout"> +            <item> +             <widget class="QLabel" name="labelLStickDeadzone"> +              <property name="text"> +               <string>Deadzone: 0</string> +              </property> +              <property name="alignment"> +               <enum>Qt::AlignHCenter</enum> +              </property> +             </widget> +            </item> +           </layout> +          </item> +          <item> +           <widget class="QSlider" name="sliderLStickDeadzone"> +            <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> | 
