diff options
Diffstat (limited to 'src/yuzu/configuration')
21 files changed, 742 insertions, 273 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 1b2b1b2bb..59a193edd 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -505,22 +505,6 @@ void Config::ReadDataStorageValues() {          ReadSetting(QStringLiteral("gamecard_current_game"), false).toBool();      Settings::values.gamecard_path =          ReadSetting(QStringLiteral("gamecard_path"), QStringLiteral("")).toString().toStdString(); -    Settings::values.nand_total_size = static_cast<Settings::NANDTotalSize>( -        ReadSetting(QStringLiteral("nand_total_size"), -                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDTotalSize::S29_1GB))) -            .toULongLong()); -    Settings::values.nand_user_size = static_cast<Settings::NANDUserSize>( -        ReadSetting(QStringLiteral("nand_user_size"), -                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDUserSize::S26GB))) -            .toULongLong()); -    Settings::values.nand_system_size = static_cast<Settings::NANDSystemSize>( -        ReadSetting(QStringLiteral("nand_system_size"), -                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDSystemSize::S2_5GB))) -            .toULongLong()); -    Settings::values.sdmc_size = static_cast<Settings::SDMCSize>( -        ReadSetting(QStringLiteral("sdmc_size"), -                    QVariant::fromValue<u64>(static_cast<u64>(Settings::SDMCSize::S16GB))) -            .toULongLong());      qt_config->endGroup();  } @@ -540,8 +524,6 @@ void Config::ReadDebuggingValues() {      Settings::values.reporting_services =          ReadSetting(QStringLiteral("reporting_services"), false).toBool();      Settings::values.quest_flag = ReadSetting(QStringLiteral("quest_flag"), false).toBool(); -    Settings::values.disable_cpu_opt = -        ReadSetting(QStringLiteral("disable_cpu_opt"), false).toBool();      Settings::values.disable_macro_jit =          ReadSetting(QStringLiteral("disable_macro_jit"), false).toBool(); @@ -629,6 +611,35 @@ void Config::ReadPathValues() {          }      }      UISettings::values.recent_files = ReadSetting(QStringLiteral("recentFiles")).toStringList(); +    UISettings::values.language = ReadSetting(QStringLiteral("language"), QString{}).toString(); + +    qt_config->endGroup(); +} + +void Config::ReadCpuValues() { +    qt_config->beginGroup(QStringLiteral("Cpu")); + +    if (global) { +        Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>( +            ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt()); + +        Settings::values.cpuopt_page_tables = +            ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); +        Settings::values.cpuopt_block_linking = +            ReadSetting(QStringLiteral("cpuopt_block_linking"), true).toBool(); +        Settings::values.cpuopt_return_stack_buffer = +            ReadSetting(QStringLiteral("cpuopt_return_stack_buffer"), true).toBool(); +        Settings::values.cpuopt_fast_dispatcher = +            ReadSetting(QStringLiteral("cpuopt_fast_dispatcher"), true).toBool(); +        Settings::values.cpuopt_context_elimination = +            ReadSetting(QStringLiteral("cpuopt_context_elimination"), true).toBool(); +        Settings::values.cpuopt_const_prop = +            ReadSetting(QStringLiteral("cpuopt_const_prop"), true).toBool(); +        Settings::values.cpuopt_misc_ir = +            ReadSetting(QStringLiteral("cpuopt_misc_ir"), true).toBool(); +        Settings::values.cpuopt_reduce_misalign_checks = +            ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool(); +    }      qt_config->endGroup();  } @@ -651,6 +662,8 @@ void Config::ReadRendererValues() {      ReadSettingGlobal(Settings::values.use_vsync, QStringLiteral("use_vsync"), true);      ReadSettingGlobal(Settings::values.use_assembly_shaders, QStringLiteral("use_assembly_shaders"),                        false); +    ReadSettingGlobal(Settings::values.use_asynchronous_shaders, +                      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); @@ -829,6 +842,7 @@ void Config::ReadValues() {          ReadMiscellaneousValues();      }      ReadCoreValues(); +    ReadCpuValues();      ReadRendererValues();      ReadAudioValues();      ReadSystemValues(); @@ -929,6 +943,7 @@ void Config::SaveValues() {          SaveMiscellaneousValues();      }      SaveCoreValues(); +    SaveCpuValues();      SaveRendererValues();      SaveAudioValues();      SaveSystemValues(); @@ -1006,18 +1021,7 @@ void Config::SaveDataStorageValues() {                   false);      WriteSetting(QStringLiteral("gamecard_path"),                   QString::fromStdString(Settings::values.gamecard_path), QStringLiteral("")); -    WriteSetting(QStringLiteral("nand_total_size"), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_total_size)), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDTotalSize::S29_1GB))); -    WriteSetting(QStringLiteral("nand_user_size"), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_user_size)), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDUserSize::S26GB))); -    WriteSetting(QStringLiteral("nand_system_size"), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_system_size)), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDSystemSize::S2_5GB))); -    WriteSetting(QStringLiteral("sdmc_size"), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.sdmc_size)), -                 QVariant::fromValue<u64>(static_cast<u64>(Settings::SDMCSize::S16GB))); +      qt_config->endGroup();  } @@ -1033,7 +1037,6 @@ void Config::SaveDebuggingValues() {      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); -    WriteSetting(QStringLiteral("disable_cpu_opt"), Settings::values.disable_cpu_opt, false);      WriteSetting(QStringLiteral("disable_macro_jit"), Settings::values.disable_macro_jit, false);      qt_config->endGroup(); @@ -1093,6 +1096,33 @@ void Config::SavePathValues() {      }      qt_config->endArray();      WriteSetting(QStringLiteral("recentFiles"), UISettings::values.recent_files); +    WriteSetting(QStringLiteral("language"), UISettings::values.language, QString{}); + +    qt_config->endGroup(); +} + +void Config::SaveCpuValues() { +    qt_config->beginGroup(QStringLiteral("Cpu")); + +    if (global) { +        WriteSetting(QStringLiteral("cpu_accuracy"), +                     static_cast<int>(Settings::values.cpu_accuracy), 0); + +        WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, +                     true); +        WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking, +                     true); +        WriteSetting(QStringLiteral("cpuopt_return_stack_buffer"), +                     Settings::values.cpuopt_return_stack_buffer, true); +        WriteSetting(QStringLiteral("cpuopt_fast_dispatcher"), +                     Settings::values.cpuopt_fast_dispatcher, true); +        WriteSetting(QStringLiteral("cpuopt_context_elimination"), +                     Settings::values.cpuopt_context_elimination, true); +        WriteSetting(QStringLiteral("cpuopt_const_prop"), Settings::values.cpuopt_const_prop, true); +        WriteSetting(QStringLiteral("cpuopt_misc_ir"), Settings::values.cpuopt_misc_ir, true); +        WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), +                     Settings::values.cpuopt_reduce_misalign_checks, true); +    }      qt_config->endGroup();  } @@ -1119,6 +1149,8 @@ void Config::SaveRendererValues() {      WriteSettingGlobal(QStringLiteral("use_vsync"), Settings::values.use_vsync, true);      WriteSettingGlobal(QStringLiteral("use_assembly_shaders"),                         Settings::values.use_assembly_shaders, false); +    WriteSettingGlobal(QStringLiteral("use_asynchronous_shaders"), +                       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, @@ -1342,11 +1374,13 @@ void Config::WriteSettingGlobal(const QString& name, const QVariant& value, bool  void Config::Reload() {      ReadValues(); +    Settings::Sanitize();      // To apply default value changes      SaveValues();      Settings::Apply();  }  void Config::Save() { +    Settings::Sanitize();      SaveValues();  } diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 681f0bca5..8e815f829 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -49,6 +49,7 @@ private:      void ReadDisabledAddOnValues();      void ReadMiscellaneousValues();      void ReadPathValues(); +    void ReadCpuValues();      void ReadRendererValues();      void ReadShortcutValues();      void ReadSystemValues(); @@ -73,6 +74,7 @@ private:      void SaveDisabledAddOnValues();      void SaveMiscellaneousValues();      void SavePathValues(); +    void SaveCpuValues();      void SaveRendererValues();      void SaveShortcutValues();      void SaveSystemValues(); diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 9aec1bd09..5f5d8e571 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -78,6 +78,16 @@           <string>Hotkeys</string>          </attribute>         </widget> +       <widget class="ConfigureCpu" name="cpuTab"> +        <attribute name="title"> +         <string>CPU</string> +        </attribute> +       </widget> +       <widget class="ConfigureCpuDebug" name="cpuDebugTab"> +        <attribute name="title"> +         <string>Debug</string> +        </attribute> +       </widget>         <widget class="ConfigureGraphics" name="graphicsTab">          <attribute name="title">           <string>Graphics</string> @@ -159,6 +169,18 @@     <container>1</container>    </customwidget>    <customwidget> +   <class>ConfigureCpu</class> +   <extends>QWidget</extends> +   <header>configuration/configure_cpu.h</header> +   <container>1</container> +  </customwidget> +  <customwidget> +   <class>ConfigureCpuDebug</class> +   <extends>QWidget</extends> +   <header>configuration/configure_cpu_debug.h</header> +   <container>1</container> +  </customwidget> +  <customwidget>     <class>ConfigureGraphics</class>     <extends>QWidget</extends>     <header>configuration/configure_graphics.h</header> diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp new file mode 100644 index 000000000..7493e5ffb --- /dev/null +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -0,0 +1,61 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QComboBox> +#include <QMessageBox> + +#include "common/common_types.h" +#include "common/logging/log.h" +#include "core/core.h" +#include "core/settings.h" +#include "ui_configure_cpu.h" +#include "yuzu/configuration/configure_cpu.h" + +ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureCpu) { +    ui->setupUi(this); + +    SetConfiguration(); + +    connect(ui->accuracy, qOverload<int>(&QComboBox::activated), this, +            &ConfigureCpu::AccuracyUpdated); +} + +ConfigureCpu::~ConfigureCpu() = default; + +void ConfigureCpu::SetConfiguration() { +    const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + +    ui->accuracy->setEnabled(runtime_lock); +    ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy)); +} + +void ConfigureCpu::AccuracyUpdated(int index) { +    if (static_cast<Settings::CPUAccuracy>(index) == Settings::CPUAccuracy::DebugMode) { +        const auto result = QMessageBox::warning(this, tr("Setting CPU to Debug Mode"), +                                                 tr("CPU Debug Mode is only intended for developer " +                                                    "use. Are you sure you want to enable this?"), +                                                 QMessageBox::Yes | QMessageBox::No); +        if (result == QMessageBox::No) { +            ui->accuracy->setCurrentIndex(static_cast<int>(Settings::CPUAccuracy::Accurate)); +            return; +        } +    } +} + +void ConfigureCpu::ApplyConfiguration() { +    Settings::values.cpu_accuracy = +        static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); +} + +void ConfigureCpu::changeEvent(QEvent* event) { +    if (event->type() == QEvent::LanguageChange) { +        RetranslateUI(); +    } + +    QWidget::changeEvent(event); +} + +void ConfigureCpu::RetranslateUI() { +    ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h new file mode 100644 index 000000000..e4741d3a4 --- /dev/null +++ b/src/yuzu/configuration/configure_cpu.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 <QWidget> +#include "core/settings.h" + +namespace Ui { +class ConfigureCpu; +} + +class ConfigureCpu : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureCpu(QWidget* parent = nullptr); +    ~ConfigureCpu() override; + +    void ApplyConfiguration(); + +private: +    void changeEvent(QEvent* event) override; +    void RetranslateUI(); + +    void AccuracyUpdated(int index); + +    void SetConfiguration(); + +    std::unique_ptr<Ui::ConfigureCpu> ui; +}; diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui new file mode 100644 index 000000000..bf6ea79bb --- /dev/null +++ b/src/yuzu/configuration/configure_cpu.ui @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureCpu</class> + <widget class="QWidget" name="ConfigureCpu"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>400</width> +    <height>321</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Form</string> +  </property> +  <layout class="QVBoxLayout"> +   <item> +    <layout class="QVBoxLayout"> +     <item> +      <widget class="QGroupBox"> +       <property name="title"> +        <string>General</string> +       </property> +       <layout class="QVBoxLayout"> +        <item> +         <layout class="QHBoxLayout"> +          <item> +           <widget class="QLabel"> +            <property name="text"> +             <string>Accuracy:</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QComboBox" name="accuracy"> +            <item> +             <property name="text"> +              <string>Accurate</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Enable Debug Mode</string> +             </property> +            </item> +           </widget> +          </item> +         </layout> +        </item> +        <item> +         <widget class="QLabel"> +          <property name="wordWrap"> +            <bool>1</bool> +          </property> +          <property name="text"> +           <string>We recommend setting accuracy to "Accurate".</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> +   <item> +    <widget class="QLabel" name="label_disable_info"> +     <property name="text"> +      <string>CPU settings are available only when game is not running.</string> +     </property> +     <property name="wordWrap"> +      <bool>true</bool> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/yuzu/configuration/configure_cpu_debug.cpp b/src/yuzu/configuration/configure_cpu_debug.cpp new file mode 100644 index 000000000..3385b2cf6 --- /dev/null +++ b/src/yuzu/configuration/configure_cpu_debug.cpp @@ -0,0 +1,65 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QComboBox> + +#include "common/common_types.h" +#include "common/logging/log.h" +#include "core/core.h" +#include "core/settings.h" +#include "ui_configure_cpu_debug.h" +#include "yuzu/configuration/configure_cpu_debug.h" + +ConfigureCpuDebug::ConfigureCpuDebug(QWidget* parent) +    : QWidget(parent), ui(new Ui::ConfigureCpuDebug) { +    ui->setupUi(this); + +    SetConfiguration(); +} + +ConfigureCpuDebug::~ConfigureCpuDebug() = default; + +void ConfigureCpuDebug::SetConfiguration() { +    const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + +    ui->cpuopt_page_tables->setEnabled(runtime_lock); +    ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables); +    ui->cpuopt_block_linking->setEnabled(runtime_lock); +    ui->cpuopt_block_linking->setChecked(Settings::values.cpuopt_block_linking); +    ui->cpuopt_return_stack_buffer->setEnabled(runtime_lock); +    ui->cpuopt_return_stack_buffer->setChecked(Settings::values.cpuopt_return_stack_buffer); +    ui->cpuopt_fast_dispatcher->setEnabled(runtime_lock); +    ui->cpuopt_fast_dispatcher->setChecked(Settings::values.cpuopt_fast_dispatcher); +    ui->cpuopt_context_elimination->setEnabled(runtime_lock); +    ui->cpuopt_context_elimination->setChecked(Settings::values.cpuopt_context_elimination); +    ui->cpuopt_const_prop->setEnabled(runtime_lock); +    ui->cpuopt_const_prop->setChecked(Settings::values.cpuopt_const_prop); +    ui->cpuopt_misc_ir->setEnabled(runtime_lock); +    ui->cpuopt_misc_ir->setChecked(Settings::values.cpuopt_misc_ir); +    ui->cpuopt_reduce_misalign_checks->setEnabled(runtime_lock); +    ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks); +} + +void ConfigureCpuDebug::ApplyConfiguration() { +    Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked(); +    Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked(); +    Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked(); +    Settings::values.cpuopt_fast_dispatcher = ui->cpuopt_fast_dispatcher->isChecked(); +    Settings::values.cpuopt_context_elimination = ui->cpuopt_context_elimination->isChecked(); +    Settings::values.cpuopt_const_prop = ui->cpuopt_const_prop->isChecked(); +    Settings::values.cpuopt_misc_ir = ui->cpuopt_misc_ir->isChecked(); +    Settings::values.cpuopt_reduce_misalign_checks = ui->cpuopt_reduce_misalign_checks->isChecked(); +} + +void ConfigureCpuDebug::changeEvent(QEvent* event) { +    if (event->type() == QEvent::LanguageChange) { +        RetranslateUI(); +    } + +    QWidget::changeEvent(event); +} + +void ConfigureCpuDebug::RetranslateUI() { +    ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_cpu_debug.h b/src/yuzu/configuration/configure_cpu_debug.h new file mode 100644 index 000000000..c9941ef3b --- /dev/null +++ b/src/yuzu/configuration/configure_cpu_debug.h @@ -0,0 +1,31 @@ +// 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> +#include "core/settings.h" + +namespace Ui { +class ConfigureCpuDebug; +} + +class ConfigureCpuDebug : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureCpuDebug(QWidget* parent = nullptr); +    ~ConfigureCpuDebug() override; + +    void ApplyConfiguration(); + +private: +    void changeEvent(QEvent* event) override; +    void RetranslateUI(); + +    void SetConfiguration(); + +    std::unique_ptr<Ui::ConfigureCpuDebug> ui; +}; diff --git a/src/yuzu/configuration/configure_cpu_debug.ui b/src/yuzu/configuration/configure_cpu_debug.ui new file mode 100644 index 000000000..a90dc64fe --- /dev/null +++ b/src/yuzu/configuration/configure_cpu_debug.ui @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureCpuDebug</class> + <widget class="QWidget" name="ConfigureCpuDebug"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>400</width> +    <height>321</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Form</string> +  </property> +  <layout class="QVBoxLayout"> +   <item> +    <layout class="QVBoxLayout"> +     <item> +      <widget class="QGroupBox"> +       <property name="title"> +        <string>Toggle CPU Optimizations</string> +       </property> +       <layout class="QVBoxLayout"> +        <item> +         <widget class="QLabel"> +          <property name="wordWrap"> +            <bool>1</bool> +          </property> +          <property name="text"> +           <string> +            <div> +            <b>For debugging only.</b> +            <br> +            If you're not sure what these do, keep all of these enabled. +            <br> +            These settings only take effect when CPU Accuracy is "Debug Mode". +            </div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_page_tables"> +          <property name="text"> +           <string>Enable inline page tables</string> +          </property> +          <property name="toolTip"> +           <string> +            <div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div> +            <div style="white-space: nowrap">Enabling it inlines accesses to PageTable::pointers into emitted code.</div> +            <div style="white-space: nowrap">Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_block_linking"> +          <property name="text"> +           <string>Enable block linking</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_return_stack_buffer"> +          <property name="text"> +           <string>Enable return stack buffer</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>This optimization avoids dispatcher lookups by keeping track potential return addresses of BL instructions. This approximates what happens with a return stack buffer on a real CPU.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_fast_dispatcher"> +          <property name="text"> +           <string>Enable fast dispatcher</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>Enable a two-tiered dispatch system. A faster dispatcher written in assembly has a small MRU cache of jump destinations is used first. If that fails, dispatch falls back to the slower C++ dispatcher.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_context_elimination"> +          <property name="text"> +           <string>Enable context elimination</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_const_prop"> +          <property name="text"> +           <string>Enable constant propagation</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>Enables IR optimizations that involve constant propagation.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_misc_ir"> +          <property name="text"> +           <string>Enable miscellaneous optimizations</string> +          </property> +          <property name="toolTip"> +           <string> +            <div>Enables miscellaneous IR optimizations.</div> +           </string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QCheckBox" name="cpuopt_reduce_misalign_checks"> +          <property name="text"> +           <string>Enable misalignment check reduction</string> +          </property> +          <property name="toolTip"> +           <string> +            <div style="white-space: nowrap">When enabled, a misalignment is only triggered when an access crosses a page boundary.</div> +            <div style="white-space: nowrap">When disabled, a misalignment is triggered on all misaligned accesses.</div> +           </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> +   <item> +    <widget class="QLabel" name="label_disable_info"> +     <property name="text"> +      <string>CPU settings are available only when game is not running.</string> +     </property> +     <property name="wordWrap"> +      <bool>true</bool> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 2c77441fd..d0e71dd60 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -36,7 +36,6 @@ 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->disable_cpu_opt->setChecked(Settings::values.disable_cpu_opt);      ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn());      ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug);      ui->disable_macro_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn()); @@ -51,7 +50,6 @@ 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.disable_cpu_opt = ui->disable_cpu_opt->isChecked();      Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();      Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();      Debugger::ToggleConsole(); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 46f0208c6..272bdd6b8 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -228,13 +228,6 @@          </property>         </widget>        </item> -      <item> -       <widget class="QCheckBox" name="disable_cpu_opt"> -        <property name="text"> -         <string>Disable CPU JIT optimizations</string> -        </property> -       </widget> -      </item>       </layout>      </widget>     </item> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 5918e9972..4e30dc51e 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -23,6 +23,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry)      SetConfiguration();      PopulateSelectionList(); +    connect(ui->uiTab, &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged);      connect(ui->selectorList, &QListWidget::itemSelectionChanged, this,              &ConfigureDialog::UpdateVisibleTabs); @@ -42,6 +43,8 @@ void ConfigureDialog::ApplyConfiguration() {      ui->filesystemTab->applyConfiguration();      ui->inputTab->ApplyConfiguration();      ui->hotkeysTab->ApplyConfiguration(registry); +    ui->cpuTab->ApplyConfiguration(); +    ui->cpuDebugTab->ApplyConfiguration();      ui->graphicsTab->ApplyConfiguration();      ui->graphicsAdvancedTab->ApplyConfiguration();      ui->audioTab->ApplyConfiguration(); @@ -76,9 +79,10 @@ void ConfigureDialog::RetranslateUI() {  Q_DECLARE_METATYPE(QList<QWidget*>);  void ConfigureDialog::PopulateSelectionList() { -    const std::array<std::pair<QString, QList<QWidget*>>, 5> items{ +    const std::array<std::pair<QString, QList<QWidget*>>, 6> items{          {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}},           {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}}}, @@ -95,6 +99,14 @@ void ConfigureDialog::PopulateSelectionList() {      }  } +void ConfigureDialog::OnLanguageChanged(const QString& locale) { +    emit LanguageChanged(locale); +    // first apply the configuration, and then restore the display +    ApplyConfiguration(); +    RetranslateUI(); +    SetConfiguration(); +} +  void ConfigureDialog::UpdateVisibleTabs() {      const auto items = ui->selectorList->selectedItems();      if (items.isEmpty()) { @@ -107,6 +119,8 @@ void ConfigureDialog::UpdateVisibleTabs() {          {ui->profileManagerTab, tr("Profiles")},          {ui->inputTab, tr("Input")},          {ui->hotkeysTab, tr("Hotkeys")}, +        {ui->cpuTab, tr("CPU")}, +        {ui->cpuDebugTab, tr("Debug")},          {ui->graphicsTab, tr("Graphics")},          {ui->graphicsAdvancedTab, tr("Advanced")},          {ui->audioTab, tr("Audio")}, diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 2d3bfc2da..4289bc225 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -22,6 +22,12 @@ public:      void ApplyConfiguration(); +private slots: +    void OnLanguageChanged(const QString& locale); + +signals: +    void LanguageChanged(const QString& locale); +  private:      void changeEvent(QEvent* event) override; diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp index 835ee821c..a089f5733 100644 --- a/src/yuzu/configuration/configure_filesystem.cpp +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -11,19 +11,6 @@  #include "yuzu/configuration/configure_filesystem.h"  #include "yuzu/uisettings.h" -namespace { - -template <typename T> -void SetComboBoxFromData(QComboBox* combo_box, T data) { -    const auto index = combo_box->findData(QVariant::fromValue(static_cast<u64>(data))); -    if (index >= combo_box->count() || index < 0) -        return; - -    combo_box->setCurrentIndex(index); -} - -} // Anonymous namespace -  ConfigureFilesystem::ConfigureFilesystem(QWidget* parent)      : QWidget(parent), ui(std::make_unique<Ui::ConfigureFilesystem>()) {      ui->setupUi(this); @@ -73,11 +60,6 @@ void ConfigureFilesystem::setConfiguration() {      ui->cache_game_list->setChecked(UISettings::values.cache_game_list); -    SetComboBoxFromData(ui->nand_size, Settings::values.nand_total_size); -    SetComboBoxFromData(ui->usrnand_size, Settings::values.nand_user_size); -    SetComboBoxFromData(ui->sysnand_size, Settings::values.nand_system_size); -    SetComboBoxFromData(ui->sdmc_size, Settings::values.sdmc_size); -      UpdateEnabledControls();  } @@ -98,15 +80,6 @@ void ConfigureFilesystem::applyConfiguration() {      Settings::values.dump_nso = ui->dump_nso->isChecked();      UISettings::values.cache_game_list = ui->cache_game_list->isChecked(); - -    Settings::values.nand_total_size = static_cast<Settings::NANDTotalSize>( -        ui->nand_size->itemData(ui->nand_size->currentIndex()).toULongLong()); -    Settings::values.nand_system_size = static_cast<Settings::NANDSystemSize>( -        ui->nand_size->itemData(ui->sysnand_size->currentIndex()).toULongLong()); -    Settings::values.nand_user_size = static_cast<Settings::NANDUserSize>( -        ui->nand_size->itemData(ui->usrnand_size->currentIndex()).toULongLong()); -    Settings::values.sdmc_size = static_cast<Settings::SDMCSize>( -        ui->nand_size->itemData(ui->sdmc_size->currentIndex()).toULongLong());  }  void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit) { diff --git a/src/yuzu/configuration/configure_filesystem.ui b/src/yuzu/configuration/configure_filesystem.ui index 58cd07f52..84bea0600 100644 --- a/src/yuzu/configuration/configure_filesystem.ui +++ b/src/yuzu/configuration/configure_filesystem.ui @@ -116,127 +116,6 @@        </widget>       </item>       <item> -      <widget class="QGroupBox" name="groupBox_3"> -       <property name="title"> -        <string>Storage Sizes</string> -       </property> -       <layout class="QGridLayout" name="gridLayout_3"> -        <item row="3" column="0"> -         <widget class="QLabel" name="label_5"> -          <property name="text"> -           <string>SD Card</string> -          </property> -         </widget> -        </item> -        <item row="1" column="0"> -         <widget class="QLabel" name="label_4"> -          <property name="text"> -           <string>System NAND</string> -          </property> -         </widget> -        </item> -        <item row="1" column="1"> -         <widget class="QComboBox" name="sysnand_size"> -          <item> -           <property name="text"> -            <string>2.5 GB</string> -           </property> -          </item> -         </widget> -        </item> -        <item row="3" column="1"> -         <widget class="QComboBox" name="sdmc_size"> -          <property name="currentText"> -           <string>32 GB</string> -          </property> -          <item> -           <property name="text"> -            <string>1 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>2 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>4 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>8 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>16 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>32 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>64 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>128 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>256 GB</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>1 TB</string> -           </property> -          </item> -         </widget> -        </item> -        <item row="2" column="1"> -         <widget class="QComboBox" name="usrnand_size"> -          <item> -           <property name="text"> -            <string>26 GB</string> -           </property> -          </item> -         </widget> -        </item> -        <item row="2" column="0"> -         <widget class="QLabel" name="label_6"> -          <property name="text"> -           <string>User NAND</string> -          </property> -         </widget> -        </item> -        <item row="0" column="0"> -         <widget class="QLabel" name="label_7"> -          <property name="text"> -           <string>NAND</string> -          </property> -         </widget> -        </item> -        <item row="0" column="1"> -         <widget class="QComboBox" name="nand_size"> -          <item> -           <property name="text"> -            <string>29.1 GB</string> -           </property> -          </item> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item>        <widget class="QGroupBox" name="groupBox_4">         <property name="title">          <string>Patch Manager</string> diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 1fb62d1cf..20316c9cc 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -65,6 +65,8 @@ void ConfigureGeneral::ApplyConfiguration() {              Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() ==                                                        Qt::Checked);              Settings::values.frame_limit.SetValue(ui->frame_limit->value()); +        } +        if (Settings::values.use_multi_core.UsingGlobal()) {              Settings::values.use_multi_core.SetValue(ui->use_multi_core->isChecked());          }      } else { diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 7c0fa7ec5..ce30188cd 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -24,6 +24,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();      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); @@ -32,6 +33,8 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {              static_cast<int>(Settings::values.gpu_accuracy.GetValue()));          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());          ui->anisotropic_filtering_combobox->setCurrentIndex( @@ -41,6 +44,10 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {          ConfigurationShared::SetPerGameSetting(ui->use_vsync, &Settings::values.use_vsync);          ConfigurationShared::SetPerGameSetting(ui->use_assembly_shaders,                                                 &Settings::values.use_assembly_shaders); +        ConfigurationShared::SetPerGameSetting(ui->use_asynchronous_shaders, +                                               &Settings::values.use_asynchronous_shaders); +        ConfigurationShared::SetPerGameSetting(ui->use_asynchronous_shaders, +                                               &Settings::values.use_asynchronous_shaders);          ConfigurationShared::SetPerGameSetting(ui->use_fast_gpu_time,                                                 &Settings::values.use_fast_gpu_time);          ConfigurationShared::SetPerGameSetting(ui->force_30fps_mode, @@ -67,6 +74,14 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {          if (Settings::values.use_assembly_shaders.UsingGlobal()) {              Settings::values.use_assembly_shaders.SetValue(ui->use_assembly_shaders->isChecked());          } +        if (Settings::values.use_asynchronous_shaders.UsingGlobal()) { +            Settings::values.use_asynchronous_shaders.SetValue( +                ui->use_asynchronous_shaders->isChecked()); +        } +        if (Settings::values.use_asynchronous_shaders.UsingGlobal()) { +            Settings::values.use_asynchronous_shaders.SetValue( +                ui->use_asynchronous_shaders->isChecked()); +        }          if (Settings::values.use_fast_gpu_time.UsingGlobal()) {              Settings::values.use_fast_gpu_time.SetValue(ui->use_fast_gpu_time->isChecked());          } @@ -83,6 +98,10 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {          ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync);          ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_assembly_shaders,                                                   ui->use_assembly_shaders); +        ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders, +                                                 ui->use_asynchronous_shaders); +        ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders, +                                                 ui->use_asynchronous_shaders);          ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_fast_gpu_time,                                                   ui->use_fast_gpu_time);          ConfigurationShared::ApplyPerGameSetting(&Settings::values.force_30fps_mode, @@ -117,6 +136,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {          ui->gpu_accuracy->setEnabled(Settings::values.gpu_accuracy.UsingGlobal());          ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal());          ui->use_assembly_shaders->setEnabled(Settings::values.use_assembly_shaders.UsingGlobal()); +        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( @@ -128,6 +149,7 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {      ConfigurationShared::InsertGlobalItem(ui->gpu_accuracy);      ui->use_vsync->setTristate(true);      ui->use_assembly_shaders->setTristate(true); +    ui->use_asynchronous_shaders->setTristate(true);      ui->use_fast_gpu_time->setTristate(true);      ui->force_30fps_mode->setTristate(true);      ConfigurationShared::InsertGlobalItem(ui->anisotropic_filtering_combobox); diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 0021607ac..71e7dfe5e 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -73,6 +73,16 @@           </widget>          </item>          <item> +         <widget class="QCheckBox" name="use_asynchronous_shaders"> +          <property name="toolTip"> +           <string>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</string> +          </property> +          <property name="text"> +           <string>Use asynchronous shader building (experimental, OpenGL or Assembly shaders only)</string> +          </property> +         </widget> +        </item> +        <item>           <widget class="QCheckBox" name="force_30fps_mode">            <property name="text">             <string>Force 30 FPS mode</string> diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 94424ee44..24b6c5b72 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -5,6 +5,7 @@  #include <array>  #include <utility> +#include <QDirIterator>  #include "common/common_types.h"  #include "core/settings.h"  #include "ui_configure_ui.h" @@ -29,6 +30,8 @@ constexpr std::array row_text_names{  ConfigureUi::ConfigureUi(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureUi) {      ui->setupUi(this); +    InitializeLanguageComboBox(); +      for (const auto& theme : UISettings::themes) {          ui->theme_combobox->addItem(QString::fromUtf8(theme.first),                                      QString::fromUtf8(theme.second)); @@ -72,6 +75,8 @@ void ConfigureUi::RequestGameListUpdate() {  void ConfigureUi::SetConfiguration() {      ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); +    ui->language_combobox->setCurrentIndex( +        ui->language_combobox->findData(UISettings::values.language));      ui->show_add_ons->setChecked(UISettings::values.show_add_ons);      ui->icon_size_combobox->setCurrentIndex(          ui->icon_size_combobox->findData(UISettings::values.icon_size)); @@ -100,6 +105,25 @@ void ConfigureUi::RetranslateUI() {      }  } +void ConfigureUi::InitializeLanguageComboBox() { +    ui->language_combobox->addItem(tr("<System>"), QString{}); +    ui->language_combobox->addItem(tr("English"), QStringLiteral("en")); +    QDirIterator it(QStringLiteral(":/languages"), QDirIterator::NoIteratorFlags); +    while (it.hasNext()) { +        QString locale = it.next(); +        locale.truncate(locale.lastIndexOf(QLatin1Char{'.'})); +        locale.remove(0, locale.lastIndexOf(QLatin1Char{'/'}) + 1); +        const QString lang = QLocale::languageToString(QLocale(locale).language()); +        ui->language_combobox->addItem(lang, locale); +    } + +    // Unlike other configuration changes, interface language changes need to be reflected on the +    // interface immediately. This is done by passing a signal to the main window, and then +    // retranslating when passing back. +    connect(ui->language_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, +            &ConfigureUi::OnLanguageChanged); +} +  void ConfigureUi::InitializeIconSizeComboBox() {      for (const auto& size : default_icon_sizes) {          ui->icon_size_combobox->addItem(QString::fromUtf8(size.second), size.first); @@ -147,3 +171,10 @@ void ConfigureUi::UpdateSecondRowComboBox(bool init) {      ui->row_2_text_combobox->removeItem(          ui->row_2_text_combobox->findData(ui->row_1_text_combobox->currentData()));  } + +void ConfigureUi::OnLanguageChanged(int index) { +    if (index == -1) +        return; + +    emit LanguageChanged(ui->language_combobox->itemData(index).toString()); +} diff --git a/src/yuzu/configuration/configure_ui.h b/src/yuzu/configuration/configure_ui.h index d471afe99..c30bcf6ff 100644 --- a/src/yuzu/configuration/configure_ui.h +++ b/src/yuzu/configuration/configure_ui.h @@ -20,6 +20,12 @@ public:      void ApplyConfiguration(); +private slots: +    void OnLanguageChanged(int index); + +signals: +    void LanguageChanged(const QString& locale); +  private:      void RequestGameListUpdate(); @@ -28,6 +34,7 @@ private:      void changeEvent(QEvent*) override;      void RetranslateUI(); +    void InitializeLanguageComboBox();      void InitializeIconSizeComboBox();      void InitializeRowComboBoxes(); diff --git a/src/yuzu/configuration/configure_ui.ui b/src/yuzu/configuration/configure_ui.ui index bd5c5d3c2..0b81747d7 100644 --- a/src/yuzu/configuration/configure_ui.ui +++ b/src/yuzu/configuration/configure_ui.ui @@ -13,112 +13,132 @@    <property name="windowTitle">     <string>Form</string>    </property> -  <layout class="QHBoxLayout" name="HorizontalLayout"> +  <layout class="QVBoxLayout" name="verticalLayout">     <item> -    <layout class="QVBoxLayout" name="VerticalLayout"> -     <item> -      <widget class="QGroupBox" name="GeneralGroupBox"> -       <property name="title"> -        <string>General</string> -       </property> -       <layout class="QHBoxLayout" name="horizontalLayout"> +    <widget class="QGroupBox" name="general_groupBox"> +     <property name="title"> +      <string>General</string> +     </property> +     <layout class="QHBoxLayout" name="horizontalLayout"> +      <item> +       <layout class="QVBoxLayout" name="verticalLayout_2">          <item> -         <layout class="QVBoxLayout" name="verticalLayout"> +         <widget class="QLabel" name="label_change_language_info"> +          <property name="text"> +           <string>Note: Changing language will apply your configuration.</string> +          </property> +          <property name="wordWrap"> +           <bool>true</bool> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_2"> +          <item> +           <widget class="QLabel" name="language_label"> +            <property name="text"> +             <string>Interface language:</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QComboBox" name="language_combobox"/> +          </item> +         </layout> +        </item> +        <item> +         <layout class="QHBoxLayout" name="horizontalLayout_3"> +          <item> +           <widget class="QLabel" name="theme_label"> +            <property name="text"> +             <string>Theme:</string> +            </property> +           </widget> +          </item>            <item> -           <layout class="QHBoxLayout" name="horizontalLayout_3"> -            <item> -             <widget class="QLabel" name="theme_label"> -              <property name="text"> -               <string>Theme:</string> -              </property> -             </widget> -            </item> -            <item> -             <widget class="QComboBox" name="theme_combobox"/> -            </item> -           </layout> +           <widget class="QComboBox" name="theme_combobox"/>            </item>           </layout>          </item>         </layout> -      </widget> -     </item> -     <item> -      <widget class="QGroupBox" name="GameListGroupBox"> -       <property name="title"> -        <string>Game List</string> -       </property> -       <layout class="QHBoxLayout" name="GameListHorizontalLayout"> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QGroupBox" name="GameListGroupBox"> +     <property name="title"> +      <string>Game List</string> +     </property> +     <layout class="QHBoxLayout" name="GameListHorizontalLayout"> +      <item> +       <layout class="QVBoxLayout" name="GeneralVerticalLayout">          <item> -         <layout class="QVBoxLayout" name="GeneralVerticalLayout"> +         <widget class="QCheckBox" name="show_add_ons"> +          <property name="text"> +           <string>Show Add-Ons Column</string> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QHBoxLayout" name="icon_size_qhbox_layout_2">            <item> -           <widget class="QCheckBox" name="show_add_ons"> +           <widget class="QLabel" name="icon_size_label">              <property name="text"> -             <string>Show Add-Ons Column</string> +             <string>Icon Size:</string>              </property>             </widget>            </item>            <item> -           <layout class="QHBoxLayout" name="icon_size_qhbox_layout_2"> -            <item> -             <widget class="QLabel" name="icon_size_label"> -              <property name="text"> -               <string>Icon Size:</string> -              </property> -             </widget> -            </item> -            <item> -             <widget class="QComboBox" name="icon_size_combobox"/> -            </item> -           </layout> +           <widget class="QComboBox" name="icon_size_combobox"/>            </item> +         </layout> +        </item> +        <item> +         <layout class="QHBoxLayout" name="row_1_qhbox_layout">            <item> -           <layout class="QHBoxLayout" name="row_1_qhbox_layout"> -            <item> -             <widget class="QLabel" name="row_1_label"> -              <property name="text"> -               <string>Row 1 Text:</string> -              </property> -             </widget> -            </item> -            <item> -             <widget class="QComboBox" name="row_1_text_combobox"/> -            </item> -           </layout> +           <widget class="QLabel" name="row_1_label"> +            <property name="text"> +             <string>Row 1 Text:</string> +            </property> +           </widget>            </item>            <item> -           <layout class="QHBoxLayout" name="row_2_qhbox_layout"> -            <item> -             <widget class="QLabel" name="row_2_label"> -              <property name="text"> -               <string>Row 2 Text:</string> -              </property> -             </widget> -            </item> -            <item> -             <widget class="QComboBox" name="row_2_text_combobox"/> -            </item> -           </layout> +           <widget class="QComboBox" name="row_1_text_combobox"/> +          </item> +         </layout> +        </item> +        <item> +         <layout class="QHBoxLayout" name="row_2_qhbox_layout"> +          <item> +           <widget class="QLabel" name="row_2_label"> +            <property name="text"> +             <string>Row 2 Text:</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QComboBox" name="row_2_text_combobox"/>            </item>           </layout>          </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> +      </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>  | 
