diff options
Diffstat (limited to 'src/yuzu/configuration')
63 files changed, 705 insertions, 856 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 27b67fd9e..30a864135 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -16,7 +16,8 @@ namespace FS = Common::FS; -Config::Config(const std::string& config_name, ConfigType config_type) : type(config_type) { +Config::Config(Core::System& system_, const std::string& config_name, ConfigType config_type) + : type(config_type), system{system_} { global = config_type == ConfigType::GlobalConfig; Initialize(config_name); @@ -562,7 +563,11 @@ void Config::ReadControlValues() { ReadTouchscreenValues(); ReadMotionTouchValues(); +#ifdef _WIN32 ReadBasicSetting(Settings::values.enable_raw_input); +#else + Settings::values.enable_raw_input = false; +#endif ReadBasicSetting(Settings::values.emulate_analog_keyboard); Settings::values.mouse_panning = false; ReadBasicSetting(Settings::values.mouse_panning_sensitivity); @@ -705,8 +710,6 @@ void Config::ReadDebuggingValues() { void Config::ReadServiceValues() { qt_config->beginGroup(QStringLiteral("Services")); - ReadBasicSetting(Settings::values.bcat_backend); - ReadBasicSetting(Settings::values.bcat_boxcat_local); ReadBasicSetting(Settings::values.network_interface); qt_config->endGroup(); } @@ -1265,8 +1268,6 @@ void Config::SaveDebuggingValues() { void Config::SaveNetworkValues() { qt_config->beginGroup(QStringLiteral("Services")); - WriteBasicSetting(Settings::values.bcat_backend); - WriteBasicSetting(Settings::values.bcat_boxcat_local); WriteBasicSetting(Settings::values.network_interface); qt_config->endGroup(); @@ -1593,7 +1594,7 @@ void Config::Reload() { ReadValues(); // To apply default value changes SaveValues(); - Core::System::GetInstance().ApplySettings(); + system.ApplySettings(); } void Config::Save() { diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 3ee694e7c..a7f4a6720 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -14,6 +14,10 @@ class QSettings; +namespace Core { +class System; +} + class Config { public: enum class ConfigType { @@ -22,7 +26,7 @@ public: InputProfile, }; - explicit Config(const std::string& config_name = "qt-config", + explicit Config(Core::System& system_, const std::string& config_name = "qt-config", ConfigType config_type = ConfigType::GlobalConfig); ~Config(); @@ -176,6 +180,8 @@ private: std::unique_ptr<QSettings> qt_config; std::string qt_config_loc; bool global; + + Core::System& system; }; // These metatype declarations cannot be in common/settings.h because core is devoid of QT diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 6258dcf20..eb8078467 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -41,120 +41,8 @@ <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> - <number>11</number> + <number>-1</number> </property> - <widget class="ConfigureGeneral" name="generalTab"> - <property name="accessibleName"> - <string>General</string> - </property> - <attribute name="title"> - <string>General</string> - </attribute> - </widget> - <widget class="ConfigureUi" name="uiTab"> - <property name="accessibleName"> - <string>UI</string> - </property> - <attribute name="title"> - <string>Game List</string> - </attribute> - </widget> - <widget class="ConfigureSystem" name="systemTab"> - <property name="accessibleName"> - <string>System</string> - </property> - <attribute name="title"> - <string>System</string> - </attribute> - </widget> - <widget class="ConfigureProfileManager" name="profileManagerTab"> - <property name="accessibleName"> - <string>Profiles</string> - </property> - <attribute name="title"> - <string>Profiles</string> - </attribute> - </widget> - <widget class="ConfigureFilesystem" name="filesystemTab"> - <property name="accessibleName"> - <string>Filesystem</string> - </property> - <attribute name="title"> - <string>Filesystem</string> - </attribute> - </widget> - <widget class="ConfigureInput" name="inputTab"> - <property name="accessibleName"> - <string>Controls</string> - </property> - <attribute name="title"> - <string>Controls</string> - </attribute> - </widget> - <widget class="ConfigureHotkeys" name="hotkeysTab"> - <property name="accessibleName"> - <string>Hotkeys</string> - </property> - <attribute name="title"> - <string>Hotkeys</string> - </attribute> - </widget> - <widget class="ConfigureCpu" name="cpuTab"> - <property name="accessibleName"> - <string>CPU</string> - </property> - <attribute name="title"> - <string>CPU</string> - </attribute> - </widget> - <widget class="ConfigureGraphics" name="graphicsTab"> - <property name="accessibleName"> - <string>Graphics</string> - </property> - <attribute name="title"> - <string>Graphics</string> - </attribute> - </widget> - <widget class="ConfigureGraphicsAdvanced" name="graphicsAdvancedTab"> - <property name="accessibleName"> - <string>Advanced</string> - </property> - <attribute name="title"> - <string>GraphicsAdvanced</string> - </attribute> - </widget> - <widget class="ConfigureAudio" name="audioTab"> - <property name="accessibleName"> - <string>Audio</string> - </property> - <attribute name="title"> - <string>Audio</string> - </attribute> - </widget> - <widget class="ConfigureDebugTab" name="debugTab"> - <property name="accessibleName"> - <string>Debug</string> - </property> - <attribute name="title"> - <string>Debug</string> - </attribute> - </widget> - <widget class="ConfigureWeb" name="webTab"> - <property name="accessibleName"> - <string>Web</string> - </property> - <attribute name="title"> - <string>Web</string> - </attribute> - </widget> - <widget class="ConfigureNetwork" name="networkTab"> - <property name="accessibleName"> - <string>Network</string> - </property> - <attribute name="title"> - <string>Network</string> - </attribute> - </widget> </widget> </item> </layout> @@ -168,92 +56,6 @@ </item> </layout> </widget> - <customwidgets> - <customwidget> - <class>ConfigureGeneral</class> - <extends>QWidget</extends> - <header>configuration/configure_general.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureSystem</class> - <extends>QWidget</extends> - <header>configuration/configure_system.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureProfileManager</class> - <extends>QWidget</extends> - <header>configuration/configure_profile_manager.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureFilesystem</class> - <extends>QWidget</extends> - <header>configuration/configure_filesystem.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureAudio</class> - <extends>QWidget</extends> - <header>configuration/configure_audio.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureCpu</class> - <extends>QWidget</extends> - <header>configuration/configure_cpu.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureGraphics</class> - <extends>QWidget</extends> - <header>configuration/configure_graphics.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureGraphicsAdvanced</class> - <extends>QWidget</extends> - <header>configuration/configure_graphics_advanced.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureWeb</class> - <extends>QWidget</extends> - <header>configuration/configure_web.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureUi</class> - <extends>QWidget</extends> - <header>configuration/configure_ui.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureInput</class> - <extends>QWidget</extends> - <header>configuration/configure_input.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureHotkeys</class> - <extends>QWidget</extends> - <header>configuration/configure_hotkeys.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureNetwork</class> - <extends>QWidget</extends> - <header>configuration/configure_network.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureDebugTab</class> - <extends>QWidget</extends> - <header>configuration/configure_debug_tab.h</header> - <container>1</container> - </customwidget> - </customwidgets> <resources/> <connections> <connection> diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index f437cb53d..c33488718 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -14,8 +14,8 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_audio.h" -ConfigureAudio::ConfigureAudio(QWidget* parent) - : QWidget(parent), ui(std::make_unique<Ui::ConfigureAudio>()) { +ConfigureAudio::ConfigureAudio(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui(std::make_unique<Ui::ConfigureAudio>()), system{system_} { ui->setupUi(this); InitializeAudioOutputSinkComboBox(); @@ -32,7 +32,7 @@ ConfigureAudio::ConfigureAudio(QWidget* parent) SetConfiguration(); - const bool is_powered_on = Core::System::GetInstance().IsPoweredOn(); + const bool is_powered_on = system_.IsPoweredOn(); ui->output_sink_combo_box->setEnabled(!is_powered_on); ui->audio_device_combo_box->setEnabled(!is_powered_on); } diff --git a/src/yuzu/configuration/configure_audio.h b/src/yuzu/configuration/configure_audio.h index 5a01c8de7..5d2d05e47 100644 --- a/src/yuzu/configuration/configure_audio.h +++ b/src/yuzu/configuration/configure_audio.h @@ -7,6 +7,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + namespace ConfigurationShared { enum class CheckState; } @@ -19,10 +23,11 @@ class ConfigureAudio : public QWidget { Q_OBJECT public: - explicit ConfigureAudio(QWidget* parent = nullptr); + explicit ConfigureAudio(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureAudio() override; void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; @@ -33,7 +38,6 @@ private: void UpdateAudioDevices(int sink_index); - void SetConfiguration(); void SetOutputSinkFromSinkID(); void SetAudioDeviceFromDeviceID(); void SetVolumeIndicatorText(int percentage); @@ -41,4 +45,6 @@ private: void SetupPerGameUI(); std::unique_ptr<Ui::ConfigureAudio> ui; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_audio.ui b/src/yuzu/configuration/configure_audio.ui index bf736fc2c..d1ac8ad02 100644 --- a/src/yuzu/configuration/configure_audio.ui +++ b/src/yuzu/configuration/configure_audio.ui @@ -10,6 +10,9 @@ <height>368</height> </rect> </property> + <property name="accessibleName"> + <string>Audio</string> + </property> <layout class="QVBoxLayout"> <item> <widget class="QGroupBox" name="groupBox"> diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 784b6484e..f66cab5d4 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -13,7 +13,8 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_cpu.h" -ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureCpu) { +ConfigureCpu::ConfigureCpu(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureCpu>()}, system{system_} { ui->setupUi(this); SetupPerGameUI(); @@ -27,7 +28,7 @@ ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::Config ConfigureCpu::~ConfigureCpu() = default; void ConfigureCpu::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->accuracy->setEnabled(runtime_lock); ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock); diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index 154931482..ed9af0e9f 100644 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h @@ -8,6 +8,10 @@ #include <QWidget> #include "common/settings.h" +namespace Core { +class System; +} + namespace ConfigurationShared { enum class CheckState; } @@ -20,10 +24,11 @@ class ConfigureCpu : public QWidget { Q_OBJECT public: - explicit ConfigureCpu(QWidget* parent = nullptr); + explicit ConfigureCpu(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureCpu() override; void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; @@ -31,8 +36,6 @@ private: void UpdateGroup(int index); - void SetConfiguration(); - void SetupPerGameUI(); std::unique_ptr<Ui::ConfigureCpu> ui; @@ -42,4 +45,6 @@ private: ConfigurationShared::CheckState cpuopt_unsafe_ignore_standard_fpcr; ConfigurationShared::CheckState cpuopt_unsafe_inaccurate_nan; ConfigurationShared::CheckState cpuopt_unsafe_fastmem_check; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui index 5b9457faf..d8064db24 100644 --- a/src/yuzu/configuration/configure_cpu.ui +++ b/src/yuzu/configuration/configure_cpu.ui @@ -7,12 +7,15 @@ <x>0</x> <y>0</y> <width>448</width> - <height>433</height> + <height>439</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>CPU</string> + </property> <layout class="QVBoxLayout"> <item> <layout class="QVBoxLayout"> diff --git a/src/yuzu/configuration/configure_cpu_debug.cpp b/src/yuzu/configuration/configure_cpu_debug.cpp index 98e2d2be5..05a90963d 100644 --- a/src/yuzu/configuration/configure_cpu_debug.cpp +++ b/src/yuzu/configuration/configure_cpu_debug.cpp @@ -11,8 +11,8 @@ #include "ui_configure_cpu_debug.h" #include "yuzu/configuration/configure_cpu_debug.h" -ConfigureCpuDebug::ConfigureCpuDebug(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureCpuDebug) { +ConfigureCpuDebug::ConfigureCpuDebug(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureCpuDebug>()}, system{system_} { ui->setupUi(this); SetConfiguration(); @@ -21,7 +21,7 @@ ConfigureCpuDebug::ConfigureCpuDebug(QWidget* parent) ConfigureCpuDebug::~ConfigureCpuDebug() = default; void ConfigureCpuDebug::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->cpuopt_page_tables->setEnabled(runtime_lock); ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables.GetValue()); diff --git a/src/yuzu/configuration/configure_cpu_debug.h b/src/yuzu/configuration/configure_cpu_debug.h index 1b0d8050c..d06c4c63f 100644 --- a/src/yuzu/configuration/configure_cpu_debug.h +++ b/src/yuzu/configuration/configure_cpu_debug.h @@ -7,6 +7,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + namespace Ui { class ConfigureCpuDebug; } @@ -15,7 +19,7 @@ class ConfigureCpuDebug : public QWidget { Q_OBJECT public: - explicit ConfigureCpuDebug(QWidget* parent = nullptr); + explicit ConfigureCpuDebug(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureCpuDebug() override; void ApplyConfiguration(); @@ -27,4 +31,6 @@ private: void SetConfiguration(); std::unique_ptr<Ui::ConfigureCpuDebug> ui; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_cpu_debug.ui b/src/yuzu/configuration/configure_cpu_debug.ui index abf469b55..6e635bb2f 100644 --- a/src/yuzu/configuration/configure_cpu_debug.ui +++ b/src/yuzu/configuration/configure_cpu_debug.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>CPU</string> + </property> <layout class="QVBoxLayout"> <item> <layout class="QVBoxLayout"> diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index c0b240c1e..07bfa0360 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -14,7 +14,8 @@ #include "yuzu/debugger/console.h" #include "yuzu/uisettings.h" -ConfigureDebug::ConfigureDebug(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureDebug) { +ConfigureDebug::ConfigureDebug(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureDebug>()}, system{system_} { ui->setupUi(this); SetConfiguration(); @@ -28,7 +29,7 @@ ConfigureDebug::ConfigureDebug(QWidget* parent) : QWidget(parent), ui(new Ui::Co ConfigureDebug::~ConfigureDebug() = default; void ConfigureDebug::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->toggle_console->setEnabled(runtime_lock); ui->toggle_console->setChecked(UISettings::values.show_console.GetValue()); diff --git a/src/yuzu/configuration/configure_debug.h b/src/yuzu/configuration/configure_debug.h index f4805a1d8..73f71c9e3 100644 --- a/src/yuzu/configuration/configure_debug.h +++ b/src/yuzu/configuration/configure_debug.h @@ -7,6 +7,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + namespace Ui { class ConfigureDebug; } @@ -15,7 +19,7 @@ class ConfigureDebug : public QWidget { Q_OBJECT public: - explicit ConfigureDebug(QWidget* parent = nullptr); + explicit ConfigureDebug(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureDebug() override; void ApplyConfiguration(); @@ -27,4 +31,6 @@ private: void SetConfiguration(); std::unique_ptr<Ui::ConfigureDebug> ui; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_debug_controller.cpp b/src/yuzu/configuration/configure_debug_controller.cpp index a878ef9c6..31ec48384 100644 --- a/src/yuzu/configuration/configure_debug_controller.cpp +++ b/src/yuzu/configuration/configure_debug_controller.cpp @@ -2,16 +2,17 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "core/core.h" #include "ui_configure_debug_controller.h" #include "yuzu/configuration/configure_debug_controller.h" #include "yuzu/configuration/configure_input_player.h" ConfigureDebugController::ConfigureDebugController(QWidget* parent, InputCommon::InputSubsystem* input_subsystem, - InputProfiles* profiles) + InputProfiles* profiles, Core::System& system) : QDialog(parent), ui(std::make_unique<Ui::ConfigureDebugController>()), debug_controller( - new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, true)) { + new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, system, true)) { ui->setupUi(this); ui->controllerLayout->addWidget(debug_controller); diff --git a/src/yuzu/configuration/configure_debug_controller.h b/src/yuzu/configuration/configure_debug_controller.h index b4f53fad5..6e17c5aa0 100644 --- a/src/yuzu/configuration/configure_debug_controller.h +++ b/src/yuzu/configuration/configure_debug_controller.h @@ -13,6 +13,10 @@ class ConfigureInputPlayer; class InputProfiles; +namespace Core { +class System; +} + namespace InputCommon { class InputSubsystem; } @@ -26,7 +30,7 @@ class ConfigureDebugController : public QDialog { public: explicit ConfigureDebugController(QWidget* parent, InputCommon::InputSubsystem* input_subsystem, - InputProfiles* profiles); + InputProfiles* profiles, Core::System& system); ~ConfigureDebugController() override; void ApplyConfiguration(); diff --git a/src/yuzu/configuration/configure_debug_tab.cpp b/src/yuzu/configuration/configure_debug_tab.cpp index 67d369249..e69cca1ef 100644 --- a/src/yuzu/configuration/configure_debug_tab.cpp +++ b/src/yuzu/configuration/configure_debug_tab.cpp @@ -2,21 +2,29 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <memory> #include "ui_configure_debug_tab.h" +#include "yuzu/configuration/configure_cpu_debug.h" +#include "yuzu/configuration/configure_debug.h" #include "yuzu/configuration/configure_debug_tab.h" -ConfigureDebugTab::ConfigureDebugTab(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureDebugTab) { +ConfigureDebugTab::ConfigureDebugTab(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureDebugTab>()}, + debug_tab{std::make_unique<ConfigureDebug>(system_, this)}, + cpu_debug_tab{std::make_unique<ConfigureCpuDebug>(system_, this)} { ui->setupUi(this); + ui->tabWidget->addTab(debug_tab.get(), tr("Debug")); + ui->tabWidget->addTab(cpu_debug_tab.get(), tr("CPU")); + SetConfiguration(); } ConfigureDebugTab::~ConfigureDebugTab() = default; void ConfigureDebugTab::ApplyConfiguration() { - ui->debugTab->ApplyConfiguration(); - ui->cpuDebugTab->ApplyConfiguration(); + debug_tab->ApplyConfiguration(); + cpu_debug_tab->ApplyConfiguration(); } void ConfigureDebugTab::SetCurrentIndex(int index) { diff --git a/src/yuzu/configuration/configure_debug_tab.h b/src/yuzu/configuration/configure_debug_tab.h index 0a96d43d0..4f68260aa 100644 --- a/src/yuzu/configuration/configure_debug_tab.h +++ b/src/yuzu/configuration/configure_debug_tab.h @@ -7,6 +7,13 @@ #include <memory> #include <QWidget> +class ConfigureDebug; +class ConfigureCpuDebug; + +namespace Core { +class System; +} + namespace Ui { class ConfigureDebugTab; } @@ -15,7 +22,7 @@ class ConfigureDebugTab : public QWidget { Q_OBJECT public: - explicit ConfigureDebugTab(QWidget* parent = nullptr); + explicit ConfigureDebugTab(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureDebugTab() override; void ApplyConfiguration(); @@ -29,4 +36,7 @@ private: void SetConfiguration(); std::unique_ptr<Ui::ConfigureDebugTab> ui; + + std::unique_ptr<ConfigureDebug> debug_tab; + std::unique_ptr<ConfigureCpuDebug> cpu_debug_tab; }; diff --git a/src/yuzu/configuration/configure_debug_tab.ui b/src/yuzu/configuration/configure_debug_tab.ui index 7dc6dd704..15ec74727 100644 --- a/src/yuzu/configuration/configure_debug_tab.ui +++ b/src/yuzu/configuration/configure_debug_tab.ui @@ -13,40 +13,19 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Debug</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> - <number>1</number> + <number>-1</number> </property> - <widget class="ConfigureDebug" name="debugTab"> - <attribute name="title"> - <string>General</string> - </attribute> - </widget> - <widget class="ConfigureCpuDebug" name="cpuDebugTab"> - <attribute name="title"> - <string>CPU</string> - </attribute> - </widget> </widget> </item> </layout> </widget> - <customwidgets> - <customwidget> - <class>ConfigureDebug</class> - <extends>QWidget</extends> - <header>configuration/configure_debug.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureCpuDebug</class> - <extends>QWidget</extends> - <header>configuration/configure_cpu_debug.h</header> - <container>1</container> - </customwidget> - </customwidgets> <resources/> <connections/> </ui> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index fe4186157..4fa0c4a43 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <memory> #include <QAbstractButton> #include <QDialogButtonBox> #include <QHash> @@ -9,37 +10,84 @@ #include <QPushButton> #include <QSignalBlocker> #include <QTabWidget> +#include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" #include "ui_configure.h" #include "yuzu/configuration/config.h" +#include "yuzu/configuration/configure_audio.h" +#include "yuzu/configuration/configure_cpu.h" +#include "yuzu/configuration/configure_debug_tab.h" #include "yuzu/configuration/configure_dialog.h" +#include "yuzu/configuration/configure_filesystem.h" +#include "yuzu/configuration/configure_general.h" +#include "yuzu/configuration/configure_graphics.h" +#include "yuzu/configuration/configure_graphics_advanced.h" +#include "yuzu/configuration/configure_hotkeys.h" +#include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_input_player.h" +#include "yuzu/configuration/configure_network.h" +#include "yuzu/configuration/configure_profile_manager.h" +#include "yuzu/configuration/configure_system.h" +#include "yuzu/configuration/configure_ui.h" +#include "yuzu/configuration/configure_web.h" #include "yuzu/hotkeys.h" ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, - InputCommon::InputSubsystem* input_subsystem) - : QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) { + InputCommon::InputSubsystem* input_subsystem, + Core::System& system_) + : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, + registry(registry), system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, + this)}, + cpu_tab{std::make_unique<ConfigureCpu>(system_, this)}, + debug_tab_tab{std::make_unique<ConfigureDebugTab>(system_, this)}, + filesystem_tab{std::make_unique<ConfigureFilesystem>(this)}, + general_tab{std::make_unique<ConfigureGeneral>(system_, this)}, + graphics_tab{std::make_unique<ConfigureGraphics>(system_, this)}, + graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)}, + hotkeys_tab{std::make_unique<ConfigureHotkeys>(this)}, + input_tab{std::make_unique<ConfigureInput>(system_, this)}, + network_tab{std::make_unique<ConfigureNetwork>(system_, this)}, + profile_tab{std::make_unique<ConfigureProfileManager>(system_, this)}, + system_tab{std::make_unique<ConfigureSystem>(system_, this)}, + ui_tab{std::make_unique<ConfigureUi>(system_, this)}, web_tab{std::make_unique<ConfigureWeb>( + this)} { Settings::SetConfiguringGlobal(true); ui->setupUi(this); - ui->hotkeysTab->Populate(registry); + + ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); + ui->tabWidget->addTab(cpu_tab.get(), tr("CPU")); + ui->tabWidget->addTab(debug_tab_tab.get(), tr("Debug")); + ui->tabWidget->addTab(filesystem_tab.get(), tr("Filesystem")); + ui->tabWidget->addTab(general_tab.get(), tr("General")); + ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); + ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced")); + ui->tabWidget->addTab(hotkeys_tab.get(), tr("Hotkeys")); + ui->tabWidget->addTab(input_tab.get(), tr("Controls")); + ui->tabWidget->addTab(profile_tab.get(), tr("Profiles")); + ui->tabWidget->addTab(network_tab.get(), tr("Network")); + ui->tabWidget->addTab(system_tab.get(), tr("System")); + ui->tabWidget->addTab(ui_tab.get(), tr("Game List")); + ui->tabWidget->addTab(web_tab.get(), tr("Web")); + + hotkeys_tab->Populate(registry); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - ui->inputTab->Initialize(input_subsystem); + input_tab->Initialize(input_subsystem); - ui->generalTab->SetResetCallback([&] { this->close(); }); + general_tab->SetResetCallback([&] { this->close(); }); SetConfiguration(); PopulateSelectionList(); connect(ui->tabWidget, &QTabWidget::currentChanged, this, - [this]() { ui->debugTab->SetCurrentIndex(0); }); - connect(ui->uiTab, &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); + [this]() { debug_tab_tab->SetCurrentIndex(0); }); + connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); connect(ui->selectorList, &QListWidget::itemSelectionChanged, this, &ConfigureDialog::UpdateVisibleTabs); - if (Core::System::GetInstance().IsPoweredOn()) { + if (system.IsPoweredOn()) { QPushButton* apply_button = ui->buttonBox->addButton(QDialogButtonBox::Apply); connect(apply_button, &QAbstractButton::clicked, this, &ConfigureDialog::HandleApplyButtonClicked); @@ -54,21 +102,21 @@ ConfigureDialog::~ConfigureDialog() = default; void ConfigureDialog::SetConfiguration() {} void ConfigureDialog::ApplyConfiguration() { - ui->generalTab->ApplyConfiguration(); - ui->uiTab->ApplyConfiguration(); - ui->systemTab->ApplyConfiguration(); - ui->profileManagerTab->ApplyConfiguration(); - ui->filesystemTab->applyConfiguration(); - ui->inputTab->ApplyConfiguration(); - ui->hotkeysTab->ApplyConfiguration(registry); - ui->cpuTab->ApplyConfiguration(); - ui->graphicsTab->ApplyConfiguration(); - ui->graphicsAdvancedTab->ApplyConfiguration(); - ui->audioTab->ApplyConfiguration(); - ui->debugTab->ApplyConfiguration(); - ui->webTab->ApplyConfiguration(); - ui->networkTab->ApplyConfiguration(); - Core::System::GetInstance().ApplySettings(); + general_tab->ApplyConfiguration(); + ui_tab->ApplyConfiguration(); + system_tab->ApplyConfiguration(); + profile_tab->ApplyConfiguration(); + filesystem_tab->applyConfiguration(); + input_tab->ApplyConfiguration(); + hotkeys_tab->ApplyConfiguration(registry); + cpu_tab->ApplyConfiguration(); + graphics_tab->ApplyConfiguration(); + graphics_advanced_tab->ApplyConfiguration(); + audio_tab->ApplyConfiguration(); + debug_tab_tab->ApplyConfiguration(); + web_tab->ApplyConfiguration(); + network_tab->ApplyConfiguration(); + system.ApplySettings(); Settings::LogSettings(); } @@ -102,12 +150,14 @@ Q_DECLARE_METATYPE(QList<QWidget*>); void ConfigureDialog::PopulateSelectionList() { const std::array<std::pair<QString, QList<QWidget*>>, 6> items{ - {{tr("General"), {ui->generalTab, ui->hotkeysTab, ui->uiTab, ui->webTab, ui->debugTab}}, - {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->networkTab, ui->filesystemTab}}, - {tr("CPU"), {ui->cpuTab}}, - {tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}}, - {tr("Audio"), {ui->audioTab}}, - {tr("Controls"), ui->inputTab->GetSubTabs()}}, + {{tr("General"), + {general_tab.get(), hotkeys_tab.get(), ui_tab.get(), web_tab.get(), debug_tab_tab.get()}}, + {tr("System"), + {system_tab.get(), profile_tab.get(), network_tab.get(), filesystem_tab.get()}}, + {tr("CPU"), {cpu_tab.get()}}, + {tr("Graphics"), {graphics_tab.get(), graphics_advanced_tab.get()}}, + {tr("Audio"), {audio_tab.get()}}, + {tr("Controls"), input_tab->GetSubTabs()}}, }; [[maybe_unused]] const QSignalBlocker blocker(ui->selectorList); @@ -142,6 +192,7 @@ void ConfigureDialog::UpdateVisibleTabs() { const auto tabs = qvariant_cast<QList<QWidget*>>(items[0]->data(Qt::UserRole)); for (auto* const tab : tabs) { + LOG_DEBUG(Frontend, "{}", tab->accessibleName().toStdString()); ui->tabWidget->addTab(tab, tab->accessibleName()); } } diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index abe019635..32ddfd4e0 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -7,6 +7,25 @@ #include <memory> #include <QDialog> +namespace Core { +class System; +} + +class ConfigureAudio; +class ConfigureCpu; +class ConfigureDebugTab; +class ConfigureFilesystem; +class ConfigureGeneral; +class ConfigureGraphics; +class ConfigureGraphicsAdvanced; +class ConfigureHotkeys; +class ConfigureInput; +class ConfigureProfileManager; +class ConfigureSystem; +class ConfigureNetwork; +class ConfigureUi; +class ConfigureWeb; + class HotkeyRegistry; namespace InputCommon { @@ -22,7 +41,7 @@ class ConfigureDialog : public QDialog { public: explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, - InputCommon::InputSubsystem* input_subsystem); + InputCommon::InputSubsystem* input_subsystem, Core::System& system_); ~ConfigureDialog() override; void ApplyConfiguration(); @@ -45,4 +64,21 @@ private: std::unique_ptr<Ui::ConfigureDialog> ui; HotkeyRegistry& registry; + + Core::System& system; + + std::unique_ptr<ConfigureAudio> audio_tab; + std::unique_ptr<ConfigureCpu> cpu_tab; + std::unique_ptr<ConfigureDebugTab> debug_tab_tab; + std::unique_ptr<ConfigureFilesystem> filesystem_tab; + std::unique_ptr<ConfigureGeneral> general_tab; + std::unique_ptr<ConfigureGraphics> graphics_tab; + std::unique_ptr<ConfigureGraphicsAdvanced> graphics_advanced_tab; + std::unique_ptr<ConfigureHotkeys> hotkeys_tab; + std::unique_ptr<ConfigureInput> input_tab; + std::unique_ptr<ConfigureNetwork> network_tab; + std::unique_ptr<ConfigureProfileManager> profile_tab; + std::unique_ptr<ConfigureSystem> system_tab; + std::unique_ptr<ConfigureUi> ui_tab; + std::unique_ptr<ConfigureWeb> web_tab; }; diff --git a/src/yuzu/configuration/configure_filesystem.ui b/src/yuzu/configuration/configure_filesystem.ui index 62b9abc7a..2f6030b5c 100644 --- a/src/yuzu/configuration/configure_filesystem.ui +++ b/src/yuzu/configuration/configure_filesystem.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Filesystem</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 1f647a0d1..7af3ea97e 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -15,8 +15,8 @@ #include "yuzu/configuration/configure_general.h" #include "yuzu/uisettings.h" -ConfigureGeneral::ConfigureGeneral(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureGeneral) { +ConfigureGeneral::ConfigureGeneral(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureGeneral>()}, system{system_} { ui->setupUi(this); SetupPerGameUI(); @@ -35,7 +35,7 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent) ConfigureGeneral::~ConfigureGeneral() = default; void ConfigureGeneral::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->use_multi_core->setEnabled(runtime_lock); ui->use_multi_core->setChecked(Settings::values.use_multi_core.GetValue()); diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index c9df37d73..85c1dd4a8 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -8,6 +8,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + class ConfigureDialog; namespace ConfigurationShared { @@ -24,19 +28,18 @@ class ConfigureGeneral : public QWidget { Q_OBJECT public: - explicit ConfigureGeneral(QWidget* parent = nullptr); + explicit ConfigureGeneral(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureGeneral() override; void SetResetCallback(std::function<void()> callback); void ResetDefaults(); void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void SetConfiguration(); - void SetupPerGameUI(); std::function<void()> reset_callback; @@ -45,4 +48,6 @@ private: ConfigurationShared::CheckState use_speed_limit; ConfigurationShared::CheckState use_multi_core; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index 69b6c2d66..f9f0e3ebf 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>General</string> + </property> <layout class="QHBoxLayout" name="HorizontalLayout"> <item> <layout class="QVBoxLayout" name="VerticalLayout"> diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index c594164be..8e20cc6f3 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -19,8 +19,8 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics.h" -ConfigureGraphics::ConfigureGraphics(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureGraphics) { +ConfigureGraphics::ConfigureGraphics(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, system{system_} { vulkan_device = Settings::values.vulkan_device.GetValue(); RetrieveVulkanDevices(); @@ -83,7 +83,7 @@ void ConfigureGraphics::UpdateShaderBackendSelection(int backend) { ConfigureGraphics::~ConfigureGraphics() = default; void ConfigureGraphics::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->api_widget->setEnabled(runtime_lock); ui->use_asynchronous_gpu_emulation->setEnabled(runtime_lock); diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 7d7ac329d..1b101c940 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -10,6 +10,10 @@ #include <QWidget> #include "common/settings.h" +namespace Core { +class System; +} + namespace ConfigurationShared { enum class CheckState; } @@ -22,17 +26,16 @@ class ConfigureGraphics : public QWidget { Q_OBJECT public: - explicit ConfigureGraphics(QWidget* parent = nullptr); + explicit ConfigureGraphics(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureGraphics() override; void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void SetConfiguration(); - void UpdateBackgroundColorButton(QColor color); void UpdateAPILayout(); void UpdateDeviceSelection(int device); @@ -56,4 +59,6 @@ private: std::vector<QString> vulkan_devices; u32 vulkan_device{}; Settings::ShaderBackend shader_backend{}; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index 1a12cfa4d..beae74344 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -7,12 +7,15 @@ <x>0</x> <y>0</y> <width>437</width> - <height>321</height> + <height>482</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Graphics</string> + </property> <layout class="QVBoxLayout" name="verticalLayout_1"> <item> <layout class="QVBoxLayout" name="verticalLayout_2"> @@ -200,17 +203,17 @@ <widget class="QComboBox" name="nvdec_emulation"> <item> <property name="text"> - <string>Disabled</string> + <string>No Video Output</string> </property> </item> <item> <property name="text"> - <string>CPU Decoding</string> + <string>CPU Video Decoding</string> </property> </item> <item> <property name="text"> - <string>GPU Decoding</string> + <string>GPU Video Decoding (Default)</string> </property> </item> </widget> diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index bfd464061..30c5a3595 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -8,8 +8,8 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics_advanced.h" -ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureGraphicsAdvanced) { +ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphicsAdvanced>()}, system{system_} { ui->setupUi(this); @@ -21,7 +21,7 @@ ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(QWidget* parent) ConfigureGraphicsAdvanced::~ConfigureGraphicsAdvanced() = default; void ConfigureGraphicsAdvanced::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); + const bool runtime_lock = !system.IsPoweredOn(); ui->use_vsync->setEnabled(runtime_lock); ui->use_asynchronous_shaders->setEnabled(runtime_lock); ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index 13ba4ff6b..0a1724ce4 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -7,6 +7,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + namespace ConfigurationShared { enum class CheckState; } @@ -19,17 +23,16 @@ class ConfigureGraphicsAdvanced : public QWidget { Q_OBJECT public: - explicit ConfigureGraphicsAdvanced(QWidget* parent = nullptr); + explicit ConfigureGraphicsAdvanced(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureGraphicsAdvanced() override; void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void SetConfiguration(); - void SetupPerGameUI(); std::unique_ptr<Ui::ConfigureGraphicsAdvanced> ui; @@ -37,4 +40,6 @@ private: ConfigurationShared::CheckState use_vsync; ConfigurationShared::CheckState use_asynchronous_shaders; ConfigurationShared::CheckState use_fast_gpu_time; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index b91abc2f0..d06b45f17 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Advanced</string> + </property> <layout class="QVBoxLayout" name="verticalLayout_1"> <item> <layout class="QVBoxLayout" name="verticalLayout_2"> diff --git a/src/yuzu/configuration/configure_hotkeys.ui b/src/yuzu/configuration/configure_hotkeys.ui index 6d9f861e3..a6902a5d8 100644 --- a/src/yuzu/configuration/configure_hotkeys.ui +++ b/src/yuzu/configuration/configure_hotkeys.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Hotkey Settings</string> </property> + <property name="accessibleName"> + <string>Hotkeys</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 422022d02..1599299db 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -39,12 +39,11 @@ void CallConfigureDialog(ConfigureInput& parent, Args&&... args) { } } // Anonymous namespace -void OnDockedModeChanged(bool last_state, bool new_state) { +void OnDockedModeChanged(bool last_state, bool new_state, Core::System& system) { if (last_state == new_state) { return; } - Core::System& system{Core::System::GetInstance()}; if (!system.IsPoweredOn()) { return; } @@ -66,9 +65,9 @@ void OnDockedModeChanged(bool last_state, bool new_state) { } } -ConfigureInput::ConfigureInput(QWidget* parent) +ConfigureInput::ConfigureInput(Core::System& system_, QWidget* parent) : QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()), - profiles(std::make_unique<InputProfiles>()) { + profiles(std::make_unique<InputProfiles>(system_)), system{system_} { ui->setupUi(this); } @@ -77,22 +76,22 @@ ConfigureInput::~ConfigureInput() = default; void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, std::size_t max_players) { player_controllers = { - new ConfigureInputPlayer(this, 0, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 1, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 2, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 3, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 4, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 5, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 6, ui->consoleInputSettings, input_subsystem, - profiles.get()), - new ConfigureInputPlayer(this, 7, ui->consoleInputSettings, input_subsystem, - profiles.get()), + new ConfigureInputPlayer(this, 0, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 1, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 2, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 3, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 4, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 5, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 6, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), + new ConfigureInputPlayer(this, 7, ui->consoleInputSettings, input_subsystem, profiles.get(), + system), }; player_tabs = { @@ -148,7 +147,8 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, ui->tabAdvanced->setLayout(new QHBoxLayout(ui->tabAdvanced)); ui->tabAdvanced->layout()->addWidget(advanced); connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog, [this, input_subsystem] { - CallConfigureDialog<ConfigureDebugController>(*this, input_subsystem, profiles.get()); + CallConfigureDialog<ConfigureDebugController>(*this, input_subsystem, profiles.get(), + system); }); connect(advanced, &ConfigureInputAdvanced::CallMouseConfigDialog, [this, input_subsystem] { CallConfigureDialog<ConfigureMouseAdvanced>(*this, input_subsystem); @@ -204,7 +204,7 @@ void ConfigureInput::ApplyConfiguration() { const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); - OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue()); + OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue(), system); Settings::values.vibration_enabled.SetValue(ui->vibrationGroup->isChecked()); Settings::values.motion_enabled.SetValue(ui->motionGroup->isChecked()); diff --git a/src/yuzu/configuration/configure_input.h b/src/yuzu/configuration/configure_input.h index f4eb0d78b..4cafa3dab 100644 --- a/src/yuzu/configuration/configure_input.h +++ b/src/yuzu/configuration/configure_input.h @@ -11,6 +11,10 @@ #include <QList> #include <QWidget> +namespace Core { +class System; +} + class QCheckBox; class QString; class QTimer; @@ -28,13 +32,13 @@ namespace Ui { class ConfigureInput; } -void OnDockedModeChanged(bool last_state, bool new_state); +void OnDockedModeChanged(bool last_state, bool new_state, Core::System& system); class ConfigureInput : public QWidget { Q_OBJECT public: - explicit ConfigureInput(QWidget* parent = nullptr); + explicit ConfigureInput(Core::System& system_, QWidget* parent = nullptr); ~ConfigureInput() override; /// Initializes the input dialog with the given input subsystem. @@ -69,4 +73,6 @@ private: std::array<QWidget*, 8> player_tabs; std::array<QCheckBox*, 8> player_connected; ConfigureInputAdvanced* advanced; + + Core::System& system; }; diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index d20fd86b6..b30f09013 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -88,6 +88,10 @@ ConfigureInputAdvanced::ConfigureInputAdvanced(QWidget* parent) connect(ui->buttonMotionTouch, &QPushButton::clicked, this, &ConfigureInputAdvanced::CallMotionTouchConfigDialog); +#ifndef _WIN32 + ui->enable_raw_input->setVisible(false); +#endif + LoadConfiguration(); } diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 88f4bf388..3aab5d5f8 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -44,8 +44,7 @@ namespace { constexpr std::size_t HANDHELD_INDEX = 8; void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index, - bool connected) { - Core::System& system{Core::System::GetInstance()}; + bool connected, Core::System& system) { if (!system.IsPoweredOn()) { return; } @@ -232,11 +231,12 @@ QString AnalogToText(const Common::ParamPackage& param, const std::string& dir) ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_index, QWidget* bottom_row, InputCommon::InputSubsystem* input_subsystem_, - InputProfiles* profiles_, bool debug) + InputProfiles* profiles_, Core::System& system_, + bool debug) : QWidget(parent), ui(std::make_unique<Ui::ConfigureInputPlayer>()), player_index(player_index), debug(debug), input_subsystem{input_subsystem_}, profiles(profiles_), timeout_timer(std::make_unique<QTimer>()), poll_timer(std::make_unique<QTimer>()), - bottom_row(bottom_row) { + bottom_row(bottom_row), system{system_} { ui->setupUi(this); setFocusPolicy(Qt::ClickFocus); @@ -683,7 +683,7 @@ void ConfigureInputPlayer::TryConnectSelectedController() { controller_type == Settings::ControllerType::Handheld; // Connect only if handheld is going from disconnected to connected if (!handheld.connected && handheld_connected) { - UpdateController(controller_type, HANDHELD_INDEX, true); + UpdateController(controller_type, HANDHELD_INDEX, true, system); } handheld.connected = handheld_connected; } @@ -703,7 +703,7 @@ void ConfigureInputPlayer::TryConnectSelectedController() { return; } - UpdateController(controller_type, player_index, true); + UpdateController(controller_type, player_index, true, system); } void ConfigureInputPlayer::TryDisconnectSelectedController() { @@ -721,7 +721,7 @@ void ConfigureInputPlayer::TryDisconnectSelectedController() { controller_type == Settings::ControllerType::Handheld; // Disconnect only if handheld is going from connected to disconnected if (handheld.connected && !handheld_connected) { - UpdateController(controller_type, HANDHELD_INDEX, false); + UpdateController(controller_type, HANDHELD_INDEX, false, system); } return; } @@ -737,7 +737,7 @@ void ConfigureInputPlayer::TryDisconnectSelectedController() { } // Disconnect the controller first. - UpdateController(controller_type, player_index, false); + UpdateController(controller_type, player_index, false, system); } void ConfigureInputPlayer::showEvent(QShowEvent* event) { @@ -1017,8 +1017,6 @@ void ConfigureInputPlayer::SetConnectableControllers() { } }; - Core::System& system{Core::System::GetInstance()}; - if (!system.IsPoweredOn()) { add_controllers(true); return; diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h index c7d101682..39b44b8a5 100644 --- a/src/yuzu/configuration/configure_input_player.h +++ b/src/yuzu/configuration/configure_input_player.h @@ -29,6 +29,10 @@ class QWidget; class InputProfiles; +namespace Core { +class System; +} + namespace InputCommon { class InputSubsystem; } @@ -48,7 +52,8 @@ class ConfigureInputPlayer : public QWidget { public: explicit ConfigureInputPlayer(QWidget* parent, std::size_t player_index, QWidget* bottom_row, InputCommon::InputSubsystem* input_subsystem_, - InputProfiles* profiles_, bool debug = false); + InputProfiles* profiles_, Core::System& system_, + bool debug = false); ~ConfigureInputPlayer() override; /// Save all button configurations to settings file. @@ -233,4 +238,6 @@ private: /// ConfigureInput widget. On show, add this widget to the main layout. This will change the /// parent of the widget to this widget (but thats fine). QWidget* bottom_row; + + Core::System& system; }; diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index da328d904..f31f86339 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -1837,7 +1837,7 @@ void PlayerControlPreview::DrawLeftBody(QPainter& p, const QPointF center) { const float led_size = 5.0f; const QPointF led_position = sideview_center + QPointF(0, -36); int led_count = 0; - for (const auto color : led_color) { + for (const auto& color : led_color) { p.setBrush(color); DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size); } @@ -1933,7 +1933,7 @@ void PlayerControlPreview::DrawRightBody(QPainter& p, const QPointF center) { const float led_size = 5.0f; const QPointF led_position = sideview_center + QPointF(0, -36); int led_count = 0; - for (const auto color : led_color) { + for (const auto& color : led_color) { p.setBrush(color); DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size); } diff --git a/src/yuzu/configuration/configure_input_profile_dialog.cpp b/src/yuzu/configuration/configure_input_profile_dialog.cpp index 1f5cfa75b..cd5a88cea 100644 --- a/src/yuzu/configuration/configure_input_profile_dialog.cpp +++ b/src/yuzu/configuration/configure_input_profile_dialog.cpp @@ -2,14 +2,17 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "core/core.h" #include "ui_configure_input_profile_dialog.h" #include "yuzu/configuration/configure_input_player.h" #include "yuzu/configuration/configure_input_profile_dialog.h" ConfigureInputProfileDialog::ConfigureInputProfileDialog( - QWidget* parent, InputCommon::InputSubsystem* input_subsystem, InputProfiles* profiles) + QWidget* parent, InputCommon::InputSubsystem* input_subsystem, InputProfiles* profiles, + Core::System& system) : QDialog(parent), ui(std::make_unique<Ui::ConfigureInputProfileDialog>()), - profile_widget(new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, false)) { + profile_widget( + new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, system, false)) { ui->setupUi(this); ui->controllerLayout->addWidget(profile_widget); diff --git a/src/yuzu/configuration/configure_input_profile_dialog.h b/src/yuzu/configuration/configure_input_profile_dialog.h index e6386bdbb..84b1f6d1a 100644 --- a/src/yuzu/configuration/configure_input_profile_dialog.h +++ b/src/yuzu/configuration/configure_input_profile_dialog.h @@ -13,6 +13,10 @@ class ConfigureInputPlayer; class InputProfiles; +namespace Core { +class System; +} + namespace InputCommon { class InputSubsystem; } @@ -27,7 +31,7 @@ class ConfigureInputProfileDialog : public QDialog { public: explicit ConfigureInputProfileDialog(QWidget* parent, InputCommon::InputSubsystem* input_subsystem, - InputProfiles* profiles); + InputProfiles* profiles, Core::System& system); ~ConfigureInputProfileDialog() override; private: diff --git a/src/yuzu/configuration/configure_network.cpp b/src/yuzu/configuration/configure_network.cpp index ae22f1018..7020d2964 100644 --- a/src/yuzu/configuration/configure_network.cpp +++ b/src/yuzu/configuration/configure_network.cpp @@ -6,64 +6,25 @@ #include <QtConcurrent/QtConcurrent> #include "common/settings.h" #include "core/core.h" -#include "core/hle/service/bcat/backend/boxcat.h" #include "core/network/network_interface.h" #include "ui_configure_network.h" #include "yuzu/configuration/configure_network.h" -#ifdef YUZU_ENABLE_BOXCAT -namespace { -QString FormatEventStatusString(const Service::BCAT::EventStatus& status) { - QString out; - - if (status.header.has_value()) { - out += QStringLiteral("<i>%1</i><br>").arg(QString::fromStdString(*status.header)); - } - - if (status.events.size() == 1) { - out += QStringLiteral("%1<br>").arg(QString::fromStdString(status.events.front())); - } else { - for (const auto& event : status.events) { - out += QStringLiteral("- %1<br>").arg(QString::fromStdString(event)); - } - } - - if (status.footer.has_value()) { - out += QStringLiteral("<i>%1</i><br>").arg(QString::fromStdString(*status.footer)); - } - - return out; -} -} // Anonymous namespace -#endif - -ConfigureNetwork::ConfigureNetwork(QWidget* parent) - : QWidget(parent), ui(std::make_unique<Ui::ConfigureNetwork>()) { +ConfigureNetwork::ConfigureNetwork(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui(std::make_unique<Ui::ConfigureNetwork>()), system{system_} { ui->setupUi(this); - ui->bcat_source->addItem(QStringLiteral("None")); - ui->bcat_empty_label->setHidden(true); - ui->bcat_empty_header->setHidden(true); - -#ifdef YUZU_ENABLE_BOXCAT - ui->bcat_source->addItem(QStringLiteral("Boxcat"), QStringLiteral("boxcat")); -#endif - ui->network_interface->addItem(tr("None")); for (const auto& iface : Network::GetAvailableNetworkInterfaces()) { ui->network_interface->addItem(QString::fromStdString(iface.name)); } - connect(ui->bcat_source, QOverload<int>::of(&QComboBox::currentIndexChanged), this, - &ConfigureNetwork::OnBCATImplChanged); - this->SetConfiguration(); } ConfigureNetwork::~ConfigureNetwork() = default; void ConfigureNetwork::ApplyConfiguration() { - Settings::values.bcat_backend = ui->bcat_source->currentText().toLower().toStdString(); Settings::values.network_interface = ui->network_interface->currentText().toStdString(); } @@ -72,88 +33,10 @@ void ConfigureNetwork::RetranslateUi() { } void ConfigureNetwork::SetConfiguration() { - const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); - - const int index = - ui->bcat_source->findData(QString::fromStdString(Settings::values.bcat_backend.GetValue())); - ui->bcat_source->setCurrentIndex(index == -1 ? 0 : index); + const bool runtime_lock = !system.IsPoweredOn(); const std::string& network_interface = Settings::values.network_interface.GetValue(); ui->network_interface->setCurrentText(QString::fromStdString(network_interface)); ui->network_interface->setEnabled(runtime_lock); } - -std::pair<QString, QString> ConfigureNetwork::BCATDownloadEvents() { -#ifdef YUZU_ENABLE_BOXCAT - std::optional<std::string> global; - std::map<std::string, Service::BCAT::EventStatus> map; - const auto res = Service::BCAT::Boxcat::GetStatus(global, map); - - switch (res) { - case Service::BCAT::Boxcat::StatusResult::Success: - break; - case Service::BCAT::Boxcat::StatusResult::Offline: - return {QString{}, - tr("The boxcat service is offline or you are not connected to the internet.")}; - case Service::BCAT::Boxcat::StatusResult::ParseError: - return {QString{}, - tr("There was an error while processing the boxcat event data. Contact the yuzu " - "developers.")}; - case Service::BCAT::Boxcat::StatusResult::BadClientVersion: - return {QString{}, - tr("The version of yuzu you are using is either too new or too old for the server. " - "Try updating to the latest official release of yuzu.")}; - } - - if (map.empty()) { - return {QStringLiteral("Current Boxcat Events"), - tr("There are currently no events on boxcat.")}; - } - - QString out; - - if (global.has_value()) { - out += QStringLiteral("%1<br>").arg(QString::fromStdString(*global)); - } - - for (const auto& [key, value] : map) { - out += QStringLiteral("%1<b>%2</b><br>%3") - .arg(out.isEmpty() ? QString{} : QStringLiteral("<br>")) - .arg(QString::fromStdString(key)) - .arg(FormatEventStatusString(value)); - } - return {tr("Current Boxcat Events"), std::move(out)}; -#else - return {tr("Current Boxcat Events"), tr("There are currently no events on boxcat.")}; -#endif -} - -void ConfigureNetwork::OnBCATImplChanged() { -#ifdef YUZU_ENABLE_BOXCAT - const auto boxcat = ui->bcat_source->currentText() == QStringLiteral("Boxcat"); - ui->bcat_empty_header->setHidden(!boxcat); - ui->bcat_empty_label->setHidden(!boxcat); - ui->bcat_empty_header->setText(QString{}); - ui->bcat_empty_label->setText(tr("Yuzu is retrieving the latest boxcat status...")); - - if (!boxcat) - return; - - const auto future = QtConcurrent::run([this] { return BCATDownloadEvents(); }); - - watcher.setFuture(future); - connect(&watcher, &QFutureWatcher<std::pair<QString, QString>>::finished, this, - [this] { OnUpdateBCATEmptyLabel(watcher.result()); }); -#endif -} - -void ConfigureNetwork::OnUpdateBCATEmptyLabel(std::pair<QString, QString> string) { -#ifdef YUZU_ENABLE_BOXCAT - const auto boxcat = ui->bcat_source->currentText() == QStringLiteral("Boxcat"); - if (boxcat) { - ui->bcat_empty_header->setText(string.first); - ui->bcat_empty_label->setText(string.second); - } -#endif -} diff --git a/src/yuzu/configuration/configure_network.h b/src/yuzu/configuration/configure_network.h index 442b68e6b..8507c62eb 100644 --- a/src/yuzu/configuration/configure_network.h +++ b/src/yuzu/configuration/configure_network.h @@ -16,7 +16,7 @@ class ConfigureNetwork : public QWidget { Q_OBJECT public: - explicit ConfigureNetwork(QWidget* parent = nullptr); + explicit ConfigureNetwork(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureNetwork() override; void ApplyConfiguration(); @@ -25,10 +25,7 @@ public: private: void SetConfiguration(); - std::pair<QString, QString> BCATDownloadEvents(); - void OnBCATImplChanged(); - void OnUpdateBCATEmptyLabel(std::pair<QString, QString> string); - std::unique_ptr<Ui::ConfigureNetwork> ui; - QFutureWatcher<std::pair<QString, QString>> watcher{this}; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_network.ui b/src/yuzu/configuration/configure_network.ui index 5f9b7e97b..f10e973b1 100644 --- a/src/yuzu/configuration/configure_network.ui +++ b/src/yuzu/configuration/configure_network.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Network</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -35,92 +38,6 @@ </layout> </widget> </item> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>BCAT</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="3" column="0"> - <widget class="QLabel" name="bcat_empty_header"> - <property name="text"> - <string/> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>16777215</height> - </size> - </property> - <property name="text"> - <string>BCAT Backend</string> - </property> - </widget> - </item> - <item row="1" column="1" colspan="2"> - <widget class="QLabel" name="label_2"> - <property name="maximumSize"> - <size> - <width>260</width> - <height>16777215</height> - </size> - </property> - <property name="text"> - <string>BCAT is Nintendo's way of sending data to games to engage its community and unlock additional content.</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="2" column="1" colspan="2"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string><html><head/><body><p><a href="https://yuzu-emu.org/help/feature/boxcat"><span style=" text-decoration: underline; color:#0000ff;">Learn more about BCAT, Boxcat, and Current Events</span></a></p></body></html></string> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="0" column="1" colspan="2"> - <widget class="QComboBox" name="bcat_source"/> - </item> - <item row="3" column="1" colspan="2"> - <widget class="QLabel" name="bcat_empty_label"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="maximumSize"> - <size> - <width>260</width> - <height>16777215</height> - </size> - </property> - <property name="text"> - <string/> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> </layout> </item> <item> diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 8c00eec59..1031399e1 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -30,32 +30,56 @@ #include "core/loader/loader.h" #include "ui_configure_per_game.h" #include "yuzu/configuration/config.h" +#include "yuzu/configuration/configure_audio.h" +#include "yuzu/configuration/configure_cpu.h" +#include "yuzu/configuration/configure_general.h" +#include "yuzu/configuration/configure_graphics.h" +#include "yuzu/configuration/configure_graphics_advanced.h" #include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_per_game.h" +#include "yuzu/configuration/configure_per_game_addons.h" +#include "yuzu/configuration/configure_system.h" #include "yuzu/uisettings.h" #include "yuzu/util/util.h" -ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, const std::string& file_name) - : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) { +ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, const std::string& file_name, + Core::System& system_) + : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), + title_id(title_id), system{system_}, addons_tab{std::make_unique<ConfigurePerGameAddons>( + system_, this)}, + audio_tab{std::make_unique<ConfigureAudio>(system_, this)}, + cpu_tab{std::make_unique<ConfigureCpu>(system_, this)}, + general_tab{std::make_unique<ConfigureGeneral>(system_, this)}, + graphics_tab{std::make_unique<ConfigureGraphics>(system_, this)}, + graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)}, + system_tab{std::make_unique<ConfigureSystem>(system_, this)} { const auto file_path = std::filesystem::path(Common::FS::ToU8String(file_name)); const auto config_file_name = title_id == 0 ? Common::FS::PathToUTF8String(file_path.filename()) : fmt::format("{:016X}", title_id); - game_config = std::make_unique<Config>(config_file_name, Config::ConfigType::PerGameConfig); - - Settings::SetConfiguringGlobal(false); + game_config = + std::make_unique<Config>(system, config_file_name, Config::ConfigType::PerGameConfig); ui->setupUi(this); + + ui->tabWidget->addTab(addons_tab.get(), tr("Add-Ons")); + ui->tabWidget->addTab(general_tab.get(), tr("General")); + ui->tabWidget->addTab(system_tab.get(), tr("System")); + ui->tabWidget->addTab(cpu_tab.get(), tr("CPU")); + ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); + ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced")); + ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); + setFocusPolicy(Qt::ClickFocus); setWindowTitle(tr("Properties")); // remove Help question mark button from the title bar setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - ui->addonsTab->SetTitleId(title_id); + addons_tab->SetTitleId(title_id); scene = new QGraphicsScene; ui->icon_view->setScene(scene); - if (Core::System::GetInstance().IsPoweredOn()) { + if (system.IsPoweredOn()) { QPushButton* apply_button = ui->buttonBox->addButton(QDialogButtonBox::Apply); connect(apply_button, &QAbstractButton::clicked, this, &ConfigurePerGame::HandleApplyButtonClicked); @@ -67,15 +91,15 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, const std::str ConfigurePerGame::~ConfigurePerGame() = default; void ConfigurePerGame::ApplyConfiguration() { - ui->addonsTab->ApplyConfiguration(); - ui->generalTab->ApplyConfiguration(); - ui->cpuTab->ApplyConfiguration(); - ui->systemTab->ApplyConfiguration(); - ui->graphicsTab->ApplyConfiguration(); - ui->graphicsAdvancedTab->ApplyConfiguration(); - ui->audioTab->ApplyConfiguration(); - - Core::System::GetInstance().ApplySettings(); + addons_tab->ApplyConfiguration(); + general_tab->ApplyConfiguration(); + cpu_tab->ApplyConfiguration(); + system_tab->ApplyConfiguration(); + graphics_tab->ApplyConfiguration(); + graphics_advanced_tab->ApplyConfiguration(); + audio_tab->ApplyConfiguration(); + + system.ApplySettings(); Settings::LogSettings(); game_config->Save(); @@ -108,12 +132,11 @@ void ConfigurePerGame::LoadConfiguration() { return; } - ui->addonsTab->LoadFromFile(file); + addons_tab->LoadFromFile(file); ui->display_title_id->setText( QStringLiteral("%1").arg(title_id, 16, 16, QLatin1Char{'0'}).toUpper()); - auto& system = Core::System::GetInstance(); const FileSys::PatchManager pm{title_id, system.GetFileSystemController(), system.GetContentProvider()}; const auto control = pm.GetControlMetadata(); @@ -164,4 +187,11 @@ void ConfigurePerGame::LoadConfiguration() { const auto valueText = ReadableByteSize(file->GetSize()); ui->display_size->setText(valueText); + + general_tab->SetConfiguration(); + cpu_tab->SetConfiguration(); + system_tab->SetConfiguration(); + graphics_tab->SetConfiguration(); + graphics_advanced_tab->SetConfiguration(); + audio_tab->SetConfiguration(); } diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index a2d0211a3..c1a57d87b 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -14,6 +14,18 @@ #include "core/file_sys/vfs_types.h" #include "yuzu/configuration/config.h" +namespace Core { +class System; +} + +class ConfigurePerGameAddons; +class ConfigureAudio; +class ConfigureCpu; +class ConfigureGeneral; +class ConfigureGraphics; +class ConfigureGraphicsAdvanced; +class ConfigureSystem; + class QGraphicsScene; class QStandardItem; class QStandardItemModel; @@ -29,7 +41,8 @@ class ConfigurePerGame : public QDialog { public: // Cannot use std::filesystem::path due to https://bugreports.qt.io/browse/QTBUG-73263 - explicit ConfigurePerGame(QWidget* parent, u64 title_id, const std::string& file_name); + explicit ConfigurePerGame(QWidget* parent, u64 title_id, const std::string& file_name, + Core::System& system_); ~ConfigurePerGame() override; /// Save all button configurations to settings file @@ -52,4 +65,14 @@ private: QGraphicsScene* scene; std::unique_ptr<Config> game_config; + + Core::System& system; + + std::unique_ptr<ConfigurePerGameAddons> addons_tab; + std::unique_ptr<ConfigureAudio> audio_tab; + std::unique_ptr<ConfigureCpu> cpu_tab; + std::unique_ptr<ConfigureGeneral> general_tab; + std::unique_ptr<ConfigureGraphics> graphics_tab; + std::unique_ptr<ConfigureGraphicsAdvanced> graphics_advanced_tab; + std::unique_ptr<ConfigureSystem> system_tab; }; diff --git a/src/yuzu/configuration/configure_per_game.ui b/src/yuzu/configuration/configure_per_game.ui index 7da14146b..60efdbf21 100644 --- a/src/yuzu/configuration/configure_per_game.ui +++ b/src/yuzu/configuration/configure_per_game.ui @@ -7,12 +7,13 @@ <x>0</x> <y>0</y> <width>900</width> - <height>600</height> + <height>630</height> </rect> </property> <property name="minimumSize"> <size> <width>900</width> + <height>0</height> </size> </property> <property name="windowTitle"> @@ -214,7 +215,7 @@ <bool>true</bool> </property> <property name="currentIndex"> - <number>0</number> + <number>-1</number> </property> <property name="usesScrollButtons"> <bool>true</bool> @@ -225,41 +226,6 @@ <property name="tabsClosable"> <bool>false</bool> </property> - <widget class="ConfigurePerGameAddons" name="addonsTab"> - <attribute name="title"> - <string>Add-Ons</string> - </attribute> - </widget> - <widget class="ConfigureGeneral" name="generalTab"> - <attribute name="title"> - <string>General</string> - </attribute> - </widget> - <widget class="ConfigureSystem" name="systemTab"> - <attribute name="title"> - <string>System</string> - </attribute> - </widget> - <widget class="ConfigureCpu" name="cpuTab"> - <attribute name="title"> - <string>CPU</string> - </attribute> - </widget> - <widget class="ConfigureGraphics" name="graphicsTab"> - <attribute name="title"> - <string>Graphics</string> - </attribute> - </widget> - <widget class="ConfigureGraphicsAdvanced" name="graphicsAdvancedTab"> - <attribute name="title"> - <string>Adv. Graphics</string> - </attribute> - </widget> - <widget class="ConfigureAudio" name="audioTab"> - <attribute name="title"> - <string>Audio</string> - </attribute> - </widget> </widget> </item> </layout> @@ -284,50 +250,6 @@ </item> </layout> </widget> - <customwidgets> - <customwidget> - <class>ConfigureGeneral</class> - <extends>QWidget</extends> - <header>configuration/configure_general.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureSystem</class> - <extends>QWidget</extends> - <header>configuration/configure_system.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureAudio</class> - <extends>QWidget</extends> - <header>configuration/configure_audio.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureGraphics</class> - <extends>QWidget</extends> - <header>configuration/configure_graphics.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureGraphicsAdvanced</class> - <extends>QWidget</extends> - <header>configuration/configure_graphics_advanced.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigurePerGameAddons</class> - <extends>QWidget</extends> - <header>configuration/configure_per_game_addons.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ConfigureCpu</class> - <extends>QWidget</extends> - <header>configuration/configure_cpu.h</header> - <container>1</container> - </customwidget> - </customwidgets> <resources/> <connections> <connection> @@ -335,12 +257,32 @@ <signal>accepted()</signal> <receiver>ConfigurePerGame</receiver> <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>ConfigurePerGame</receiver> <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> </connection> </connections> </ui> diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index ebb0f411c..65e615963 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -26,8 +26,8 @@ #include "yuzu/uisettings.h" #include "yuzu/util/util.h" -ConfigurePerGameAddons::ConfigurePerGameAddons(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigurePerGameAddons) { +ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigurePerGameAddons>()}, system{system_} { ui->setupUi(this); layout = new QVBoxLayout; @@ -58,7 +58,7 @@ ConfigurePerGameAddons::ConfigurePerGameAddons(QWidget* parent) ui->scrollArea->setLayout(layout); - ui->scrollArea->setEnabled(!Core::System::GetInstance().IsPoweredOn()); + ui->scrollArea->setEnabled(!system.IsPoweredOn()); connect(item_model, &QStandardItemModel::itemChanged, [] { UISettings::values.is_game_list_reload_pending.exchange(true); }); @@ -112,7 +112,6 @@ void ConfigurePerGameAddons::LoadConfiguration() { return; } - auto& system = Core::System::GetInstance(); const FileSys::PatchManager pm{title_id, system.GetFileSystemController(), system.GetContentProvider()}; const auto loader = Loader::GetLoader(system, file); diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index a00ec3539..24b017494 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -11,6 +11,10 @@ #include "core/file_sys/vfs_types.h" +namespace Core { +class System; +} + class QGraphicsScene; class QStandardItem; class QStandardItemModel; @@ -25,7 +29,7 @@ class ConfigurePerGameAddons : public QWidget { Q_OBJECT public: - explicit ConfigurePerGameAddons(QWidget* parent = nullptr); + explicit ConfigurePerGameAddons(Core::System& system_, QWidget* parent = nullptr); ~ConfigurePerGameAddons() override; /// Save all button configurations to settings file @@ -50,4 +54,6 @@ private: QStandardItemModel* item_model; std::vector<QList<QStandardItem*>> list_items; + + Core::System& system; }; diff --git a/src/yuzu/configuration/configure_per_game_addons.ui b/src/yuzu/configuration/configure_per_game_addons.ui index aefdebfcd..f9cf6f2c3 100644 --- a/src/yuzu/configuration/configure_per_game_addons.ui +++ b/src/yuzu/configuration/configure_per_game_addons.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleDescription"> + <string>Add-Ons</string> + </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QScrollArea" name="scrollArea"> diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index ac849b01d..99d5f4686 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -76,9 +76,9 @@ QString GetProfileUsernameFromUser(QWidget* parent, const QString& description_t } } // Anonymous namespace -ConfigureProfileManager ::ConfigureProfileManager(QWidget* parent) - : QWidget(parent), ui(new Ui::ConfigureProfileManager), - profile_manager(std::make_unique<Service::Account::ProfileManager>()) { +ConfigureProfileManager::ConfigureProfileManager(const Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureProfileManager>()}, + profile_manager(std::make_unique<Service::Account::ProfileManager>()), system{system_} { ui->setupUi(this); tree_view = new QTreeView; @@ -137,7 +137,7 @@ void ConfigureProfileManager::RetranslateUI() { } void ConfigureProfileManager::SetConfiguration() { - enabled = !Core::System::GetInstance().IsPoweredOn(); + enabled = !system.IsPoweredOn(); item_model->removeRows(0, item_model->rowCount()); list_items.clear(); @@ -180,8 +180,6 @@ void ConfigureProfileManager::ApplyConfiguration() { if (!enabled) { return; } - - Core::System::GetInstance().ApplySettings(); } void ConfigureProfileManager::SelectUser(const QModelIndex& index) { diff --git a/src/yuzu/configuration/configure_profile_manager.h b/src/yuzu/configuration/configure_profile_manager.h index 0a9bca2a6..575cb89d5 100644 --- a/src/yuzu/configuration/configure_profile_manager.h +++ b/src/yuzu/configuration/configure_profile_manager.h @@ -9,6 +9,10 @@ #include <QList> #include <QWidget> +namespace Core { +class System; +} + class QGraphicsScene; class QStandardItem; class QStandardItemModel; @@ -27,7 +31,7 @@ class ConfigureProfileManager : public QWidget { Q_OBJECT public: - explicit ConfigureProfileManager(QWidget* parent = nullptr); + explicit ConfigureProfileManager(const Core::System& system_, QWidget* parent = nullptr); ~ConfigureProfileManager() override; void ApplyConfiguration(); @@ -58,4 +62,6 @@ private: bool enabled = false; std::unique_ptr<Service::Account::ProfileManager> profile_manager; + + const Core::System& system; }; diff --git a/src/yuzu/configuration/configure_profile_manager.ui b/src/yuzu/configuration/configure_profile_manager.ui index dedba4998..cfe7478c8 100644 --- a/src/yuzu/configuration/configure_profile_manager.ui +++ b/src/yuzu/configuration/configure_profile_manager.ui @@ -6,13 +6,16 @@ <rect> <x>0</x> <y>0</y> - <width>366</width> + <width>390</width> <height>483</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Profiles</string> + </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout"> diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp index 99a5df241..eea45f8ea 100644 --- a/src/yuzu/configuration/configure_system.cpp +++ b/src/yuzu/configuration/configure_system.cpp @@ -12,12 +12,13 @@ #include "common/assert.h" #include "common/settings.h" #include "core/core.h" -#include "core/hle/service/time/time.h" +#include "core/hle/service/time/time_manager.h" #include "ui_configure_system.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_system.h" -ConfigureSystem::ConfigureSystem(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureSystem) { +ConfigureSystem::ConfigureSystem(Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureSystem>()}, system{system_} { ui->setupUi(this); connect(ui->button_regenerate_console_id, &QPushButton::clicked, this, &ConfigureSystem::RefreshConsoleID); @@ -59,7 +60,7 @@ void ConfigureSystem::RetranslateUI() { } void ConfigureSystem::SetConfiguration() { - enabled = !Core::System::GetInstance().IsPoweredOn(); + enabled = !system.IsPoweredOn(); const auto rng_seed = QStringLiteral("%1") .arg(Settings::values.rng_seed.GetValue().value_or(0), 8, 16, QLatin1Char{'0'}) @@ -103,8 +104,6 @@ void ConfigureSystem::SetConfiguration() { void ConfigureSystem::ReadSystemSettings() {} void ConfigureSystem::ApplyConfiguration() { - auto& system = Core::System::GetInstance(); - // Allow setting custom RTC even if system is powered on, // to allow in-game time to be fast forwarded if (Settings::IsConfiguringGlobal()) { @@ -162,8 +161,6 @@ void ConfigureSystem::ApplyConfiguration() { break; } } - - system.ApplySettings(); } void ConfigureSystem::RefreshConsoleID() { diff --git a/src/yuzu/configuration/configure_system.h b/src/yuzu/configuration/configure_system.h index fc5cd2945..bb24c9ae7 100644 --- a/src/yuzu/configuration/configure_system.h +++ b/src/yuzu/configuration/configure_system.h @@ -9,6 +9,10 @@ #include <QList> #include <QWidget> +namespace Core { +class System; +} + namespace ConfigurationShared { enum class CheckState; } @@ -21,17 +25,16 @@ class ConfigureSystem : public QWidget { Q_OBJECT public: - explicit ConfigureSystem(QWidget* parent = nullptr); + explicit ConfigureSystem(Core::System& system_, QWidget* parent = nullptr); ~ConfigureSystem() override; void ApplyConfiguration(); + void SetConfiguration(); private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void SetConfiguration(); - void ReadSystemSettings(); void RefreshConsoleID(); @@ -48,4 +51,6 @@ private: ConfigurationShared::CheckState use_rng_seed; ConfigurationShared::CheckState use_custom_rtc; + + Core::System& system; }; diff --git a/src/yuzu/configuration/configure_system.ui b/src/yuzu/configuration/configure_system.ui index 27f552f59..5b68dcb29 100644 --- a/src/yuzu/configuration/configure_system.ui +++ b/src/yuzu/configuration/configure_system.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>System</string> + </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout"> diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp index b666b175a..8e5a4c72d 100644 --- a/src/yuzu/configuration/configure_tas.cpp +++ b/src/yuzu/configuration/configure_tas.cpp @@ -18,6 +18,7 @@ ConfigureTasDialog::ConfigureTasDialog(QWidget* parent) setFocusPolicy(Qt::ClickFocus); setWindowTitle(tr("TAS Configuration")); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); connect(ui->tas_path_button, &QToolButton::pressed, this, [this] { SetDirectory(DirectoryTarget::TAS, ui->tas_path_edit); }); diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui index 95575ed9d..6caa19031 100644 --- a/src/yuzu/configuration/configure_tas.ui +++ b/src/yuzu/configuration/configure_tas.ui @@ -1,153 +1,186 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>ConfigureTas</class> - <widget class="QDialog" name="ConfigureTas"> - <layout class="QVBoxLayout" name="verticalLayout_1"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_1"> - <item> - <widget class="QGroupBox" name="groupBox_1"> - <property name="title"> - <string>TAS</string> - </property> - <layout class="QGridLayout" name="gridLayout_1"> - <item row="0" column="0" colspan="4"> - <widget class="QLabel" name="label_1"> - <property name="text"> - <string>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation please consult the FAQ on the yuzu website.</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="4"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (General -> Hotkeys).</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="2" column="0" colspan="4"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>WARNING: This is an experimental feature.<br/>It will not play back scripts frame perfectly with the current, imperfect syncing method.</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>Settings</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0" colspan="4"> - <widget class="QCheckBox" name="tas_enable"> - <property name="text"> - <string>Enable TAS features</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="4"> - <widget class="QCheckBox" name="tas_control_swap"> - <property name="text"> - <string>Automatic controller profile swapping</string> - </property> - </widget> - </item> - <item row="2" column="0" colspan="4"> - <widget class="QCheckBox" name="tas_loop_script"> - <property name="text"> - <string>Loop script</string> - </property> - </widget> - </item> - <item row="3" column="0" colspan="4"> - <widget class="QCheckBox" name="tas_pause_on_load"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Pause execution during loads</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QGroupBox" name="groupBox_3"> - <property name="title"> - <string>Script Directory</string> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Path</string> - </property> - </widget> - </item> - <item row="0" column="3"> - <widget class="QToolButton" name="tas_path_button"> - <property name="text"> - <string>...</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLineEdit" name="tas_path_edit"/> - </item> - </layout> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <class>ConfigureTas</class> + <widget class="QDialog" name="ConfigureTas"> + <layout class="QVBoxLayout" name="verticalLayout_1"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_1"> + <item> + <widget class="QGroupBox" name="groupBox_1"> + <property name="title"> + <string>TAS</string> + </property> + <layout class="QGridLayout" name="gridLayout_1"> + <item row="0" column="0" colspan="4"> + <widget class="QLabel" name="label_1"> + <property name="text"> + <string>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation please consult the FAQ on the yuzu website.</string> </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + </widget> + </item> + <item row="1" column="0" colspan="4"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (General -> Hotkeys).</string> </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + <property name="wordWrap"> + <bool>true</bool> </property> - </widget> - </item> + </widget> + </item> + <item row="2" column="0" colspan="4"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>WARNING: This is an experimental feature.<br/>It will not play back scripts frame perfectly with the current, imperfect syncing method.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Settings</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0" colspan="4"> + <widget class="QCheckBox" name="tas_enable"> + <property name="text"> + <string>Enable TAS features</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4"> + <widget class="QCheckBox" name="tas_control_swap"> + <property name="text"> + <string>Automatic controller profile swapping</string> + </property> + </widget> + </item> + <item row="2" column="0" colspan="4"> + <widget class="QCheckBox" name="tas_loop_script"> + <property name="text"> + <string>Loop script</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="4"> + <widget class="QCheckBox" name="tas_pause_on_load"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Pause execution during loads</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Script Directory</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Path</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QToolButton" name="tas_path_button"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="tas_path_edit"/> + </item> + </layout> + </widget> + </item> </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>ConfigureTas</receiver> - <slot>accept()</slot> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>ConfigureTas</receiver> - <slot>reject()</slot> - </connection> - </connections> + </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="QDialogButtonBox" name="buttonBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ConfigureTas</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ConfigureTas</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + </connections> </ui> diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 9d7d51126..46e5409db 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -54,7 +54,8 @@ QString GetTranslatedRowTextName(size_t index) { } } // Anonymous namespace -ConfigureUi::ConfigureUi(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureUi) { +ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) + : QWidget(parent), ui{std::make_unique<Ui::ConfigureUi>()}, system{system_} { ui->setupUi(this); InitializeLanguageComboBox(); @@ -116,7 +117,7 @@ void ConfigureUi::ApplyConfiguration() { UISettings::values.enable_screenshot_save_as = ui->enable_screenshot_save_as->isChecked(); Common::FS::SetYuzuPath(Common::FS::YuzuPath::ScreenshotsDir, ui->screenshot_path_edit->text().toStdString()); - Core::System::GetInstance().ApplySettings(); + system.ApplySettings(); } void ConfigureUi::RequestGameListUpdate() { diff --git a/src/yuzu/configuration/configure_ui.h b/src/yuzu/configuration/configure_ui.h index c30bcf6ff..48b6e6d82 100644 --- a/src/yuzu/configuration/configure_ui.h +++ b/src/yuzu/configuration/configure_ui.h @@ -7,6 +7,10 @@ #include <memory> #include <QWidget> +namespace Core { +class System; +} + namespace Ui { class ConfigureUi; } @@ -15,7 +19,7 @@ class ConfigureUi : public QWidget { Q_OBJECT public: - explicit ConfigureUi(QWidget* parent = nullptr); + explicit ConfigureUi(Core::System& system_, QWidget* parent = nullptr); ~ConfigureUi() override; void ApplyConfiguration(); @@ -42,4 +46,6 @@ private: void UpdateSecondRowComboBox(bool init = false); std::unique_ptr<Ui::ConfigureUi> ui; + + Core::System& system; }; diff --git a/src/yuzu/configuration/configure_ui.ui b/src/yuzu/configuration/configure_ui.ui index 394f9fe04..a50df7f6f 100644 --- a/src/yuzu/configuration/configure_ui.ui +++ b/src/yuzu/configuration/configure_ui.ui @@ -7,12 +7,15 @@ <x>0</x> <y>0</y> <width>363</width> - <height>391</height> + <height>507</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>UI</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="general_groupBox"> diff --git a/src/yuzu/configuration/configure_web.ui b/src/yuzu/configuration/configure_web.ui index 8c07d1165..35b4274b0 100644 --- a/src/yuzu/configuration/configure_web.ui +++ b/src/yuzu/configuration/configure_web.ui @@ -13,6 +13,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="accessibleName"> + <string>Web</string> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -55,7 +58,7 @@ </widget> </item> <item row="0" column="1" colspan="3"> - <widget class="QLabel" name="username" /> + <widget class="QLabel" name="username"/> </item> <item row="1" column="0"> <widget class="QLabel" name="label_token"> @@ -65,8 +68,7 @@ </widget> </item> <item row="1" column="4"> - <widget class="QLabel" name="label_token_verified"> - </widget> + <widget class="QLabel" name="label_token_verified"/> </item> <item row="0" column="0"> <widget class="QLabel" name="label_username"> @@ -163,20 +165,20 @@ </layout> </item> <item> - <widget class="QGroupBox" name="discord_group"> - <property name="title"> - <string>Discord Presence</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_21"> - <item> - <widget class="QCheckBox" name="toggle_discordrpc"> - <property name="text"> - <string>Show Current Game in your Discord Status</string> - </property> - </widget> - </item> - </layout> - </widget> + <widget class="QGroupBox" name="discord_group"> + <property name="title"> + <string>Discord Presence</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_21"> + <item> + <widget class="QCheckBox" name="toggle_discordrpc"> + <property name="text"> + <string>Show Current Game in your Discord Status</string> + </property> + </widget> + </item> + </layout> + </widget> </item> <item> <spacer name="verticalSpacer"> diff --git a/src/yuzu/configuration/input_profiles.cpp b/src/yuzu/configuration/input_profiles.cpp index 333eeb84e..38ea6c772 100644 --- a/src/yuzu/configuration/input_profiles.cpp +++ b/src/yuzu/configuration/input_profiles.cpp @@ -28,7 +28,7 @@ std::filesystem::path GetNameWithoutExtension(std::filesystem::path filename) { } // namespace -InputProfiles::InputProfiles() { +InputProfiles::InputProfiles(Core::System& system_) : system{system_} { const auto input_profile_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "input"; if (!FS::IsDir(input_profile_loc)) { @@ -44,8 +44,8 @@ InputProfiles::InputProfiles() { if (IsINI(filename) && IsProfileNameValid(name_without_ext)) { map_profiles.insert_or_assign( - name_without_ext, - std::make_unique<Config>(name_without_ext, Config::ConfigType::InputProfile)); + name_without_ext, std::make_unique<Config>(system, name_without_ext, + Config::ConfigType::InputProfile)); } return true; @@ -81,7 +81,8 @@ bool InputProfiles::CreateProfile(const std::string& profile_name, std::size_t p } map_profiles.insert_or_assign( - profile_name, std::make_unique<Config>(profile_name, Config::ConfigType::InputProfile)); + profile_name, + std::make_unique<Config>(system, profile_name, Config::ConfigType::InputProfile)); return SaveProfile(profile_name, player_index); } diff --git a/src/yuzu/configuration/input_profiles.h b/src/yuzu/configuration/input_profiles.h index cb41fd9be..a567bd5a9 100644 --- a/src/yuzu/configuration/input_profiles.h +++ b/src/yuzu/configuration/input_profiles.h @@ -8,12 +8,16 @@ #include <string_view> #include <unordered_map> +namespace Core { +class System; +} + class Config; class InputProfiles { public: - explicit InputProfiles(); + explicit InputProfiles(Core::System& system_); virtual ~InputProfiles(); std::vector<std::string> GetInputProfileNames(); @@ -29,4 +33,6 @@ private: bool ProfileExistsInMap(const std::string& profile_name) const; std::unordered_map<std::string, std::unique_ptr<Config>> map_profiles; + + Core::System& system; }; |