From 5ab4496904b8cd5690e259173967d1cfcc01a5fe Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:04:55 +0200 Subject: [PATCH] Game Settings: Add an option to create game config using default settings Fix a potential crash on creating global config. --- rpcs3/rpcs3qt/emu_settings.cpp | 36 +++++++++++++++++-------------- rpcs3/rpcs3qt/emu_settings.h | 2 +- rpcs3/rpcs3qt/game_list_frame.cpp | 24 +++++++++++++++++---- rpcs3/rpcs3qt/settings_dialog.cpp | 4 ++-- rpcs3/rpcs3qt/settings_dialog.h | 15 +++++++------ 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index c644dc52d332..1d61803f96ab 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -91,7 +91,7 @@ bool emu_settings::Init() return true; } -void emu_settings::LoadSettings(const std::string& title_id) +void emu_settings::LoadSettings(const std::string& title_id, bool create_config_from_global) { m_title_id = title_id; @@ -113,21 +113,25 @@ void emu_settings::LoadSettings(const std::string& title_id) .arg(QString::fromStdString(default_error)), QMessageBox::Ok); } - // Add global config - const std::string global_config_path = fs::get_config_dir() + "config.yml"; - fs::file config(global_config_path, fs::read + fs::write + fs::create); - auto [global_config, global_error] = yaml_load(config.to_string()); - config.close(); - - if (global_error.empty()) + if (create_config_from_global) { - m_current_settings += global_config; - } - else - { - cfg_log.fatal("Failed to load global config %s:\n%s", global_config_path, global_error); - QMessageBox::critical(nullptr, tr("Config Error"), tr("Failed to load global config:\nFile: %0\nError: %1") - .arg(QString::fromStdString(global_config_path)).arg(QString::fromStdString(global_error)), QMessageBox::Ok); + // Add global config + const std::string global_config_path = fs::get_config_dir() + "config.yml"; + fs::g_tls_error = fs::error::ok; + fs::file config(global_config_path, fs::read + fs::create); + auto [global_config, global_error] = yaml_load(config ? "" : config.to_string()); + + if (config && global_error.empty()) + { + m_current_settings += global_config; + } + else + { + config.close(); + cfg_log.fatal("Failed to load global config %s:\n%s (%s)", global_config_path, global_error, fs::g_tls_error); + QMessageBox::critical(nullptr, tr("Config Error"), tr("Failed to load global config:\nFile: %0\nError: %1") + .arg(QString::fromStdString(global_config_path)).arg(QString::fromStdString(global_error)), QMessageBox::Ok); + } } // Add game config @@ -146,7 +150,7 @@ void emu_settings::LoadSettings(const std::string& title_id) if (!custom_config_path.empty()) { - if ((config = fs::file(custom_config_path, fs::read + fs::write))) + if (fs::file config{custom_config_path}) { auto [custom_config, custom_error] = yaml_load(config.to_string()); config.close(); diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index 61b642228032..fc25fb0c7df7 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -85,7 +85,7 @@ class emu_settings : public QObject midi_creator m_midi_creator; /** Loads the settings from path.*/ - void LoadSettings(const std::string& title_id = ""); + void LoadSettings(const std::string& title_id = "", bool create_config_from_global = true); /** Fixes all registered invalid settings after asking the user for permission.*/ void OpenCorrectionDialog(QWidget* parent = Q_NULLPTR); diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 27d87fd66b9c..1f65b7fe1ebd 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -1116,7 +1116,9 @@ void game_list_frame::ShowContextMenu(const QPoint &pos) QAction* configure = menu.addAction(gameinfo->hasCustomConfig ? tr("&Change Custom Configuration") - : tr("&Create Custom Configuration")); + : tr("&Create Custom Configuration From Gloabl Settings")); + QAction* create_game_default_config = gameinfo->hasCustomConfig ? nullptr + : menu.addAction(tr("&Create Custom Configuration From Default Settings")); QAction* pad_configure = menu.addAction(gameinfo->hasCustomPadConfig ? tr("&Change Custom Gamepad Configuration") : tr("&Create Custom Gamepad Configuration")); @@ -1422,9 +1424,11 @@ void game_list_frame::ShowContextMenu(const QPoint &pos) sys_log.notice("Booting from gamelist per context menu..."); Q_EMIT RequestBoot(gameinfo, cfg_mode::global); }); - connect(configure, &QAction::triggered, this, [this, current_game, gameinfo]() + + auto configure_l = [this, current_game, gameinfo](bool create_cfg_from_global_cfg) { - settings_dialog dlg(m_gui_settings, m_emu_settings, 0, this, ¤t_game); + settings_dialog dlg(m_gui_settings, m_emu_settings, 0, this, ¤t_game, create_cfg_from_global_cfg); + connect(&dlg, &settings_dialog::EmuSettingsApplied, [this, gameinfo]() { if (!gameinfo->hasCustomConfig) @@ -1434,8 +1438,20 @@ void game_list_frame::ShowContextMenu(const QPoint &pos) } Q_EMIT NotifyEmuSettingsChange(); }); + dlg.exec(); - }); + }; + + if (create_game_default_config) + { + connect(configure, &QAction::triggered, this, [configure_l]() { configure_l(true); }); + connect(create_game_default_config, &QAction::triggered, this, [configure_l = std::move(configure_l)]() { configure_l(false); }); + } + else + { + connect(configure, &QAction::triggered, this, [configure_l = std::move(configure_l)]() { configure_l(true); }); + } + connect(pad_configure, &QAction::triggered, this, [this, current_game, gameinfo]() { pad_settings_dialog dlg(m_gui_settings, this, ¤t_game); diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index f261247957ab..8b823200d529 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -92,7 +92,7 @@ void remove_item(QComboBox* box, int data_value, int def_value) extern const std::map g_prx_list; -settings_dialog::settings_dialog(std::shared_ptr gui_settings, std::shared_ptr emu_settings, const int& tab_index, QWidget* parent, const GameInfo* game) +settings_dialog::settings_dialog(std::shared_ptr gui_settings, std::shared_ptr emu_settings, const int& tab_index, QWidget* parent, const GameInfo* game, bool create_cfg_from_global_cfg) : QDialog(parent) , m_tab_index(tab_index) , ui(new Ui::settings_dialog) @@ -137,7 +137,7 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std if (game) { - m_emu_settings->LoadSettings(game->serial); + m_emu_settings->LoadSettings(game->serial, create_cfg_from_global_cfg); setWindowTitle(tr("Settings: [%0] %1", "Settings dialog").arg(qstr(game->serial)).arg(qstr(game->name))); } else diff --git a/rpcs3/rpcs3qt/settings_dialog.h b/rpcs3/rpcs3qt/settings_dialog.h index 29a15346befb..d218c3c8580b 100644 --- a/rpcs3/rpcs3qt/settings_dialog.h +++ b/rpcs3/rpcs3qt/settings_dialog.h @@ -21,7 +21,7 @@ class settings_dialog : public QDialog Q_OBJECT public: - explicit settings_dialog(std::shared_ptr gui_settings, std::shared_ptr emu_settings, const int& tab_index = 0, QWidget* parent = nullptr, const GameInfo* game = nullptr); + explicit settings_dialog(std::shared_ptr gui_settings, std::shared_ptr emu_settings, const int& tab_index = 0, QWidget* parent = nullptr, const GameInfo* game = nullptr, bool create_cfg_from_global_cfg = true); ~settings_dialog(); int exec() override; Q_SIGNALS: @@ -41,21 +41,24 @@ class settings_dialog : public QDialog void AddStylesheets(); void ApplyStylesheet(bool reset); QString m_current_stylesheet; + // Gpu tab QString m_old_renderer; + // Audio tab - std::array m_mics_combo; + std::array m_mics_combo{}; + // IO tab - std::array m_midi_type_combo; - std::array m_midi_device_combo; + std::array m_midi_type_comboP{}; + std::array m_midi_device_combo{}; - int m_tab_index; + int m_tab_index = 0; std::unique_ptr ui; std::shared_ptr m_gui_settings; std::shared_ptr m_emu_settings; // Discord - bool m_use_discord; + bool m_use_discord = false; QString m_discord_state; // Descriptions