From 8aeb42566968053d1a74f50f8453930cfdf2c42c Mon Sep 17 00:00:00 2001 From: fearlessTobi Date: Tue, 25 May 2021 20:48:02 -0400 Subject: [PATCH 1/3] configuration: Initial work to reset all settings This commit does not compile. Initial work to add and connect a Reset to Defaults button to the configure_general tab. Co-authored-by: german77 --- src/yuzu/configuration/config.cpp | 6 ++++++ src/yuzu/configuration/config.h | 1 + src/yuzu/configuration/configure_general.cpp | 14 ++++++++++++++ src/yuzu/configuration/configure_general.h | 1 + src/yuzu/configuration/configure_general.ui | 7 +++++++ src/yuzu/main.cpp | 4 ++++ 6 files changed, 33 insertions(+) diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index eb58bfa5b..0ea508acd 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -1632,6 +1632,12 @@ void Config::Save() { SaveValues(); } +void Config::ResetDefaults() { + FS::Delete(qt_config_loc); + FS::CreateFullPath(qt_config_loc); + Reload(); +} + void Config::ReadControlPlayerValue(std::size_t player_index) { qt_config->beginGroup(QStringLiteral("Controls")); ReadPlayerValue(player_index); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index ce3355588..cd68d7b4d 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -28,6 +28,7 @@ public: void Reload(); void Save(); + void ResetDefaults(); void ReadControlPlayerValue(std::size_t player_index); void SaveControlPlayerValue(std::size_t player_index); diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 55a6a37bd..a107cd3e1 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -4,11 +4,13 @@ #include #include +#include #include "common/settings.h" #include "core/core.h" #include "ui_configure_general.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_general.h" +#include "yuzu/configuration/config.h" #include "yuzu/uisettings.h" ConfigureGeneral::ConfigureGeneral(QWidget* parent) @@ -23,6 +25,9 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent) connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit, [this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); }); } + + connect(ui->button_reset_defaults, &QPushButton::clicked, this, + &ConfigureGeneral::ResetDefaults); } ConfigureGeneral::~ConfigureGeneral() = default; @@ -49,6 +54,15 @@ void ConfigureGeneral::SetConfiguration() { } } +void ConfigureGeneral::ResetDefaults() { + QMessageBox::StandardButton answer = QMessageBox::question( + this, tr("yuzu"), tr("Are you sure you want to reset your settings?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (answer == QMessageBox::No) + return; + UISettings::values. +} + void ConfigureGeneral::ApplyConfiguration() { ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core, use_multi_core); diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index 323ffbd8f..3d8a1dae0 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -24,6 +24,7 @@ public: explicit ConfigureGeneral(QWidget* parent = nullptr); ~ConfigureGeneral() override; + void ResetDefaults(); void ApplyConfiguration(); private: diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index 2711116a2..ae8ed5ca5 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -91,6 +91,13 @@ + + + + Reset All Settings + + + diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 0f0e228b0..838bb6926 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -2593,7 +2593,11 @@ void GMainWindow::OnConfigure() { configure_dialog.ApplyConfiguration(); controller_dialog->refreshConfiguration(); } + + configure_dialog.ApplyConfiguration(); + controller_dialog->refreshConfiguration(); InitializeHotkeys(); + if (UISettings::values.theme != old_theme) { UpdateUITheme(); } From 4a3d57e469c5604631b5768c4fa917f199ce7854 Mon Sep 17 00:00:00 2001 From: lat9nq <22451773+lat9nq@users.noreply.github.com> Date: Tue, 25 May 2021 20:49:42 -0400 Subject: [PATCH 2/3] yuzu: Add settings reset button to general configuration Builds on german77's work to reset all settings back to their defaults. This include UISettings and Settings values structs, but does not affect save profiles, input profiles, and game directories. This works from a button input in configure_general. When activated, it calls a callback to close the whole configure dialog, then GMainWindow deletes the old configuration, both on disk and in memory, and reinitalizes a new one. It also resets a portion of the UI and calls the telemetry window prompt. --- src/yuzu/configuration/config.cpp | 6 --- src/yuzu/configuration/config.h | 1 - src/yuzu/configuration/configure_dialog.cpp | 6 +++ src/yuzu/configuration/configure_general.cpp | 23 ++++++++-- src/yuzu/configuration/configure_general.h | 6 +++ src/yuzu/configuration/configure_general.ui | 48 ++++++++++++++++---- src/yuzu/main.cpp | 43 ++++++++++++++++-- src/yuzu/uisettings.h | 1 + 8 files changed, 111 insertions(+), 23 deletions(-) diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 0ea508acd..eb58bfa5b 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -1632,12 +1632,6 @@ void Config::Save() { SaveValues(); } -void Config::ResetDefaults() { - FS::Delete(qt_config_loc); - FS::CreateFullPath(qt_config_loc); - Reload(); -} - void Config::ReadControlPlayerValue(std::size_t player_index) { qt_config->beginGroup(QStringLiteral("Controls")); ReadPlayerValue(player_index); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index cd68d7b4d..ce3355588 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -28,7 +28,6 @@ public: void Reload(); void Save(); - void ResetDefaults(); void ReadControlPlayerValue(std::size_t player_index); void SaveControlPlayerValue(std::size_t player_index); diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 6028135c5..167323831 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -16,6 +16,10 @@ #include "yuzu/configuration/configure_input_player.h" #include "yuzu/hotkeys.h" +static void CloseDialog(ConfigureDialog *dialog) { + dialog->close(); +} + ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, InputCommon::InputSubsystem* input_subsystem) : QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) { @@ -27,6 +31,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, ui->inputTab->Initialize(input_subsystem); + ui->generalTab->SetResetCallback(&CloseDialog, this); + SetConfiguration(); PopulateSelectionList(); diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index a107cd3e1..28aaf47be 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -3,14 +3,14 @@ // Refer to the license.txt file included. #include -#include #include +#include #include "common/settings.h" #include "core/core.h" #include "ui_configure_general.h" +#include "yuzu/configuration/config.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_general.h" -#include "yuzu/configuration/config.h" #include "yuzu/uisettings.h" ConfigureGeneral::ConfigureGeneral(QWidget* parent) @@ -46,6 +46,8 @@ void ConfigureGeneral::SetConfiguration() { ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); + ui->button_reset_defaults->setEnabled(runtime_lock); + if (Settings::IsConfiguringGlobal()) { ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue()); } else { @@ -54,13 +56,24 @@ void ConfigureGeneral::SetConfiguration() { } } +// Called to set the callback when resetting settings to defaults +void ConfigureGeneral::SetResetCallback(void (*callback)(ConfigureDialog*), + ConfigureDialog* param) { + ResetCallback = callback; + reset_callback_param = param; +} + void ConfigureGeneral::ResetDefaults() { QMessageBox::StandardButton answer = QMessageBox::question( - this, tr("yuzu"), tr("Are you sure you want to reset your settings?"), + this, tr("yuzu"), + tr("This reset all settings and remove all per-game configurations. This will not delete " + "game directories, profiles, or input profiles. Proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (answer == QMessageBox::No) return; - UISettings::values. + UISettings::values.reset_to_defaults = true; + UISettings::values.is_game_list_reload_pending.exchange(true); + (*ResetCallback)(reset_callback_param); } void ConfigureGeneral::ApplyConfiguration() { @@ -119,6 +132,8 @@ void ConfigureGeneral::SetupPerGameUI() { ui->toggle_background_pause->setVisible(false); ui->toggle_hide_mouse->setVisible(false); + ui->button_reset_defaults->setVisible(false); + ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit, Settings::values.use_frame_limit, use_frame_limit); ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core, diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index 3d8a1dae0..2a7741ad9 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -7,6 +7,8 @@ #include #include +class ConfigureDialog; + namespace ConfigurationShared { enum class CheckState; } @@ -24,6 +26,7 @@ public: explicit ConfigureGeneral(QWidget* parent = nullptr); ~ConfigureGeneral() override; + void SetResetCallback(void (*callback)(ConfigureDialog*), ConfigureDialog *param); void ResetDefaults(); void ApplyConfiguration(); @@ -35,6 +38,9 @@ private: void SetupPerGameUI(); + void (*ResetCallback)(ConfigureDialog*); + ConfigureDialog *reset_callback_param; + std::unique_ptr ui; ConfigurationShared::CheckState use_frame_limit; diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index ae8ed5ca5..bc7041090 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -6,7 +6,7 @@ 0 0 - 300 + 329 407 @@ -91,13 +91,6 @@ - - - - Reset All Settings - - - @@ -111,6 +104,45 @@ + + + + 6 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Reset All Settings + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 838bb6926..e5a2fdf8c 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -2587,14 +2587,49 @@ void GMainWindow::OnConfigure() { &GMainWindow::OnLanguageChanged); const auto result = configure_dialog.exec(); - if (result != QDialog::Accepted && !UISettings::values.configuration_applied) { + if (result != QDialog::Accepted && !UISettings::values.configuration_applied && + !UISettings::values.reset_to_defaults) { + // Runs if the user hit Cancel or closed the window, and did not ever press the Apply button + // or `Reset to Defaults` button return; } else if (result == QDialog::Accepted) { + // Only apply new changes if user hit Okay + // This is here to avoid applying changes if the user hit Apply, made some changes, then hit + // Cancel configure_dialog.ApplyConfiguration(); - controller_dialog->refreshConfiguration(); - } + } else if (UISettings::values.reset_to_defaults) { + LOG_INFO(Frontend, "Resetting all settings to defaults"); + if (!Common::FS::RemoveFile(config->GetConfigFilePath())) { + LOG_WARNING(Frontend, "Failed to remove configuration file"); + } + if (!Common::FS::RemoveDirContentsRecursively( + Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "custom")) { + LOG_WARNING(Frontend, "Failed to remove custom configuration files"); + } + if (!Common::FS::RemoveDirRecursively( + Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "game_list")) { + LOG_WARNING(Frontend, "Failed to remove game metadata cache files"); + } - configure_dialog.ApplyConfiguration(); + // Explicitly save the game directories, since reinitializing config does not do so. + QVector old_game_dirs = UISettings::values.game_dirs; + QVector old_favorited_ids = UISettings::values.favorited_ids; + + Settings::values.disabled_addons.clear(); + + config = std::make_unique(); + UISettings::values.reset_to_defaults = false; + + UISettings::values.game_dirs = old_game_dirs; + UISettings::values.favorited_ids = old_favorited_ids; + + InitializeRecentFileMenuActions(); + + SetDefaultUIGeometry(); + RestoreUIState(); + + ShowTelemetryCallout(); + } controller_dialog->refreshConfiguration(); InitializeHotkeys(); diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h index 49122ec32..cdcb83f9f 100644 --- a/src/yuzu/uisettings.h +++ b/src/yuzu/uisettings.h @@ -97,6 +97,7 @@ struct Values { bool cache_game_list; bool configuration_applied; + bool reset_to_defaults; }; extern Values values; From c17e1bd7a8df8c26ca1334faec3e41ce239a5650 Mon Sep 17 00:00:00 2001 From: lat9nq <22451773+lat9nq@users.noreply.github.com> Date: Tue, 25 May 2021 22:14:55 -0400 Subject: [PATCH 3/3] yuzu qt: Use lambda and std::function for reset callback Also makes use of std::move, and performs a clang-format cleanup. This addresses review comments. Co-authored-by: LC --- src/yuzu/configuration/configure_dialog.cpp | 6 +----- src/yuzu/configuration/configure_general.cpp | 13 +++++++------ src/yuzu/configuration/configure_general.h | 6 +++--- src/yuzu/main.cpp | 11 ++++++----- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 167323831..371bc01b1 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -16,10 +16,6 @@ #include "yuzu/configuration/configure_input_player.h" #include "yuzu/hotkeys.h" -static void CloseDialog(ConfigureDialog *dialog) { - dialog->close(); -} - ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, InputCommon::InputSubsystem* input_subsystem) : QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) { @@ -31,7 +27,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry, ui->inputTab->Initialize(input_subsystem); - ui->generalTab->SetResetCallback(&CloseDialog, this); + ui->generalTab->SetResetCallback([&] { this->close(); }); SetConfiguration(); PopulateSelectionList(); diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 28aaf47be..38edb4d8d 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include +#include #include #include #include @@ -57,10 +59,8 @@ void ConfigureGeneral::SetConfiguration() { } // Called to set the callback when resetting settings to defaults -void ConfigureGeneral::SetResetCallback(void (*callback)(ConfigureDialog*), - ConfigureDialog* param) { - ResetCallback = callback; - reset_callback_param = param; +void ConfigureGeneral::SetResetCallback(std::function callback) { + reset_callback = std::move(callback); } void ConfigureGeneral::ResetDefaults() { @@ -69,11 +69,12 @@ void ConfigureGeneral::ResetDefaults() { tr("This reset all settings and remove all per-game configurations. This will not delete " "game directories, profiles, or input profiles. Proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); - if (answer == QMessageBox::No) + if (answer == QMessageBox::No) { return; + } UISettings::values.reset_to_defaults = true; UISettings::values.is_game_list_reload_pending.exchange(true); - (*ResetCallback)(reset_callback_param); + reset_callback(); } void ConfigureGeneral::ApplyConfiguration() { diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index 2a7741ad9..a0fd52492 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include @@ -26,7 +27,7 @@ public: explicit ConfigureGeneral(QWidget* parent = nullptr); ~ConfigureGeneral() override; - void SetResetCallback(void (*callback)(ConfigureDialog*), ConfigureDialog *param); + void SetResetCallback(std::function callback); void ResetDefaults(); void ApplyConfiguration(); @@ -38,8 +39,7 @@ private: void SetupPerGameUI(); - void (*ResetCallback)(ConfigureDialog*); - ConfigureDialog *reset_callback_param; + std::function reset_callback; std::unique_ptr ui; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index e5a2fdf8c..c5dec215d 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -2611,17 +2611,18 @@ void GMainWindow::OnConfigure() { LOG_WARNING(Frontend, "Failed to remove game metadata cache files"); } - // Explicitly save the game directories, since reinitializing config does not do so. - QVector old_game_dirs = UISettings::values.game_dirs; - QVector old_favorited_ids = UISettings::values.favorited_ids; + // Explicitly save the game directories, since reinitializing config does not explicitly do + // so. + QVector old_game_dirs = std::move(UISettings::values.game_dirs); + QVector old_favorited_ids = std::move(UISettings::values.favorited_ids); Settings::values.disabled_addons.clear(); config = std::make_unique(); UISettings::values.reset_to_defaults = false; - UISettings::values.game_dirs = old_game_dirs; - UISettings::values.favorited_ids = old_favorited_ids; + UISettings::values.game_dirs = std::move(old_game_dirs); + UISettings::values.favorited_ids = std::move(old_favorited_ids); InitializeRecentFileMenuActions();