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.
This commit is contained in:
parent
8aeb425669
commit
4a3d57e469
|
@ -1632,12 +1632,6 @@ void Config::Save() {
|
||||||
SaveValues();
|
SaveValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Config::ResetDefaults() {
|
|
||||||
FS::Delete(qt_config_loc);
|
|
||||||
FS::CreateFullPath(qt_config_loc);
|
|
||||||
Reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Config::ReadControlPlayerValue(std::size_t player_index) {
|
void Config::ReadControlPlayerValue(std::size_t player_index) {
|
||||||
qt_config->beginGroup(QStringLiteral("Controls"));
|
qt_config->beginGroup(QStringLiteral("Controls"));
|
||||||
ReadPlayerValue(player_index);
|
ReadPlayerValue(player_index);
|
||||||
|
|
|
@ -28,7 +28,6 @@ public:
|
||||||
|
|
||||||
void Reload();
|
void Reload();
|
||||||
void Save();
|
void Save();
|
||||||
void ResetDefaults();
|
|
||||||
|
|
||||||
void ReadControlPlayerValue(std::size_t player_index);
|
void ReadControlPlayerValue(std::size_t player_index);
|
||||||
void SaveControlPlayerValue(std::size_t player_index);
|
void SaveControlPlayerValue(std::size_t player_index);
|
||||||
|
|
|
@ -16,6 +16,10 @@
|
||||||
#include "yuzu/configuration/configure_input_player.h"
|
#include "yuzu/configuration/configure_input_player.h"
|
||||||
#include "yuzu/hotkeys.h"
|
#include "yuzu/hotkeys.h"
|
||||||
|
|
||||||
|
static void CloseDialog(ConfigureDialog *dialog) {
|
||||||
|
dialog->close();
|
||||||
|
}
|
||||||
|
|
||||||
ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
|
ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
|
||||||
InputCommon::InputSubsystem* input_subsystem)
|
InputCommon::InputSubsystem* input_subsystem)
|
||||||
: QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) {
|
: QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) {
|
||||||
|
@ -27,6 +31,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
|
||||||
|
|
||||||
ui->inputTab->Initialize(input_subsystem);
|
ui->inputTab->Initialize(input_subsystem);
|
||||||
|
|
||||||
|
ui->generalTab->SetResetCallback(&CloseDialog, this);
|
||||||
|
|
||||||
SetConfiguration();
|
SetConfiguration();
|
||||||
PopulateSelectionList();
|
PopulateSelectionList();
|
||||||
|
|
||||||
|
|
|
@ -3,14 +3,14 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QSpinBox>
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QSpinBox>
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "ui_configure_general.h"
|
#include "ui_configure_general.h"
|
||||||
|
#include "yuzu/configuration/config.h"
|
||||||
#include "yuzu/configuration/configuration_shared.h"
|
#include "yuzu/configuration/configuration_shared.h"
|
||||||
#include "yuzu/configuration/configure_general.h"
|
#include "yuzu/configuration/configure_general.h"
|
||||||
#include "yuzu/configuration/config.h"
|
|
||||||
#include "yuzu/uisettings.h"
|
#include "yuzu/uisettings.h"
|
||||||
|
|
||||||
ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
||||||
|
@ -46,6 +46,8 @@ void ConfigureGeneral::SetConfiguration() {
|
||||||
ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue());
|
ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue());
|
||||||
ui->frame_limit->setValue(Settings::values.frame_limit.GetValue());
|
ui->frame_limit->setValue(Settings::values.frame_limit.GetValue());
|
||||||
|
|
||||||
|
ui->button_reset_defaults->setEnabled(runtime_lock);
|
||||||
|
|
||||||
if (Settings::IsConfiguringGlobal()) {
|
if (Settings::IsConfiguringGlobal()) {
|
||||||
ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue());
|
ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue());
|
||||||
} else {
|
} 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() {
|
void ConfigureGeneral::ResetDefaults() {
|
||||||
QMessageBox::StandardButton answer = QMessageBox::question(
|
QMessageBox::StandardButton answer = QMessageBox::question(
|
||||||
this, tr("yuzu"), tr("Are you sure you want to <b>reset your settings</b>?"),
|
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);
|
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
|
||||||
if (answer == QMessageBox::No)
|
if (answer == QMessageBox::No)
|
||||||
return;
|
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() {
|
void ConfigureGeneral::ApplyConfiguration() {
|
||||||
|
@ -119,6 +132,8 @@ void ConfigureGeneral::SetupPerGameUI() {
|
||||||
ui->toggle_background_pause->setVisible(false);
|
ui->toggle_background_pause->setVisible(false);
|
||||||
ui->toggle_hide_mouse->setVisible(false);
|
ui->toggle_hide_mouse->setVisible(false);
|
||||||
|
|
||||||
|
ui->button_reset_defaults->setVisible(false);
|
||||||
|
|
||||||
ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit,
|
ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit,
|
||||||
Settings::values.use_frame_limit, use_frame_limit);
|
Settings::values.use_frame_limit, use_frame_limit);
|
||||||
ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core,
|
ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core,
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
|
class ConfigureDialog;
|
||||||
|
|
||||||
namespace ConfigurationShared {
|
namespace ConfigurationShared {
|
||||||
enum class CheckState;
|
enum class CheckState;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +26,7 @@ public:
|
||||||
explicit ConfigureGeneral(QWidget* parent = nullptr);
|
explicit ConfigureGeneral(QWidget* parent = nullptr);
|
||||||
~ConfigureGeneral() override;
|
~ConfigureGeneral() override;
|
||||||
|
|
||||||
|
void SetResetCallback(void (*callback)(ConfigureDialog*), ConfigureDialog *param);
|
||||||
void ResetDefaults();
|
void ResetDefaults();
|
||||||
void ApplyConfiguration();
|
void ApplyConfiguration();
|
||||||
|
|
||||||
|
@ -35,6 +38,9 @@ private:
|
||||||
|
|
||||||
void SetupPerGameUI();
|
void SetupPerGameUI();
|
||||||
|
|
||||||
|
void (*ResetCallback)(ConfigureDialog*);
|
||||||
|
ConfigureDialog *reset_callback_param;
|
||||||
|
|
||||||
std::unique_ptr<Ui::ConfigureGeneral> ui;
|
std::unique_ptr<Ui::ConfigureGeneral> ui;
|
||||||
|
|
||||||
ConfigurationShared::CheckState use_frame_limit;
|
ConfigurationShared::CheckState use_frame_limit;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>300</width>
|
<width>329</width>
|
||||||
<height>407</height>
|
<height>407</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
@ -91,13 +91,6 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item alignment="Qt::AlignRight">
|
|
||||||
<widget class="QPushButton" name="button_reset_defaults">
|
|
||||||
<property name="text">
|
|
||||||
<string>Reset All Settings</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -111,6 +104,45 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="layout_reset">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_reset_defaults">
|
||||||
|
<property name="text">
|
||||||
|
<string>Reset All Settings</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="spacer_reset">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -2587,14 +2587,49 @@ void GMainWindow::OnConfigure() {
|
||||||
&GMainWindow::OnLanguageChanged);
|
&GMainWindow::OnLanguageChanged);
|
||||||
|
|
||||||
const auto result = configure_dialog.exec();
|
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;
|
return;
|
||||||
} else if (result == QDialog::Accepted) {
|
} 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();
|
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<UISettings::GameDir> old_game_dirs = UISettings::values.game_dirs;
|
||||||
|
QVector<u64> old_favorited_ids = UISettings::values.favorited_ids;
|
||||||
|
|
||||||
|
Settings::values.disabled_addons.clear();
|
||||||
|
|
||||||
|
config = std::make_unique<Config>();
|
||||||
|
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();
|
controller_dialog->refreshConfiguration();
|
||||||
InitializeHotkeys();
|
InitializeHotkeys();
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,7 @@ struct Values {
|
||||||
bool cache_game_list;
|
bool cache_game_list;
|
||||||
|
|
||||||
bool configuration_applied;
|
bool configuration_applied;
|
||||||
|
bool reset_to_defaults;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Values values;
|
extern Values values;
|
||||||
|
|
Reference in New Issue