diff options
69 files changed, 688 insertions, 636 deletions
| diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index 97106d2cc..bf8445a89 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -37,17 +37,14 @@ constexpr std::array<std::array<bool, 4>, 8> led_patterns{{  }};  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;      } -    Service::SM::ServiceManager& sm = system.ServiceManager(); -      auto& npad = -        sm.GetService<Service::HID::Hid>("hid") +        system.ServiceManager() +            .GetService<Service::HID::Hid>("hid")              ->GetAppletResource()              ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad); @@ -79,10 +76,10 @@ bool IsControllerCompatible(Settings::ControllerType controller_type,  QtControllerSelectorDialog::QtControllerSelectorDialog(      QWidget* parent, Core::Frontend::ControllerParameters parameters_, -    InputCommon::InputSubsystem* input_subsystem_) +    InputCommon::InputSubsystem* input_subsystem_, Core::System& system_)      : QDialog(parent), ui(std::make_unique<Ui::QtControllerSelectorDialog>()),        parameters(std::move(parameters_)), input_subsystem{input_subsystem_}, -      input_profiles(std::make_unique<InputProfiles>()) { +      input_profiles(std::make_unique<InputProfiles>(system_)), system{system_} {      ui->setupUi(this);      player_widgets = { @@ -245,7 +242,7 @@ int QtControllerSelectorDialog::exec() {  void QtControllerSelectorDialog::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()); @@ -293,7 +290,7 @@ void QtControllerSelectorDialog::CallConfigureMotionTouchDialog() {  }  void QtControllerSelectorDialog::CallConfigureInputProfileDialog() { -    ConfigureInputProfileDialog dialog(this, input_subsystem, input_profiles.get()); +    ConfigureInputProfileDialog dialog(this, input_subsystem, input_profiles.get(), system);      dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |                            Qt::WindowSystemMenuHint); @@ -533,7 +530,7 @@ void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index)      }      // Disconnect the controller first. -    UpdateController(controller_type, player_index, false); +    UpdateController(controller_type, player_index, false, system);      player.controller_type = controller_type;      player.connected = player_connected; @@ -548,7 +545,7 @@ void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index)          }          handheld.connected = player_groupboxes[player_index]->isChecked() &&                               controller_type == Settings::ControllerType::Handheld; -        UpdateController(Settings::ControllerType::Handheld, 8, handheld.connected); +        UpdateController(Settings::ControllerType::Handheld, 8, handheld.connected, system);      }      if (!player.connected) { @@ -560,7 +557,7 @@ void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index)      using namespace std::chrono_literals;      std::this_thread::sleep_for(60ms); -    UpdateController(controller_type, player_index, player_connected); +    UpdateController(controller_type, player_index, player_connected, system);  }  void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) { @@ -659,7 +656,8 @@ void QtControllerSelectorDialog::DisableUnsupportedPlayers() {      for (std::size_t index = max_supported_players; index < NUM_PLAYERS; ++index) {          // Disconnect any unsupported players here and disable or hide them if applicable.          Settings::values.players.GetValue()[index].connected = false; -        UpdateController(Settings::values.players.GetValue()[index].controller_type, index, false); +        UpdateController(Settings::values.players.GetValue()[index].controller_type, index, false, +                         system);          // Hide the player widgets when max_supported_controllers is less than or equal to 4.          if (max_supported_players <= 4) {              player_widgets[index]->hide(); diff --git a/src/yuzu/applets/qt_controller.h b/src/yuzu/applets/qt_controller.h index 9b57aea1a..037325f50 100644 --- a/src/yuzu/applets/qt_controller.h +++ b/src/yuzu/applets/qt_controller.h @@ -7,6 +7,7 @@  #include <array>  #include <memory>  #include <QDialog> +#include "core/core.h"  #include "core/frontend/applets/controller.h"  class GMainWindow; @@ -36,7 +37,8 @@ class QtControllerSelectorDialog final : public QDialog {  public:      explicit QtControllerSelectorDialog(QWidget* parent,                                          Core::Frontend::ControllerParameters parameters_, -                                        InputCommon::InputSubsystem* input_subsystem_); +                                        InputCommon::InputSubsystem* input_subsystem_, +                                        Core::System& system_);      ~QtControllerSelectorDialog() override;      int exec() override; @@ -103,6 +105,8 @@ private:      std::unique_ptr<InputProfiles> input_profiles; +    Core::System& system; +      // This is true if and only if all parameters are met. Otherwise, this is false.      // This determines whether the "OK" button can be clicked to exit the applet.      bool parameters_met{false}; diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 8b9e186b0..c75f5e1ee 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -42,7 +42,7 @@  #include "yuzu/bootmanager.h"  #include "yuzu/main.h" -EmuThread::EmuThread() = default; +EmuThread::EmuThread(Core::System& system_) : system{system_} {}  EmuThread::~EmuThread() = default; @@ -51,7 +51,6 @@ void EmuThread::run() {      MicroProfileOnThreadCreate(name.c_str());      Common::SetCurrentThreadName(name.c_str()); -    auto& system = Core::System::GetInstance();      auto& gpu = system.GPU();      auto stop_token = stop_source.get_token(); @@ -285,8 +284,10 @@ static Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow*  }  GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_, -                             std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_) -    : QWidget(parent), emu_thread(emu_thread_), input_subsystem{std::move(input_subsystem_)} { +                             std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_, +                             Core::System& system_) +    : QWidget(parent), +      emu_thread(emu_thread_), input_subsystem{std::move(input_subsystem_)}, system{system_} {      setWindowTitle(QStringLiteral("yuzu %1 | %2-%3")                         .arg(QString::fromUtf8(Common::g_build_name),                              QString::fromUtf8(Common::g_scm_branch), @@ -629,8 +630,7 @@ void GRenderWindow::ReleaseRenderTarget() {  }  void GRenderWindow::CaptureScreenshot(u32 res_scale, const QString& screenshot_path) { -    auto& renderer = Core::System::GetInstance().Renderer(); - +    VideoCore::RendererBase& renderer = system.Renderer();      if (res_scale == 0) {          res_scale = VideoCore::GetResolutionScaleFactor(renderer);      } diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h index 54c4e2142..8d7ab8c2e 100644 --- a/src/yuzu/bootmanager.h +++ b/src/yuzu/bootmanager.h @@ -34,13 +34,14 @@ enum class MouseButton;  namespace VideoCore {  enum class LoadCallbackStage; -} +class RendererBase; +} // namespace VideoCore  class EmuThread final : public QThread {      Q_OBJECT  public: -    explicit EmuThread(); +    explicit EmuThread(Core::System& system_);      ~EmuThread() override;      /** @@ -101,6 +102,7 @@ private:      std::condition_variable_any running_cv;      Common::Event running_wait{};      std::atomic_bool running_guard{false}; +    Core::System& system;  signals:      /** @@ -131,7 +133,8 @@ class GRenderWindow : public QWidget, public Core::Frontend::EmuWindow {  public:      explicit GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_, -                           std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_); +                           std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_, +                           Core::System& system_);      ~GRenderWindow() override;      // EmuWindow implementation. @@ -232,6 +235,8 @@ private:      std::array<std::size_t, 16> touch_ids{}; +    Core::System& system; +  protected:      void showEvent(QShowEvent* event) override;      bool eventFilter(QObject* object, QEvent* event) override; diff --git a/src/yuzu/compatdb.cpp b/src/yuzu/compatdb.cpp index a470056ef..2442bb3c3 100644 --- a/src/yuzu/compatdb.cpp +++ b/src/yuzu/compatdb.cpp @@ -8,14 +8,13 @@  #include <QtConcurrent/qtconcurrentrun.h>  #include "common/logging/log.h"  #include "common/telemetry.h" -#include "core/core.h"  #include "core/telemetry_session.h"  #include "ui_compatdb.h"  #include "yuzu/compatdb.h" -CompatDB::CompatDB(QWidget* parent) +CompatDB::CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent)      : QWizard(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), -      ui{std::make_unique<Ui::CompatDB>()} { +      ui{std::make_unique<Ui::CompatDB>()}, telemetry_session{telemetry_session_} {      ui->setupUi(this);      connect(ui->radioButton_Perfect, &QRadioButton::clicked, this, &CompatDB::EnableNext);      connect(ui->radioButton_Great, &QRadioButton::clicked, this, &CompatDB::EnableNext); @@ -53,16 +52,15 @@ void CompatDB::Submit() {      case CompatDBPage::Final:          back();          LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); -        Core::System::GetInstance().TelemetrySession().AddField( -            Common::Telemetry::FieldType::UserFeedback, "Compatibility", -            compatibility->checkedId()); +        telemetry_session.AddField(Common::Telemetry::FieldType::UserFeedback, "Compatibility", +                                   compatibility->checkedId());          button(NextButton)->setEnabled(false);          button(NextButton)->setText(tr("Submitting"));          button(CancelButton)->setVisible(false); -        testcase_watcher.setFuture(QtConcurrent::run( -            [] { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); })); +        testcase_watcher.setFuture( +            QtConcurrent::run([this] { return telemetry_session.SubmitTestcase(); }));          break;      default:          LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); diff --git a/src/yuzu/compatdb.h b/src/yuzu/compatdb.h index 5381f67f7..e2b2522bd 100644 --- a/src/yuzu/compatdb.h +++ b/src/yuzu/compatdb.h @@ -7,6 +7,7 @@  #include <memory>  #include <QFutureWatcher>  #include <QWizard> +#include "core/telemetry_session.h"  namespace Ui {  class CompatDB; @@ -16,7 +17,7 @@ class CompatDB : public QWizard {      Q_OBJECT  public: -    explicit CompatDB(QWidget* parent = nullptr); +    explicit CompatDB(Core::TelemetrySession& telemetry_session_, QWidget* parent = nullptr);      ~CompatDB();  private: @@ -27,4 +28,6 @@ private:      void Submit();      void OnTestcaseSubmitted();      void EnableNext(); + +    Core::TelemetrySession& telemetry_session;  }; diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index eb941ce02..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); @@ -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..7ddfd822b 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(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..7b503ff48 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(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; + +    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..a232e8970 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..ae4e389f6 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(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; + +    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..e22f6166c 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..3811fd602 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(Core::System& system_, QWidget* parent = nullptr);      ~ConfigureCpuDebug() override;      void ApplyConfiguration(); @@ -27,4 +31,6 @@ private:      void SetConfiguration();      std::unique_ptr<Ui::ConfigureCpuDebug> ui; + +    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..f67a3d723 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..89eb9d76c 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(Core::System& system_, QWidget* parent = nullptr);      ~ConfigureDebug() override;      void ApplyConfiguration(); @@ -27,4 +31,6 @@ private:      void SetConfiguration();      std::unique_ptr<Ui::ConfigureDebug> ui; + +    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..03f266adf 100644 --- a/src/yuzu/configuration/configure_debug_tab.cpp +++ b/src/yuzu/configuration/configure_debug_tab.cpp @@ -2,21 +2,30 @@  // 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), +      ui(new Ui::ConfigureDebugTab), system{system_}, 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..9cf309a83 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(Core::System& system_, QWidget* parent = nullptr);      ~ConfigureDebugTab() override;      void ApplyConfiguration(); @@ -29,4 +36,9 @@ private:      void SetConfiguration();      std::unique_ptr<Ui::ConfigureDebugTab> ui; + +    Core::System& system; + +    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..759625ef7 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(new 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..70f067ea7 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..6f8957280 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(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; + +    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..cb4df429c 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..d0dddf864 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(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{}; + +    Core::System& system;  }; diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index 1a12cfa4d..451d86859 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"> diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index bfd464061..de2d669b4 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(Core::System& system_, QWidget* parent) +    : QWidget(parent), ui(new 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..eee5343fb 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(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; + +    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_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_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 cc15d36c2..7020d2964 100644 --- a/src/yuzu/configuration/configure_network.cpp +++ b/src/yuzu/configuration/configure_network.cpp @@ -10,8 +10,8 @@  #include "ui_configure_network.h"  #include "yuzu/configuration/configure_network.h" -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->network_interface->addItem(tr("None")); @@ -33,7 +33,7 @@ void ConfigureNetwork::RetranslateUi() {  }  void ConfigureNetwork::SetConfiguration() { -    const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); +    const bool runtime_lock = !system.IsPoweredOn();      const std::string& network_interface = Settings::values.network_interface.GetValue(); diff --git a/src/yuzu/configuration/configure_network.h b/src/yuzu/configuration/configure_network.h index 028fd4acc..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(); @@ -26,4 +26,6 @@ private:      void SetConfiguration();      std::unique_ptr<Ui::ConfigureNetwork> ui; + +    const Core::System& system;  }; diff --git a/src/yuzu/configuration/configure_network.ui b/src/yuzu/configuration/configure_network.ui index 9a79262f0..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"> 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..c8de8e2ff 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(new 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 136614bf8..2ba65c638 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) +ConfigureProfileManager::ConfigureProfileManager(Core::System& system_, QWidget* parent)      : QWidget(parent), ui(new Ui::ConfigureProfileManager), -      profile_manager(std::make_unique<Service::Account::ProfileManager>()) { +      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..afd9b3679 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(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; + +    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..a405e05ca 100644 --- a/src/yuzu/configuration/configure_system.cpp +++ b/src/yuzu/configuration/configure_system.cpp @@ -17,7 +17,8 @@  #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(new 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_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 9d7d51126..d01895bf2 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(new 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;  }; diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index bdfda6c54..1f41c46c4 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp @@ -89,20 +89,20 @@ std::size_t WaitTreeItem::Row() const {      return row;  } -std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList() { +std::vector<std::unique_ptr<WaitTreeThread>> WaitTreeItem::MakeThreadItemList( +    Core::System& system) {      std::vector<std::unique_ptr<WaitTreeThread>> item_list;      std::size_t row = 0;      auto add_threads = [&](const std::vector<Kernel::KThread*>& threads) {          for (std::size_t i = 0; i < threads.size(); ++i) {              if (threads[i]->GetThreadTypeForDebugging() == Kernel::ThreadType::User) { -                item_list.push_back(std::make_unique<WaitTreeThread>(*threads[i])); +                item_list.push_back(std::make_unique<WaitTreeThread>(*threads[i], system));                  item_list.back()->row = row;              }              ++row;          }      }; -    const auto& system = Core::System::GetInstance();      add_threads(system.GlobalSchedulerContext().GetThreadList());      return item_list; @@ -115,9 +115,10 @@ QString WaitTreeText::GetText() const {      return text;  } -WaitTreeMutexInfo::WaitTreeMutexInfo(VAddr mutex_address, const Kernel::KHandleTable& handle_table) -    : mutex_address(mutex_address) { -    mutex_value = Core::System::GetInstance().Memory().Read32(mutex_address); +WaitTreeMutexInfo::WaitTreeMutexInfo(VAddr mutex_address, const Kernel::KHandleTable& handle_table, +                                     Core::System& system_) +    : mutex_address(mutex_address), system{system_} { +    mutex_value = system.Memory().Read32(mutex_address);      owner_handle = static_cast<Kernel::Handle>(mutex_value & Kernel::Svc::HandleWaitMask);      owner = handle_table.GetObject<Kernel::KThread>(owner_handle).GetPointerUnsafe();  } @@ -136,12 +137,13 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeMutexInfo::GetChildren() cons      list.push_back(std::make_unique<WaitTreeText>(          tr("owner handle: 0x%1").arg(owner_handle, 8, 16, QLatin1Char{'0'})));      if (owner != nullptr) { -        list.push_back(std::make_unique<WaitTreeThread>(*owner)); +        list.push_back(std::make_unique<WaitTreeThread>(*owner, system));      }      return list;  } -WaitTreeCallstack::WaitTreeCallstack(const Kernel::KThread& thread) : thread(thread) {} +WaitTreeCallstack::WaitTreeCallstack(const Kernel::KThread& thread, Core::System& system_) +    : thread(thread), system{system_} {}  WaitTreeCallstack::~WaitTreeCallstack() = default;  QString WaitTreeCallstack::GetText() const { @@ -159,8 +161,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeCallstack::GetChildren() cons          return list;      } -    auto backtrace = Core::ARM_Interface::GetBacktraceFromContext(Core::System::GetInstance(), -                                                                  thread.GetContext64()); +    auto backtrace = Core::ARM_Interface::GetBacktraceFromContext(system, thread.GetContext64());      for (auto& entry : backtrace) {          std::string s = fmt::format("{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, @@ -172,8 +173,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeCallstack::GetChildren() cons  }  WaitTreeSynchronizationObject::WaitTreeSynchronizationObject( -    const Kernel::KSynchronizationObject& o) -    : object(o) {} +    const Kernel::KSynchronizationObject& o, Core::System& system_) +    : object(o), system{system_} {}  WaitTreeSynchronizationObject::~WaitTreeSynchronizationObject() = default;  WaitTreeExpandableItem::WaitTreeExpandableItem() = default; @@ -191,16 +192,18 @@ QString WaitTreeSynchronizationObject::GetText() const {  }  std::unique_ptr<WaitTreeSynchronizationObject> WaitTreeSynchronizationObject::make( -    const Kernel::KSynchronizationObject& object) { +    const Kernel::KSynchronizationObject& object, Core::System& system) {      const auto type =          static_cast<Kernel::KClassTokenGenerator::ObjectType>(object.GetTypeObj().GetClassToken());      switch (type) {      case Kernel::KClassTokenGenerator::ObjectType::KReadableEvent: -        return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::KReadableEvent&>(object)); +        return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::KReadableEvent&>(object), +                                               system);      case Kernel::KClassTokenGenerator::ObjectType::KThread: -        return std::make_unique<WaitTreeThread>(static_cast<const Kernel::KThread&>(object)); +        return std::make_unique<WaitTreeThread>(static_cast<const Kernel::KThread&>(object), +                                                system);      default: -        return std::make_unique<WaitTreeSynchronizationObject>(object); +        return std::make_unique<WaitTreeSynchronizationObject>(object, system);      }  } @@ -211,15 +214,15 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeSynchronizationObject::GetChi      if (threads.empty()) {          list.push_back(std::make_unique<WaitTreeText>(tr("waited by no thread")));      } else { -        list.push_back(std::make_unique<WaitTreeThreadList>(std::move(threads))); +        list.push_back(std::make_unique<WaitTreeThreadList>(std::move(threads), system));      }      return list;  }  WaitTreeObjectList::WaitTreeObjectList(const std::vector<Kernel::KSynchronizationObject*>& list, -                                       bool w_all) -    : object_list(list), wait_all(w_all) {} +                                       bool w_all, Core::System& system_) +    : object_list(list), wait_all(w_all), system{system_} {}  WaitTreeObjectList::~WaitTreeObjectList() = default; @@ -231,13 +234,14 @@ QString WaitTreeObjectList::GetText() const {  std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeObjectList::GetChildren() const {      std::vector<std::unique_ptr<WaitTreeItem>> list(object_list.size()); -    std::transform(object_list.begin(), object_list.end(), list.begin(), -                   [](const auto& t) { return WaitTreeSynchronizationObject::make(*t); }); +    std::transform(object_list.begin(), object_list.end(), list.begin(), [this](const auto& t) { +        return WaitTreeSynchronizationObject::make(*t, system); +    });      return list;  } -WaitTreeThread::WaitTreeThread(const Kernel::KThread& thread) -    : WaitTreeSynchronizationObject(thread) {} +WaitTreeThread::WaitTreeThread(const Kernel::KThread& thread, Core::System& system_) +    : WaitTreeSynchronizationObject(thread, system_), system{system_} {}  WaitTreeThread::~WaitTreeThread() = default;  QString WaitTreeThread::GetText() const { @@ -360,7 +364,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {      const VAddr mutex_wait_address = thread.GetMutexWaitAddressForDebugging();      if (mutex_wait_address != 0) {          const auto& handle_table = thread.GetOwnerProcess()->GetHandleTable(); -        list.push_back(std::make_unique<WaitTreeMutexInfo>(mutex_wait_address, handle_table)); +        list.push_back( +            std::make_unique<WaitTreeMutexInfo>(mutex_wait_address, handle_table, system));      } else {          list.push_back(std::make_unique<WaitTreeText>(tr("not waiting for mutex")));      } @@ -369,20 +374,20 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {          thread.GetWaitReasonForDebugging() ==              Kernel::ThreadWaitReasonForDebugging::Synchronization) {          list.push_back(std::make_unique<WaitTreeObjectList>(thread.GetWaitObjectsForDebugging(), -                                                            thread.IsCancellable())); +                                                            thread.IsCancellable(), system));      } -    list.push_back(std::make_unique<WaitTreeCallstack>(thread)); +    list.push_back(std::make_unique<WaitTreeCallstack>(thread, system));      return list;  } -WaitTreeEvent::WaitTreeEvent(const Kernel::KReadableEvent& object) -    : WaitTreeSynchronizationObject(object) {} +WaitTreeEvent::WaitTreeEvent(const Kernel::KReadableEvent& object, Core::System& system_) +    : WaitTreeSynchronizationObject(object, system_) {}  WaitTreeEvent::~WaitTreeEvent() = default; -WaitTreeThreadList::WaitTreeThreadList(std::vector<Kernel::KThread*>&& list) -    : thread_list(std::move(list)) {} +WaitTreeThreadList::WaitTreeThreadList(std::vector<Kernel::KThread*>&& list, Core::System& system_) +    : thread_list(std::move(list)), system{system_} {}  WaitTreeThreadList::~WaitTreeThreadList() = default;  QString WaitTreeThreadList::GetText() const { @@ -392,11 +397,12 @@ QString WaitTreeThreadList::GetText() const {  std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThreadList::GetChildren() const {      std::vector<std::unique_ptr<WaitTreeItem>> list(thread_list.size());      std::transform(thread_list.begin(), thread_list.end(), list.begin(), -                   [](const auto& t) { return std::make_unique<WaitTreeThread>(*t); }); +                   [this](const auto& t) { return std::make_unique<WaitTreeThread>(*t, system); });      return list;  } -WaitTreeModel::WaitTreeModel(QObject* parent) : QAbstractItemModel(parent) {} +WaitTreeModel::WaitTreeModel(Core::System& system_, QObject* parent) +    : QAbstractItemModel(parent), system{system_} {}  WaitTreeModel::~WaitTreeModel() = default;  QModelIndex WaitTreeModel::index(int row, int column, const QModelIndex& parent) const { @@ -455,10 +461,11 @@ void WaitTreeModel::ClearItems() {  }  void WaitTreeModel::InitItems() { -    thread_items = WaitTreeItem::MakeThreadItemList(); +    thread_items = WaitTreeItem::MakeThreadItemList(system);  } -WaitTreeWidget::WaitTreeWidget(QWidget* parent) : QDockWidget(tr("&Wait Tree"), parent) { +WaitTreeWidget::WaitTreeWidget(Core::System& system_, QWidget* parent) +    : QDockWidget(tr("&Wait Tree"), parent), system{system_} {      setObjectName(QStringLiteral("WaitTreeWidget"));      view = new QTreeView(this);      view->setHeaderHidden(true); @@ -469,7 +476,7 @@ WaitTreeWidget::WaitTreeWidget(QWidget* parent) : QDockWidget(tr("&Wait Tree"),  WaitTreeWidget::~WaitTreeWidget() = default;  void WaitTreeWidget::OnDebugModeEntered() { -    if (!Core::System::GetInstance().IsPoweredOn()) +    if (!system.IsPoweredOn())          return;      model->InitItems();      view->setModel(model); @@ -483,7 +490,7 @@ void WaitTreeWidget::OnDebugModeLeft() {  }  void WaitTreeWidget::OnEmulationStarting(EmuThread* emu_thread) { -    model = new WaitTreeModel(this); +    model = new WaitTreeModel(system, this);      view->setModel(model);      setEnabled(false);  } diff --git a/src/yuzu/debugger/wait_tree.h b/src/yuzu/debugger/wait_tree.h index d450345df..ea4d2e299 100644 --- a/src/yuzu/debugger/wait_tree.h +++ b/src/yuzu/debugger/wait_tree.h @@ -18,6 +18,10 @@  class EmuThread; +namespace Core { +class System; +} +  namespace Kernel {  class KHandleTable;  class KReadableEvent; @@ -42,7 +46,7 @@ public:      WaitTreeItem* Parent() const;      const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const;      std::size_t Row() const; -    static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(); +    static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(Core::System& system);  private:      std::size_t row; @@ -75,7 +79,8 @@ public:  class WaitTreeMutexInfo : public WaitTreeExpandableItem {      Q_OBJECT  public: -    explicit WaitTreeMutexInfo(VAddr mutex_address, const Kernel::KHandleTable& handle_table); +    explicit WaitTreeMutexInfo(VAddr mutex_address, const Kernel::KHandleTable& handle_table, +                               Core::System& system_);      ~WaitTreeMutexInfo() override;      QString GetText() const override; @@ -86,12 +91,14 @@ private:      u32 mutex_value{};      Kernel::Handle owner_handle{};      Kernel::KThread* owner{}; + +    Core::System& system;  };  class WaitTreeCallstack : public WaitTreeExpandableItem {      Q_OBJECT  public: -    explicit WaitTreeCallstack(const Kernel::KThread& thread); +    explicit WaitTreeCallstack(const Kernel::KThread& thread, Core::System& system_);      ~WaitTreeCallstack() override;      QString GetText() const override; @@ -99,27 +106,34 @@ public:  private:      const Kernel::KThread& thread; + +    Core::System& system;  };  class WaitTreeSynchronizationObject : public WaitTreeExpandableItem {      Q_OBJECT  public: -    explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object); +    explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object, +                                           Core::System& system_);      ~WaitTreeSynchronizationObject() override;      static std::unique_ptr<WaitTreeSynchronizationObject> make( -        const Kernel::KSynchronizationObject& object); +        const Kernel::KSynchronizationObject& object, Core::System& system);      QString GetText() const override;      std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;  protected:      const Kernel::KSynchronizationObject& object; + +private: +    Core::System& system;  };  class WaitTreeObjectList : public WaitTreeExpandableItem {      Q_OBJECT  public: -    WaitTreeObjectList(const std::vector<Kernel::KSynchronizationObject*>& list, bool wait_all); +    WaitTreeObjectList(const std::vector<Kernel::KSynchronizationObject*>& list, bool wait_all, +                       Core::System& system_);      ~WaitTreeObjectList() override;      QString GetText() const override; @@ -128,30 +142,35 @@ public:  private:      const std::vector<Kernel::KSynchronizationObject*>& object_list;      bool wait_all; + +    Core::System& system;  };  class WaitTreeThread : public WaitTreeSynchronizationObject {      Q_OBJECT  public: -    explicit WaitTreeThread(const Kernel::KThread& thread); +    explicit WaitTreeThread(const Kernel::KThread& thread, Core::System& system_);      ~WaitTreeThread() override;      QString GetText() const override;      QColor GetColor() const override;      std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; + +private: +    Core::System& system;  };  class WaitTreeEvent : public WaitTreeSynchronizationObject {      Q_OBJECT  public: -    explicit WaitTreeEvent(const Kernel::KReadableEvent& object); +    explicit WaitTreeEvent(const Kernel::KReadableEvent& object, Core::System& system_);      ~WaitTreeEvent() override;  };  class WaitTreeThreadList : public WaitTreeExpandableItem {      Q_OBJECT  public: -    explicit WaitTreeThreadList(std::vector<Kernel::KThread*>&& list); +    explicit WaitTreeThreadList(std::vector<Kernel::KThread*>&& list, Core::System& system_);      ~WaitTreeThreadList() override;      QString GetText() const override; @@ -159,13 +178,15 @@ public:  private:      std::vector<Kernel::KThread*> thread_list; + +    Core::System& system;  };  class WaitTreeModel : public QAbstractItemModel {      Q_OBJECT  public: -    explicit WaitTreeModel(QObject* parent = nullptr); +    explicit WaitTreeModel(Core::System& system_, QObject* parent = nullptr);      ~WaitTreeModel() override;      QVariant data(const QModelIndex& index, int role) const override; @@ -179,13 +200,15 @@ public:  private:      std::vector<std::unique_ptr<WaitTreeThread>> thread_items; + +    Core::System& system;  };  class WaitTreeWidget : public QDockWidget {      Q_OBJECT  public: -    explicit WaitTreeWidget(QWidget* parent = nullptr); +    explicit WaitTreeWidget(Core::System& system_, QWidget* parent = nullptr);      ~WaitTreeWidget() override;  public slots: @@ -198,4 +221,6 @@ public slots:  private:      QTreeView* view;      WaitTreeModel* model; + +    Core::System& system;  }; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 552c2cc63..056f7da36 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -171,7 +171,7 @@ void GMainWindow::ShowTelemetryCallout() {             "<br/><br/>Would you like to share your usage data with us?");      if (QMessageBox::question(this, tr("Telemetry"), telemetry_message) != QMessageBox::Yes) {          Settings::values.enable_telemetry = false; -        Core::System::GetInstance().ApplySettings(); +        system.ApplySettings();      }  } @@ -190,9 +190,10 @@ static void RemoveCachedContents() {      Common::FS::RemoveDirRecursively(offline_system_data);  } -GMainWindow::GMainWindow() -    : input_subsystem{std::make_shared<InputCommon::InputSubsystem>()}, -      config{std::make_unique<Config>()}, vfs{std::make_shared<FileSys::RealVfsFilesystem>()}, +GMainWindow::GMainWindow(Core::System& system_) +    : input_subsystem{std::make_shared<InputCommon::InputSubsystem>()}, system{system_}, +      config{std::make_unique<Config>(system_)}, +      vfs{std::make_shared<FileSys::RealVfsFilesystem>()},        provider{std::make_unique<FileSys::ManualContentProvider>()} {      Common::Log::Initialize();      LoadTranslation(); @@ -255,11 +256,10 @@ GMainWindow::GMainWindow()      show(); -    Core::System::GetInstance().SetContentProvider( -        std::make_unique<FileSys::ContentProviderUnion>()); -    Core::System::GetInstance().RegisterContentProvider( -        FileSys::ContentProviderUnionSlot::FrontendManual, provider.get()); -    Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs); +    system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); +    system.RegisterContentProvider(FileSys::ContentProviderUnionSlot::FrontendManual, +                                   provider.get()); +    system.GetFileSystemController().CreateFactories(*vfs);      // Remove cached contents generated during the previous session      RemoveCachedContents(); @@ -410,7 +410,7 @@ void GMainWindow::RegisterMetaTypes() {  void GMainWindow::ControllerSelectorReconfigureControllers(      const Core::Frontend::ControllerParameters& parameters) { -    QtControllerSelectorDialog dialog(this, parameters, input_subsystem.get()); +    QtControllerSelectorDialog dialog(this, parameters, input_subsystem.get(), system);      dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |                            Qt::WindowTitleHint | Qt::WindowSystemMenuHint); @@ -420,7 +420,7 @@ void GMainWindow::ControllerSelectorReconfigureControllers(      emit ControllerSelectorReconfigureFinished();      // Don't forget to apply settings. -    Core::System::GetInstance().ApplySettings(); +    system.ApplySettings();      config->Save();      UpdateStatusButtons(); @@ -454,8 +454,8 @@ void GMainWindow::SoftwareKeyboardInitialize(          return;      } -    software_keyboard = new QtSoftwareKeyboardDialog(render_window, Core::System::GetInstance(), -                                                     is_inline, std::move(initialize_parameters)); +    software_keyboard = new QtSoftwareKeyboardDialog(render_window, system, is_inline, +                                                     std::move(initialize_parameters));      if (is_inline) {          connect( @@ -566,7 +566,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,          return;      } -    QtNXWebEngineView web_browser_view(this, Core::System::GetInstance(), input_subsystem.get()); +    QtNXWebEngineView web_browser_view(this, system, input_subsystem.get());      ui.action_Pause->setEnabled(false);      ui.action_Restart->setEnabled(false); @@ -698,7 +698,7 @@ void GMainWindow::InitializeWidgets() {  #ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING      ui.action_Report_Compatibility->setVisible(true);  #endif -    render_window = new GRenderWindow(this, emu_thread.get(), input_subsystem); +    render_window = new GRenderWindow(this, emu_thread.get(), input_subsystem, system);      render_window->hide();      game_list = new GameList(vfs, provider.get(), this); @@ -767,14 +767,14 @@ void GMainWindow::InitializeWidgets() {                                   tr("Handheld controller can't be used on docked mode. Pro "                                      "controller will be selected."));              controller_type = Settings::ControllerType::ProController; -            ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get()); +            ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), system);              configure_dialog.ApplyConfiguration();              controller_dialog->refreshConfiguration();          }          Settings::values.use_docked_mode.SetValue(!is_docked);          dock_status_button->setChecked(!is_docked); -        OnDockedModeChanged(is_docked, !is_docked); +        OnDockedModeChanged(is_docked, !is_docked, system);      });      dock_status_button->setText(tr("DOCK"));      dock_status_button->setCheckable(true); @@ -798,7 +798,7 @@ void GMainWindow::InitializeWidgets() {          }          } -        Core::System::GetInstance().ApplySettings(); +        system.ApplySettings();          UpdateGPUAccuracyButton();      });      UpdateGPUAccuracyButton(); @@ -826,7 +826,7 @@ void GMainWindow::InitializeWidgets() {              Settings::values.renderer_backend.SetValue(Settings::RendererBackend::OpenGL);          } -        Core::System::GetInstance().ApplySettings(); +        system.ApplySettings();      });      statusBar()->insertPermanentWidget(0, renderer_status_button); @@ -843,7 +843,7 @@ void GMainWindow::InitializeDebugWidgets() {      debug_menu->addAction(microProfileDialog->toggleViewAction());  #endif -    waitTreeWidget = new WaitTreeWidget(this); +    waitTreeWidget = new WaitTreeWidget(system, this);      addDockWidget(Qt::LeftDockWidgetArea, waitTreeWidget);      waitTreeWidget->hide();      debug_menu->addAction(waitTreeWidget->toggleViewAction()); @@ -946,7 +946,7 @@ void GMainWindow::InitializeHotkeys() {          });      connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Restart Emulation"), this),              &QShortcut::activated, this, [this] { -                if (!Core::System::GetInstance().IsPoweredOn()) { +                if (!system.IsPoweredOn()) {                      return;                  }                  BootGame(game_path); @@ -1002,7 +1002,7 @@ void GMainWindow::InitializeHotkeys() {                  Settings::values.use_docked_mode.SetValue(                      !Settings::values.use_docked_mode.GetValue());                  OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(), -                                    Settings::values.use_docked_mode.GetValue()); +                                    Settings::values.use_docked_mode.GetValue(), system);                  dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());              });      connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Mute Audio"), this), @@ -1232,7 +1232,6 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p          return false;      } -    Core::System& system{Core::System::GetInstance()};      system.SetFilesystem(vfs);      system.SetAppletFrontendSet({ @@ -1342,7 +1341,6 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      last_filename_booted = filename; -    auto& system = Core::System::GetInstance();      const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData());      const auto loader = Loader::GetLoader(system, v_file, program_id, program_index); @@ -1353,7 +1351,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t          const auto config_file_name = title_id == 0                                            ? Common::FS::PathToUTF8String(file_path.filename())                                            : fmt::format("{:016X}", title_id); -        Config per_game_config(config_file_name, Config::ConfigType::PerGameConfig); +        Config per_game_config(system, config_file_name, Config::ConfigType::PerGameConfig);      }      ConfigureVibration::SetAllVibrationDevices(); @@ -1376,7 +1374,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t          return;      // Create and start the emulation thread -    emu_thread = std::make_unique<EmuThread>(); +    emu_thread = std::make_unique<EmuThread>(system);      emit EmulationStarting(emu_thread.get());      emu_thread->start(); @@ -1421,7 +1419,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t      std::string title_version;      const auto res = system.GetGameName(title_name); -    const auto metadata = [&system, title_id] { +    const auto metadata = [this, title_id] {          const FileSys::PatchManager pm(title_id, system.GetFileSystemController(),                                         system.GetContentProvider());          return pm.GetControlMetadata(); @@ -1560,9 +1558,8 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target                                         const std::string& game_path) {      std::filesystem::path path;      QString open_target; -    auto& system = Core::System::GetInstance(); -    const auto [user_save_size, device_save_size] = [this, &game_path, &program_id, &system] { +    const auto [user_save_size, device_save_size] = [this, &game_path, &program_id] {          const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),                                         system.GetContentProvider()};          const auto control = pm.GetControlMetadata().first; @@ -1748,7 +1745,7 @@ void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryT  }  void GMainWindow::RemoveBaseContent(u64 program_id, const QString& entry_type) { -    const auto& fs_controller = Core::System::GetInstance().GetFileSystemController(); +    const auto& fs_controller = system.GetFileSystemController();      const auto res = fs_controller.GetUserNANDContents()->RemoveExistingEntry(program_id) ||                       fs_controller.GetSDMCContents()->RemoveExistingEntry(program_id); @@ -1764,7 +1761,7 @@ void GMainWindow::RemoveBaseContent(u64 program_id, const QString& entry_type) {  void GMainWindow::RemoveUpdateContent(u64 program_id, const QString& entry_type) {      const auto update_id = program_id | 0x800; -    const auto& fs_controller = Core::System::GetInstance().GetFileSystemController(); +    const auto& fs_controller = system.GetFileSystemController();      const auto res = fs_controller.GetUserNANDContents()->RemoveExistingEntry(update_id) ||                       fs_controller.GetSDMCContents()->RemoveExistingEntry(update_id); @@ -1779,8 +1776,8 @@ void GMainWindow::RemoveUpdateContent(u64 program_id, const QString& entry_type)  void GMainWindow::RemoveAddOnContent(u64 program_id, const QString& entry_type) {      u32 count{}; -    const auto& fs_controller = Core::System::GetInstance().GetFileSystemController(); -    const auto dlc_entries = Core::System::GetInstance().GetContentProvider().ListEntriesFilter( +    const auto& fs_controller = system.GetFileSystemController(); +    const auto dlc_entries = system.GetContentProvider().ListEntriesFilter(          FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);      for (const auto& entry : dlc_entries) { @@ -1918,7 +1915,6 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa                                  "cancelled the operation."));      }; -    auto& system = Core::System::GetInstance();      const auto loader = Loader::GetLoader(system, vfs->OpenFile(game_path, FileSys::Mode::Read));      if (loader == nullptr) {          failed(); @@ -2086,7 +2082,7 @@ void GMainWindow::OnGameListShowList(bool show) {  void GMainWindow::OnGameListOpenPerGameProperties(const std::string& file) {      u64 title_id{};      const auto v_file = Core::GetGameFileFromPath(vfs, file); -    const auto loader = Loader::GetLoader(Core::System::GetInstance(), v_file); +    const auto loader = Loader::GetLoader(system, v_file);      if (loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) {          QMessageBox::information(this, tr("Properties"), @@ -2300,9 +2296,8 @@ InstallResult GMainWindow::InstallNSPXCI(const QString& filename) {      if (nsp->GetStatus() != Loader::ResultStatus::Success) {          return InstallResult::Failure;      } -    const auto res = -        Core::System::GetInstance().GetFileSystemController().GetUserNANDContents()->InstallEntry( -            *nsp, true, qt_raw_copy); +    const auto res = system.GetFileSystemController().GetUserNANDContents()->InstallEntry( +        *nsp, true, qt_raw_copy);      switch (res) {      case FileSys::InstallResult::Success:          return InstallResult::Success; @@ -2382,15 +2377,11 @@ InstallResult GMainWindow::InstallNCA(const QString& filename) {      FileSys::InstallResult res;      if (index >= static_cast<s32>(FileSys::TitleType::Application)) { -        res = Core::System::GetInstance() -                  .GetFileSystemController() -                  .GetUserNANDContents() -                  ->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), true, qt_raw_copy); +        res = system.GetFileSystemController().GetUserNANDContents()->InstallEntry( +            *nca, static_cast<FileSys::TitleType>(index), true, qt_raw_copy);      } else { -        res = Core::System::GetInstance() -                  .GetFileSystemController() -                  .GetSystemNANDContents() -                  ->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), true, qt_raw_copy); +        res = system.GetFileSystemController().GetSystemNANDContents()->InstallEntry( +            *nca, static_cast<FileSys::TitleType>(index), true, qt_raw_copy);      }      if (res == FileSys::InstallResult::Success) { @@ -2452,7 +2443,6 @@ void GMainWindow::OnPauseGame() {  }  void GMainWindow::OnStopGame() { -    auto& system{Core::System::GetInstance()};      if (system.GetExitLock() && !ConfirmForceLockedExit()) {          return;      } @@ -2477,8 +2467,8 @@ void GMainWindow::OnExit() {  }  void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) { -    OverlayDialog dialog(render_window, Core::System::GetInstance(), error_code, error_text, -                         QString{}, tr("OK"), Qt::AlignLeft | Qt::AlignVCenter); +    OverlayDialog dialog(render_window, system, error_code, error_text, QString{}, tr("OK"), +                         Qt::AlignLeft | Qt::AlignVCenter);      dialog.exec();      emit ErrorDisplayFinished(); @@ -2487,7 +2477,7 @@ void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_tex  void GMainWindow::OnMenuReportCompatibility() {      if (!Settings::values.yuzu_token.GetValue().empty() &&          !Settings::values.yuzu_username.GetValue().empty()) { -        CompatDB compatdb{this}; +        CompatDB compatdb{system.TelemetrySession(), this};          compatdb.exec();      } else {          QMessageBox::critical( @@ -2653,7 +2643,8 @@ void GMainWindow::OnConfigure() {      const auto old_theme = UISettings::values.theme;      const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); -    ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get()); +    Settings::SetConfiguringGlobal(true); +    ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), system);      connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this,              &GMainWindow::OnLanguageChanged); @@ -2689,7 +2680,7 @@ void GMainWindow::OnConfigure() {          Settings::values.disabled_addons.clear(); -        config = std::make_unique<Config>(); +        config = std::make_unique<Config>(system);          UISettings::values.reset_to_defaults = false;          UISettings::values.game_dirs = std::move(old_game_dirs); @@ -2751,15 +2742,15 @@ void GMainWindow::OnConfigureTas() {  }  void GMainWindow::OnConfigurePerGame() { -    const u64 title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); +    const u64 title_id = system.CurrentProcess()->GetTitleID();      OpenPerGameConfiguration(title_id, game_path.toStdString());  }  void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file_name) {      const auto v_file = Core::GetGameFileFromPath(vfs, file_name); -    const auto& system = Core::System::GetInstance(); -    ConfigurePerGame dialog(this, title_id, file_name); +    Settings::SetConfiguringGlobal(false); +    ConfigurePerGame dialog(this, title_id, file_name, system);      dialog.LoadFromFile(v_file);      const auto result = dialog.exec(); @@ -2799,7 +2790,6 @@ void GMainWindow::OnLoadAmiibo() {  }  void GMainWindow::LoadAmiibo(const QString& filename) { -    Core::System& system{Core::System::GetInstance()};      Service::SM::ServiceManager& sm = system.ServiceManager();      auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");      if (nfc == nullptr) { @@ -2851,7 +2841,7 @@ void GMainWindow::OnToggleFilterBar() {  }  void GMainWindow::OnCaptureScreenshot() { -    const u64 title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); +    const u64 title_id = system.CurrentProcess()->GetTitleID();      const auto screenshot_path =          QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ScreenshotsDir));      const auto date = @@ -2957,7 +2947,6 @@ void GMainWindow::UpdateStatusBar() {          tas_label->clear();      } -    auto& system = Core::System::GetInstance();      auto results = system.GetAndResetPerfStats();      auto& shader_notify = system.GPU().ShaderNotify();      const int shaders_building = shader_notify.ShadersBuilding(); @@ -3120,7 +3109,7 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det          if (emu_thread) {              ShutdownGame(); -            Settings::RestoreGlobalState(Core::System::GetInstance().IsPoweredOn()); +            Settings::RestoreGlobalState(system.IsPoweredOn());              UpdateStatusButtons();          }      } else { @@ -3162,7 +3151,6 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {          const auto function = [this, &keys, &pdm] {              keys.PopulateFromPartitionData(pdm); -            auto& system = Core::System::GetInstance();              system.GetFileSystemController().CreateFactories(*vfs);              keys.DeriveETicket(pdm, system.GetContentProvider());          }; @@ -3206,7 +3194,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {          prog.close();      } -    Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs); +    system.GetFileSystemController().CreateFactories(*vfs);      if (behavior == ReinitializeKeyBehavior::Warning) {          game_list->PopulateAsync(UISettings::values.game_dirs); @@ -3274,7 +3262,7 @@ void GMainWindow::closeEvent(QCloseEvent* event) {      if (emu_thread != nullptr) {          ShutdownGame(); -        Settings::RestoreGlobalState(Core::System::GetInstance().IsPoweredOn()); +        Settings::RestoreGlobalState(system.IsPoweredOn());          UpdateStatusButtons();      } @@ -3349,7 +3337,7 @@ bool GMainWindow::ConfirmForceLockedExit() {  }  void GMainWindow::RequestGameExit() { -    auto& sm{Core::System::GetInstance().ServiceManager()}; +    auto& sm{system.ServiceManager()};      auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE");      auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE");      bool has_signalled = false; @@ -3498,7 +3486,7 @@ int main(int argc, char* argv[]) {      setlocale(LC_ALL, "C");      Core::System::InitializeGlobalInstance(); -    GMainWindow main_window; +    GMainWindow main_window{Core::System::GetInstance()};      // After settings have been loaded by GMainWindow, apply the filter      main_window.show(); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 60ce01471..6ef4e4d4e 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -107,7 +107,7 @@ class GMainWindow : public QMainWindow {  public:      void filterBarSetChecked(bool state);      void UpdateUITheme(); -    GMainWindow(); +    GMainWindow(Core::System& system_);      ~GMainWindow() override;      bool DropAction(QDropEvent* event); @@ -309,6 +309,8 @@ private:      std::unique_ptr<DiscordRPC::DiscordInterface> discord_rpc;      std::shared_ptr<InputCommon::InputSubsystem> input_subsystem; +    Core::System& system; +      GRenderWindow* render_window;      GameList* game_list;      LoadingScreen* loading_screen; | 
