diff options
Diffstat (limited to 'src/yuzu/configuration')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 36 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.ui | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 76 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_mouse_advanced.cpp | 39 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_ui.cpp | 26 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_ui.ui | 45 | 
9 files changed, 159 insertions, 83 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 59a193edd..cb71b8d11 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -578,7 +578,6 @@ void Config::ReadPathValues() {      UISettings::values.roms_path = ReadSetting(QStringLiteral("romsPath")).toString();      UISettings::values.symbols_path = ReadSetting(QStringLiteral("symbolsPath")).toString(); -    UISettings::values.screenshot_path = ReadSetting(QStringLiteral("screenshotPath")).toString();      UISettings::values.game_dir_deprecated =          ReadSetting(QStringLiteral("gameListRootDir"), QStringLiteral(".")).toString();      UISettings::values.game_dir_deprecated_deepscan = @@ -666,8 +665,6 @@ void Config::ReadRendererValues() {                        QStringLiteral("use_asynchronous_shaders"), false);      ReadSettingGlobal(Settings::values.use_fast_gpu_time, QStringLiteral("use_fast_gpu_time"),                        true); -    ReadSettingGlobal(Settings::values.force_30fps_mode, QStringLiteral("force_30fps_mode"), false); -      ReadSettingGlobal(Settings::values.bg_red, QStringLiteral("bg_red"), 0.0);      ReadSettingGlobal(Settings::values.bg_green, QStringLiteral("bg_green"), 0.0);      ReadSettingGlobal(Settings::values.bg_blue, QStringLiteral("bg_blue"), 0.0); @@ -675,6 +672,22 @@ void Config::ReadRendererValues() {      qt_config->endGroup();  } +void Config::ReadScreenshotValues() { +    qt_config->beginGroup(QStringLiteral("Screenshots")); + +    UISettings::values.enable_screenshot_save_as = +        ReadSetting(QStringLiteral("enable_screenshot_save_as"), true).toBool(); +    FileUtil::GetUserPath( +        FileUtil::UserPath::ScreenshotsDir, +        qt_config +            ->value(QStringLiteral("screenshot_path"), QString::fromStdString(FileUtil::GetUserPath( +                                                           FileUtil::UserPath::ScreenshotsDir))) +            .toString() +            .toStdString()); + +    qt_config->endGroup(); +} +  void Config::ReadShortcutValues() {      qt_config->beginGroup(QStringLiteral("Shortcuts")); @@ -756,6 +769,7 @@ void Config::ReadUIValues() {      ReadUIGamelistValues();      ReadUILayoutValues();      ReadPathValues(); +    ReadScreenshotValues();      ReadShortcutValues();      UISettings::values.single_window_mode = @@ -1085,7 +1099,6 @@ void Config::SavePathValues() {      WriteSetting(QStringLiteral("romsPath"), UISettings::values.roms_path);      WriteSetting(QStringLiteral("symbolsPath"), UISettings::values.symbols_path); -    WriteSetting(QStringLiteral("screenshotPath"), UISettings::values.screenshot_path);      qt_config->beginWriteArray(QStringLiteral("gamedirs"));      for (int i = 0; i < UISettings::values.game_dirs.size(); ++i) {          qt_config->setArrayIndex(i); @@ -1153,9 +1166,6 @@ void Config::SaveRendererValues() {                         Settings::values.use_asynchronous_shaders, false);      WriteSettingGlobal(QStringLiteral("use_fast_gpu_time"), Settings::values.use_fast_gpu_time,                         true); -    WriteSettingGlobal(QStringLiteral("force_30fps_mode"), Settings::values.force_30fps_mode, -                       false); -      // Cast to double because Qt's written float values are not human-readable      WriteSettingGlobal(QStringLiteral("bg_red"), Settings::values.bg_red, 0.0);      WriteSettingGlobal(QStringLiteral("bg_green"), Settings::values.bg_green, 0.0); @@ -1164,6 +1174,17 @@ void Config::SaveRendererValues() {      qt_config->endGroup();  } +void Config::SaveScreenshotValues() { +    qt_config->beginGroup(QStringLiteral("Screenshots")); + +    WriteSetting(QStringLiteral("enable_screenshot_save_as"), +                 UISettings::values.enable_screenshot_save_as); +    WriteSetting(QStringLiteral("screenshot_path"), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::ScreenshotsDir))); + +    qt_config->endGroup(); +} +  void Config::SaveShortcutValues() {      qt_config->beginGroup(QStringLiteral("Shortcuts")); @@ -1226,6 +1247,7 @@ void Config::SaveUIValues() {      SaveUIGamelistValues();      SaveUILayoutValues();      SavePathValues(); +    SaveScreenshotValues();      SaveShortcutValues();      WriteSetting(QStringLiteral("singleWindowMode"), UISettings::values.single_window_mode, true); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 8e815f829..e5f39b040 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -51,6 +51,7 @@ private:      void ReadPathValues();      void ReadCpuValues();      void ReadRendererValues(); +    void ReadScreenshotValues();      void ReadShortcutValues();      void ReadSystemValues();      void ReadUIValues(); @@ -76,6 +77,7 @@ private:      void SavePathValues();      void SaveCpuValues();      void SaveRendererValues(); +    void SaveScreenshotValues();      void SaveShortcutValues();      void SaveSystemValues();      void SaveUIValues(); diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 8b9180811..c5d1a778c 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -25,14 +25,12 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      ui->use_vsync->setEnabled(runtime_lock);      ui->use_assembly_shaders->setEnabled(runtime_lock);      ui->use_asynchronous_shaders->setEnabled(runtime_lock); -    ui->force_30fps_mode->setEnabled(runtime_lock);      ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);      ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue());      ui->use_assembly_shaders->setChecked(Settings::values.use_assembly_shaders.GetValue());      ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue());      ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue()); -    ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode.GetValue());      if (Settings::configuring_global) {          ui->gpu_accuracy->setCurrentIndex( @@ -78,9 +76,6 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {          if (Settings::values.use_fast_gpu_time.UsingGlobal()) {              Settings::values.use_fast_gpu_time.SetValue(ui->use_fast_gpu_time->isChecked());          } -        if (Settings::values.force_30fps_mode.UsingGlobal()) { -            Settings::values.force_30fps_mode.SetValue(ui->force_30fps_mode->isChecked()); -        }          if (Settings::values.max_anisotropy.UsingGlobal()) {              Settings::values.max_anisotropy.SetValue(                  ui->anisotropic_filtering_combobox->currentIndex()); @@ -97,8 +92,6 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {                                                   use_asynchronous_shaders);          ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_fast_gpu_time,                                                   ui->use_fast_gpu_time, use_fast_gpu_time); -        ConfigurationShared::ApplyPerGameSetting(&Settings::values.force_30fps_mode, -                                                 ui->force_30fps_mode, force_30fps_mode);          ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,                                                   ui->anisotropic_filtering_combobox); @@ -132,7 +125,6 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {          ui->use_asynchronous_shaders->setEnabled(              Settings::values.use_asynchronous_shaders.UsingGlobal());          ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal()); -        ui->force_30fps_mode->setEnabled(Settings::values.force_30fps_mode.UsingGlobal());          ui->anisotropic_filtering_combobox->setEnabled(              Settings::values.max_anisotropy.UsingGlobal()); @@ -149,8 +141,6 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {          Settings::values.use_asynchronous_shaders, use_asynchronous_shaders);      ConfigurationShared::SetColoredTristate(ui->use_fast_gpu_time, "use_fast_gpu_time",                                              Settings::values.use_fast_gpu_time, use_fast_gpu_time); -    ConfigurationShared::SetColoredTristate(ui->force_30fps_mode, "force_30fps_mode", -                                            Settings::values.force_30fps_mode, force_30fps_mode);      ConfigurationShared::SetColoredComboBox(          ui->gpu_accuracy, ui->label_gpu_accuracy, "label_gpu_accuracy",          static_cast<int>(Settings::values.gpu_accuracy.GetValue(true))); diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index 3c4f6f7bb..e61b571c7 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -38,5 +38,4 @@ private:      ConfigurationShared::CheckState use_assembly_shaders;      ConfigurationShared::CheckState use_asynchronous_shaders;      ConfigurationShared::CheckState use_fast_gpu_time; -    ConfigurationShared::CheckState force_30fps_mode;  }; diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 6a0d29c27..a793c803d 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -97,13 +97,6 @@           </widget>          </item>          <item> -         <widget class="QCheckBox" name="force_30fps_mode"> -          <property name="text"> -           <string>Force 30 FPS mode</string> -          </property> -         </widget> -        </item> -        <item>           <widget class="QCheckBox" name="use_fast_gpu_time">            <property name="text">             <string>Use Fast GPU Time</string> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 00433926d..b1850bc95 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -280,9 +280,9 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          }          button->setContextMenuPolicy(Qt::CustomContextMenu); -        connect(button, &QPushButton::clicked, [=] { +        connect(button, &QPushButton::clicked, [=, this] {              HandleClick(button_map[button_id], -                        [=](Common::ParamPackage params) { +                        [=, 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 @@ -300,19 +300,20 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                          },                          InputCommon::Polling::DeviceType::Button);          }); -        connect(button, &QPushButton::customContextMenuRequested, [=](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)); -        }); +        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 analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; analog_id++) { @@ -323,16 +324,16 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i              }              analog_button->setContextMenuPolicy(Qt::CustomContextMenu); -            connect(analog_button, &QPushButton::clicked, [=]() { +            connect(analog_button, &QPushButton::clicked, [=, this] {                  HandleClick(analog_map_buttons[analog_id][sub_button_id], -                            [=](const Common::ParamPackage& params) { +                            [=, this](const Common::ParamPackage& params) {                                  SetAnalogButton(params, analogs_param[analog_id],                                                  analog_sub_buttons[sub_button_id]);                              },                              InputCommon::Polling::DeviceType::Button);              });              connect(analog_button, &QPushButton::customContextMenuRequested, -                    [=](const QPoint& menu_location) { +                    [=, this](const QPoint& menu_location) {                          QMenu context_menu;                          context_menu.addAction(tr("Clear"), [&] {                              analogs_param[analog_id].Erase(analog_sub_buttons[sub_button_id]); @@ -350,32 +351,35 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                              menu_location));                      });          } -        connect(analog_map_stick[analog_id], &QPushButton::clicked, [=] { +        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], -                    [=](const Common::ParamPackage& params) { analogs_param[analog_id] = params; }, -                    InputCommon::Polling::DeviceType::Analog); +                HandleClick(analog_map_stick[analog_id], +                            [=, this](const Common::ParamPackage& params) { +                                analogs_param[analog_id] = params; +                            }, +                            InputCommon::Polling::DeviceType::Analog);              }          }); -        connect(analog_map_deadzone_and_modifier_slider[analog_id], &QSlider::valueChanged, [=] { -            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); -            } -        }); +        connect(analog_map_deadzone_and_modifier_slider[analog_id], &QSlider::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); +                    } +                });      }      connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); diff --git a/src/yuzu/configuration/configure_mouse_advanced.cpp b/src/yuzu/configuration/configure_mouse_advanced.cpp index e0647ea5b..ea2549363 100644 --- a/src/yuzu/configuration/configure_mouse_advanced.cpp +++ b/src/yuzu/configuration/configure_mouse_advanced.cpp @@ -83,25 +83,28 @@ ConfigureMouseAdvanced::ConfigureMouseAdvanced(QWidget* parent)          }          button->setContextMenuPolicy(Qt::CustomContextMenu); -        connect(button, &QPushButton::clicked, [=] { -            HandleClick( -                button_map[button_id], -                [=](const Common::ParamPackage& params) { buttons_param[button_id] = params; }, -                InputCommon::Polling::DeviceType::Button); -        }); -        connect(button, &QPushButton::customContextMenuRequested, [=](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_mouse_buttons[button_id])}; -                button_map[button_id]->setText(ButtonToText(buttons_param[button_id])); -            }); -            context_menu.exec(button_map[button_id]->mapToGlobal(menu_location)); +        connect(button, &QPushButton::clicked, [=, this] { +            HandleClick(button_map[button_id], +                        [=, this](const Common::ParamPackage& params) { +                            buttons_param[button_id] = 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_mouse_buttons[button_id])}; +                        button_map[button_id]->setText(ButtonToText(buttons_param[button_id])); +                    }); +                    context_menu.exec(button_map[button_id]->mapToGlobal(menu_location)); +                });      }      connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 24b6c5b72..2c20b68d0 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -4,9 +4,11 @@  #include <array>  #include <utility> +#include <QFileDialog>  #include <QDirIterator>  #include "common/common_types.h" +#include "common/file_util.h"  #include "core/settings.h"  #include "ui_configure_ui.h"  #include "yuzu/configuration/configure_ui.h" @@ -52,9 +54,21 @@ ConfigureUi::ConfigureUi(QWidget* parent) : QWidget(parent), ui(new Ui::Configur      // Update text ComboBoxes after user interaction.      connect(ui->row_1_text_combobox, QOverload<int>::of(&QComboBox::activated), -            [=]() { ConfigureUi::UpdateSecondRowComboBox(); }); +            [this] { ConfigureUi::UpdateSecondRowComboBox(); });      connect(ui->row_2_text_combobox, QOverload<int>::of(&QComboBox::activated), -            [=]() { ConfigureUi::UpdateFirstRowComboBox(); }); +            [this] { ConfigureUi::UpdateFirstRowComboBox(); }); + +    // Set screenshot path to user specification. +    connect(ui->screenshot_path_button, &QToolButton::pressed, this, [this] { +        const QString& filename = +            QFileDialog::getExistingDirectory( +                this, tr("Select Screenshots Path..."), +                QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::ScreenshotsDir))) + +            QDir::separator(); +        if (!filename.isEmpty()) { +            ui->screenshot_path_edit->setText(filename); +        } +    });  }  ConfigureUi::~ConfigureUi() = default; @@ -66,6 +80,10 @@ void ConfigureUi::ApplyConfiguration() {      UISettings::values.icon_size = ui->icon_size_combobox->currentData().toUInt();      UISettings::values.row_1_text_id = ui->row_1_text_combobox->currentData().toUInt();      UISettings::values.row_2_text_id = ui->row_2_text_combobox->currentData().toUInt(); + +    UISettings::values.enable_screenshot_save_as = ui->enable_screenshot_save_as->isChecked(); +    FileUtil::GetUserPath(FileUtil::UserPath::ScreenshotsDir, +                          ui->screenshot_path_edit->text().toStdString());      Settings::Apply();  } @@ -80,6 +98,10 @@ void ConfigureUi::SetConfiguration() {      ui->show_add_ons->setChecked(UISettings::values.show_add_ons);      ui->icon_size_combobox->setCurrentIndex(          ui->icon_size_combobox->findData(UISettings::values.icon_size)); + +    ui->enable_screenshot_save_as->setChecked(UISettings::values.enable_screenshot_save_as); +    ui->screenshot_path_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::ScreenshotsDir)));  }  void ConfigureUi::changeEvent(QEvent* event) { diff --git a/src/yuzu/configuration/configure_ui.ui b/src/yuzu/configuration/configure_ui.ui index 0b81747d7..d895b799f 100644 --- a/src/yuzu/configuration/configure_ui.ui +++ b/src/yuzu/configuration/configure_ui.ui @@ -6,8 +6,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>300</width> -    <height>377</height> +    <width>363</width> +    <height>391</height>     </rect>    </property>    <property name="windowTitle"> @@ -128,6 +128,47 @@      </widget>     </item>     <item> +    <widget class="QGroupBox" name="screenshots_GroupBox"> +     <property name="title"> +      <string>Screenshots</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_4"> +      <item> +       <layout class="QVBoxLayout" name="verticalLayout_3"> +        <item> +         <widget class="QCheckBox" name="enable_screenshot_save_as"> +          <property name="text"> +           <string>Ask Where To Save Screenshots (Windows Only)</string> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_4"> +          <item> +           <widget class="QLabel" name="label"> +            <property name="text"> +             <string>Screenshots Path: </string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QLineEdit" name="screenshot_path_edit"/> +          </item> +          <item> +           <widget class="QToolButton" name="screenshot_path_button"> +            <property name="text"> +             <string>...</string> +            </property> +           </widget> +          </item> +         </layout> +        </item> +       </layout> +      </item> +     </layout> +    </widget> +   </item> +   <item>      <spacer name="verticalSpacer">       <property name="orientation">        <enum>Qt::Vertical</enum> | 
