From 96fb00d41192e3c0a86eabf7d2b5d5a6e5fa2cd5 Mon Sep 17 00:00:00 2001 From: Dzmitry Dubrova <dimaxdqwerty@gmail.com> Date: Fri, 9 Aug 2024 17:09:51 +0300 Subject: [PATCH] gui: Implement settings dialog --- CMakeLists.txt | 7 +- src/common/config.cpp | 78 ++++ src/common/config.h | 21 +- src/qt_gui/main_window.cpp | 6 + src/qt_gui/settings_dialog.cpp | 116 ++++++ src/qt_gui/settings_dialog.h | 28 ++ src/qt_gui/settings_dialog.ui | 646 +++++++++++++++++++++++++++++++++ 7 files changed, 900 insertions(+), 2 deletions(-) create mode 100644 src/qt_gui/settings_dialog.cpp create mode 100644 src/qt_gui/settings_dialog.h create mode 100644 src/qt_gui/settings_dialog.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 4df3db2b..b92dd932 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,8 @@ if(ENABLE_QT_GUI) find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent) qt_standard_project_setup() set(CMAKE_AUTORCC ON) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) endif() set(AUDIO_CORE src/audio_core/sdl_audio.cpp @@ -546,10 +548,13 @@ set(QT_GUI src/qt_gui/elf_viewer.h src/qt_gui/main_window_themes.cpp src/qt_gui/main_window_themes.h + src/qt_gui/settings_dialog.cpp + src/qt_gui/settings_dialog.h + src/qt_gui/settings_dialog.ui src/qt_gui/main.cpp ${EMULATOR} ${RESOURCE_FILES} - ) +) endif() if (ENABLE_QT_GUI) diff --git a/src/common/config.cpp b/src/common/config.cpp index f676ab94..c105650b 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -114,6 +114,66 @@ bool vkValidationSyncEnabled() { return vkValidationSync; } +void setScreenWidth(u32 width) { + screenWidth = width; +} + +void setScreenHeight(u32 height) { + screenHeight = height; +} + +void setDebugDump(bool enable) { + isDebugDump = enable; +} + +void setShowSplash(bool enable) { + isShowSplash = enable; +} + +void setNullGpu(bool enable) { + isNullGpu = enable; +} + +void setDumpShaders(bool enable) { + shouldDumpShaders = enable; +} + +void setDumpPM4(bool enable) { + shouldDumpPM4 = enable; +} + +void setVkValidation(bool enable) { + vkValidation = enable; +} + +void setVkSyncValidation(bool enable) { + vkValidationSync = enable; +} + +void setRdocEnabled(bool enable) { + rdocEnable = enable; +} + +void setVblankDiv(u32 value) { + vblankDivider = value; +} + +void setFullscreenMode(bool enable) { + isFullscreen = enable; +} + +void setNeoMode(bool enable) { + isNeo = enable; +} + +void setLogType(std::string type) { + logType = type; +} + +void setLogFilter(std::string type) { + logFilter = type; +} + void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) { main_window_geometry_x = x; main_window_geometry_y = y; @@ -356,4 +416,22 @@ void save(const std::filesystem::path& path) { file << data; file.close(); } + +void setDefaultValues() { + isNeo = false; + isFullscreen = false; + screenWidth = 1280; + screenHeight = 720; + logFilter = ""; + logType = "async"; + isDebugDump = false; + isShowSplash = false; + isNullGpu = false; + shouldDumpShaders = false; + shouldDumpPM4 = false; + vblankDivider = 1; + vkValidation = false; + rdocEnable = false; +} + } // namespace Config diff --git a/src/common/config.h b/src/common/config.h index 53c88ec9..6174b1e1 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -29,6 +29,24 @@ bool dumpPM4(); bool isRdocEnabled(); u32 vblankDiv(); +void setDebugDump(bool enable); +void setShowSplash(bool enable); +void setNullGpu(bool enable); +void setDumpShaders(bool enable); +void setDumpPM4(bool enable); +void setVblankDiv(u32 value); +void setScreenWidth(u32 width); +void setScreenHeight(u32 height); +void setFullscreenMode(bool enable); +void setNeoMode(bool enable); + +void setLogType(std::string type); +void setLogFilter(std::string type); + +void setVkValidation(bool enable); +void setVkSyncValidation(bool enable); +void setRdocEnabled(bool enable); + bool vkValidationEnabled(); bool vkValidationSyncEnabled(); @@ -64,7 +82,8 @@ std::vector<std::string> getPkgViewer(); std::vector<std::string> getElfViewer(); std::vector<std::string> getRecentFiles(); +void setDefaultValues(); + // settings u32 GetLanguage(); - }; // namespace Config diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 646433ee..55bd5640 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -15,6 +15,7 @@ #include "core/loader.h" #include "game_install_dialog.h" #include "main_window.h" +#include "settings_dialog.h" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); @@ -185,6 +186,11 @@ void MainWindow::CreateConnects() { connect(m_game_list_frame.get(), &QTableWidget::cellDoubleClicked, this, &MainWindow::StartGame); + connect(ui->settingsButton, &QPushButton::clicked, this, [this]() { + auto settingsDialog = new SettingsDialog(this); + settingsDialog->exec(); + }); + connect(ui->setIconSizeTinyAct, &QAction::triggered, this, [this]() { if (isTableList) { m_game_list_frame->icon_size = diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp new file mode 100644 index 00000000..88c91ef6 --- /dev/null +++ b/src/qt_gui/settings_dialog.cpp @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "settings_dialog.h" +#include "ui_settings_dialog.h" + +SettingsDialog::SettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::SettingsDialog) { + ui->setupUi(this); + ui->tabWidgetSettings->setUsesScrollButtons(false); + const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); + + ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); + + LoadValuesFromConfig(); + + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); + + connect(ui->buttonBox, &QDialogButtonBox::clicked, this, + [this, config_dir](QAbstractButton* button) { + if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { + Config::save(config_dir / "config.toml"); + QWidget::close(); + } else if (button == ui->buttonBox->button(QDialogButtonBox::Apply)) { + Config::save(config_dir / "config.toml"); + } else if (button == ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)) { + Config::setDefaultValues(); + LoadValuesFromConfig(); + } + }); + + connect(ui->tabWidgetSettings, &QTabWidget::currentChanged, this, [this]() { + ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); + }); + + // GPU TAB + { + // TODO: Implement graphics device changing + + connect(ui->widthSpinBox, &QSpinBox::valueChanged, this, + [](int val) { Config::setScreenWidth(val); }); + + connect(ui->heightSpinBox, &QSpinBox::valueChanged, this, + [](int val) { Config::setScreenHeight(val); }); + + connect(ui->vblankSpinBox, &QSpinBox::valueChanged, this, + [](int val) { Config::setVblankDiv(val); }); + + connect(ui->dumpShadersCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setDumpShaders(val); }); + + connect(ui->nullGpuCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setNullGpu(val); }); + + connect(ui->dumpPM4CheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setDumpPM4(val); }); + } + + // GENERAL TAB + { + connect(ui->fullscreenCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setFullscreenMode(val); }); + + connect(ui->showSplashCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setShowSplash(val); }); + + connect(ui->ps4proCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setNeoMode(val); }); + + connect(ui->logTypeComboBox, &QComboBox::currentTextChanged, this, + [](const QString& text) { Config::setLogType(text.toStdString()); }); + + connect(ui->logFilterLineEdit, &QLineEdit::textChanged, this, + [](const QString& text) { Config::setLogFilter(text.toStdString()); }); + } + + // DEBUG TAB + { + connect(ui->debugDump, &QCheckBox::stateChanged, this, + [](int val) { Config::setDebugDump(val); }); + + connect(ui->vkValidationCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setVkValidation(val); }); + + connect(ui->vkSyncValidationCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setVkSyncValidation(val); }); + + connect(ui->rdocCheckBox, &QCheckBox::stateChanged, this, + [](int val) { Config::setRdocEnabled(val); }); + } +} + +void SettingsDialog::LoadValuesFromConfig() { + ui->widthSpinBox->setValue(Config::getScreenWidth()); + ui->heightSpinBox->setValue(Config::getScreenHeight()); + ui->vblankSpinBox->setValue(Config::vblankDiv()); + ui->dumpShadersCheckBox->setChecked(Config::dumpShaders()); + ui->nullGpuCheckBox->setChecked(Config::nullGpu()); + ui->dumpPM4CheckBox->setChecked(Config::dumpPM4()); + + ui->fullscreenCheckBox->setChecked(Config::isFullscreenMode()); + ui->showSplashCheckBox->setChecked(Config::showSplash()); + ui->ps4proCheckBox->setChecked(Config::isNeoMode()); + ui->logTypeComboBox->setCurrentText(QString::fromStdString(Config::getLogType())); + ui->logFilterLineEdit->setText(QString::fromStdString(Config::getLogFilter())); + + ui->debugDump->setChecked(Config::debugDump()); + ui->vkValidationCheckBox->setChecked(Config::vkValidationEnabled()); + ui->vkSyncValidationCheckBox->setChecked(Config::vkValidationSyncEnabled()); + ui->rdocCheckBox->setChecked(Config::isRdocEnabled()); +} + +int SettingsDialog::exec() { + return QDialog::exec(); +} + +SettingsDialog::~SettingsDialog() {} \ No newline at end of file diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h new file mode 100644 index 00000000..2bffa795 --- /dev/null +++ b/src/qt_gui/settings_dialog.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <QDialog> +#include <QPushButton> + +#include "common/config.h" +#include "common/path_util.h" + +namespace Ui { +class SettingsDialog; +} + +class SettingsDialog : public QDialog { + Q_OBJECT +public: + explicit SettingsDialog(QWidget* parent = nullptr); + ~SettingsDialog(); + + int exec() override; + +private: + void LoadValuesFromConfig(); + + std::unique_ptr<Ui::SettingsDialog> ui; +}; diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui new file mode 100644 index 00000000..507980eb --- /dev/null +++ b/src/qt_gui/settings_dialog.ui @@ -0,0 +1,646 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SettingsDialog</class> + <widget class="QDialog" name="SettingsDialog"> + <property name="windowModality"> + <enum>Qt::WindowModality::WindowModal</enum> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1024</width> + <height>768</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Settings</string> + </property> + <property name="windowIcon"> + <iconset> + <normaloff>:/images/shadps4.ico</normaloff>:/images/shadps4.ico</iconset> + </property> + <layout class="QVBoxLayout" name="settingsDialogLayout"> + <item> + <widget class="QScrollArea" name="scrollArea"> + <property name="frameShape"> + <enum>QFrame::Shape::NoFrame</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QTabWidget" name="tabWidgetSettings"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1006</width> + <height>720</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="currentIndex"> + <number>1</number> + </property> + <widget class="QWidget" name="gpuTab"> + <attribute name="title"> + <string>GPU</string> + </attribute> + <layout class="QVBoxLayout" name="gpuTabLayout" stretch="0,0"> + <item> + <layout class="QHBoxLayout" name="gpuTabLayout" stretch="1,1,1"> + <item> + <layout class="QVBoxLayout" name="gpuTabLayoutLeft"> + <item> + <widget class="QGroupBox" name="graphicsAdapterGroupBox"> + <property name="title"> + <string>Graphics Device</string> + </property> + <layout class="QVBoxLayout" name="graphicsAdapterLayout"> + <item> + <widget class="QComboBox" name="graphicsAdapterBox"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="widgetGpuTop" native="true"> + <layout class="QHBoxLayout" name="widgetGpuTopLayout"> + <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> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="widgetGpuBottom" native="true"> + <layout class="QHBoxLayout" name="widgetGpuBottomLayout"> + <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> + </layout> + </widget> + </item> + <item> + <spacer name="gpu_tab_layout_right_spacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="gpuTabLayoutMiddle"> + <item> + <layout class="QVBoxLayout" name="layoutResolution"> + <property name="spacing"> + <number>6</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="resolutionLayout"> + <item> + <widget class="QGroupBox" name="widthGroupBox"> + <property name="title"> + <string>Width</string> + </property> + <layout class="QVBoxLayout" name="widthLayout"> + <item> + <widget class="QSpinBox" name="widthSpinBox"> + <property name="accelerated"> + <bool>true</bool> + </property> + <property name="correctionMode"> + <enum>QAbstractSpinBox::CorrectionMode::CorrectToNearestValue</enum> + </property> + <property name="keyboardTracking"> + <bool>false</bool> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>9999</number> + </property> + <property name="value"> + <number>1280</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="heightGroupBox"> + <property name="title"> + <string>Height</string> + </property> + <layout class="QVBoxLayout" name="heightLayout"> + <item> + <widget class="QSpinBox" name="heightSpinBox"> + <property name="frame"> + <bool>true</bool> + </property> + <property name="accelerated"> + <bool>true</bool> + </property> + <property name="correctionMode"> + <enum>QAbstractSpinBox::CorrectionMode::CorrectToNearestValue</enum> + </property> + <property name="keyboardTracking"> + <bool>false</bool> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>9999</number> + </property> + <property name="value"> + <number>720</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="vLayoutVblank"> + <property name="spacing"> + <number>6</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="hLayoutVblank"> + <item> + <widget class="QGroupBox" name="heightDivider"> + <property name="title"> + <string>Vblank Divider</string> + </property> + <layout class="QVBoxLayout" name="vblankLayout"> + <item> + <widget class="QSpinBox" name="vblankSpinBox"> + <property name="frame"> + <bool>true</bool> + </property> + <property name="accelerated"> + <bool>true</bool> + </property> + <property name="correctionMode"> + <enum>QAbstractSpinBox::CorrectionMode::CorrectToNearestValue</enum> + </property> + <property name="keyboardTracking"> + <bool>false</bool> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>9999</number> + </property> + <property name="value"> + <number>1</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer name="gpuTabLayoutMiddleSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="gpuTabLayoutRight"> + <property name="rightMargin"> + <number>12</number> + </property> + <property name="bottomMargin"> + <number>12</number> + </property> + <item> + <widget class="QGroupBox" name="additionalSettingsGroupBox"> + <property name="title"> + <string>Additional Settings</string> + </property> + <property name="alignment"> + <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set> + </property> + <layout class="QVBoxLayout" name="additionalSettingsVLayout"> + <item> + <widget class="QCheckBox" name="dumpShadersCheckBox"> + <property name="text"> + <string>Enable Shaders Dumping</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="nullGpuCheckBox"> + <property name="text"> + <string>Enable NULL GPU</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="dumpPM4CheckBox"> + <property name="text"> + <string>Enable PM4 Dumping</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="additionalSettingsSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer name="gpuTabSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="generalTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="generalTabVLayout" stretch="0,1"> + <item> + <layout class="QHBoxLayout" name="generalTabHLayout" stretch="1,1,1"> + <item> + <layout class="QVBoxLayout" name="generalTabLayoutLeft"> + <item> + <widget class="QGroupBox" name="emuSettings"> + <property name="title"> + <string>Emulator Settings</string> + </property> + <layout class="QVBoxLayout" name="emuSettingsLayout"> + <item> + <widget class="QCheckBox" name="fullscreenCheckBox"> + <property name="text"> + <string>Enable Fullscreen</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="showSplashCheckBox"> + <property name="text"> + <string>Show Splash</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="ps4proCheckBox"> + <property name="text"> + <string>Is PS4 Pro</string> + </property> + </widget> + </item> + <item> + <spacer name="emulatorTabSpacerLeft"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="emulatorTabLayoutMiddle"> + <item> + <widget class="QGroupBox" name="loggerGroupBox"> + <property name="title"> + <string>Logger Settings</string> + </property> + <layout class="QVBoxLayout" name="loggerLayout"> + <item> + <widget class="QWidget" name="LogTypeWidget" native="true"> + <layout class="QVBoxLayout" name="LogTypeLayout"> + <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="logTypeGroupBox"> + <property name="title"> + <string>Log Type</string> + </property> + <layout class="QVBoxLayout" name="logTypeBoxLayout"> + <item> + <widget class="QComboBox" name="logTypeComboBox"> + <item> + <property name="text"> + <string>async</string> + </property> + </item> + <item> + <property name="text"> + <string>sync</string> + </property> + </item> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="vLayoutLogFilter"> + <property name="spacing"> + <number>6</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="hLayoutLogFilter"> + <item> + <widget class="QGroupBox" name="logFilter"> + <property name="title"> + <string>Log Filter</string> + </property> + <layout class="QVBoxLayout" name="logFilterLayout"> + <item> + <widget class="QLineEdit" name="logFilterLineEdit"/> + </item> + </layout> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="generalTabLayoutRight"> + <item> + <widget class="QGroupBox" name="additionalSettings"> + <property name="title"> + <string>Additional Settings</string> + </property> + <layout class="QVBoxLayout" name="additionalSettingsVLayout"> + <item> + <spacer name="emulatorTabSpacerRight"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer name="emulatorTabSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="debugTab"> + <attribute name="title"> + <string>Debug</string> + </attribute> + <layout class="QVBoxLayout" name="debugTabVLayout" stretch="0,1"> + <item> + <layout class="QHBoxLayout" name="debugTabHLayout" stretch="1"> + <item> + <widget class="QGroupBox" name="debugTabGroupBox"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="title"> + <string>General</string> + </property> + <property name="alignment"> + <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set> + </property> + <layout class="QVBoxLayout" name="debugTabLayout"> + <item alignment="Qt::AlignmentFlag::AlignTop"> + <widget class="QCheckBox" name="debugDump"> + <property name="text"> + <string>Enable Debug Dumping</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="vkValidationCheckBox"> + <property name="text"> + <string>Enable Vulkan Validation Layers</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="vkSyncValidationCheckBox"> + <property name="text"> + <string>Enable Vulkan Synchronization Validation</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="rdocCheckBox"> + <property name="text"> + <string>Enable RenderDoc Debugging</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="debugTabSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Policy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui>