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;