Merge pull request #6362 from lat9nq/reset-to-defaults
yuzu qt: Add settings reset button to general configuration
This commit is contained in:
		@@ -27,6 +27,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
 | 
			
		||||
 | 
			
		||||
    ui->inputTab->Initialize(input_subsystem);
 | 
			
		||||
 | 
			
		||||
    ui->generalTab->SetResetCallback([&] { this->close(); });
 | 
			
		||||
 | 
			
		||||
    SetConfiguration();
 | 
			
		||||
    PopulateSelectionList();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,15 @@
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <QCheckBox>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include <QSpinBox>
 | 
			
		||||
#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/uisettings.h"
 | 
			
		||||
@@ -23,6 +27,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;
 | 
			
		||||
@@ -41,6 +48,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 {
 | 
			
		||||
@@ -49,6 +58,25 @@ void ConfigureGeneral::SetConfiguration() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Called to set the callback when resetting settings to defaults
 | 
			
		||||
void ConfigureGeneral::SetResetCallback(std::function<void()> callback) {
 | 
			
		||||
    reset_callback = std::move(callback);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureGeneral::ResetDefaults() {
 | 
			
		||||
    QMessageBox::StandardButton answer = QMessageBox::question(
 | 
			
		||||
        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.reset_to_defaults = true;
 | 
			
		||||
    UISettings::values.is_game_list_reload_pending.exchange(true);
 | 
			
		||||
    reset_callback();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigureGeneral::ApplyConfiguration() {
 | 
			
		||||
    ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core,
 | 
			
		||||
                                             use_multi_core);
 | 
			
		||||
@@ -105,6 +133,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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,12 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <QWidget>
 | 
			
		||||
 | 
			
		||||
class ConfigureDialog;
 | 
			
		||||
 | 
			
		||||
namespace ConfigurationShared {
 | 
			
		||||
enum class CheckState;
 | 
			
		||||
}
 | 
			
		||||
@@ -24,6 +27,8 @@ public:
 | 
			
		||||
    explicit ConfigureGeneral(QWidget* parent = nullptr);
 | 
			
		||||
    ~ConfigureGeneral() override;
 | 
			
		||||
 | 
			
		||||
    void SetResetCallback(std::function<void()> callback);
 | 
			
		||||
    void ResetDefaults();
 | 
			
		||||
    void ApplyConfiguration();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@@ -34,6 +39,8 @@ private:
 | 
			
		||||
 | 
			
		||||
    void SetupPerGameUI();
 | 
			
		||||
 | 
			
		||||
    std::function<void()> reset_callback;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<Ui::ConfigureGeneral> ui;
 | 
			
		||||
 | 
			
		||||
    ConfigurationShared::CheckState use_frame_limit;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>300</width>
 | 
			
		||||
    <width>329</width>
 | 
			
		||||
    <height>407</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
@@ -104,6 +104,45 @@
 | 
			
		||||
       </property>
 | 
			
		||||
      </spacer>
 | 
			
		||||
     </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>
 | 
			
		||||
   </item>
 | 
			
		||||
  </layout>
 | 
			
		||||
 
 | 
			
		||||
@@ -2596,13 +2596,53 @@ 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");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Explicitly save the game directories, since reinitializing config does not explicitly do
 | 
			
		||||
        // so.
 | 
			
		||||
        QVector<UISettings::GameDir> old_game_dirs = std::move(UISettings::values.game_dirs);
 | 
			
		||||
        QVector<u64> old_favorited_ids = std::move(UISettings::values.favorited_ids);
 | 
			
		||||
 | 
			
		||||
        Settings::values.disabled_addons.clear();
 | 
			
		||||
 | 
			
		||||
        config = std::make_unique<Config>();
 | 
			
		||||
        UISettings::values.reset_to_defaults = false;
 | 
			
		||||
 | 
			
		||||
        UISettings::values.game_dirs = std::move(old_game_dirs);
 | 
			
		||||
        UISettings::values.favorited_ids = std::move(old_favorited_ids);
 | 
			
		||||
 | 
			
		||||
        InitializeRecentFileMenuActions();
 | 
			
		||||
 | 
			
		||||
        SetDefaultUIGeometry();
 | 
			
		||||
        RestoreUIState();
 | 
			
		||||
 | 
			
		||||
        ShowTelemetryCallout();
 | 
			
		||||
    }
 | 
			
		||||
    controller_dialog->refreshConfiguration();
 | 
			
		||||
    InitializeHotkeys();
 | 
			
		||||
 | 
			
		||||
    if (UISettings::values.theme != old_theme) {
 | 
			
		||||
        UpdateUITheme();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -97,6 +97,7 @@ struct Values {
 | 
			
		||||
    bool cache_game_list;
 | 
			
		||||
 | 
			
		||||
    bool configuration_applied;
 | 
			
		||||
    bool reset_to_defaults;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern Values values;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user