Просмотр исходного кода

Merge pull request #6362 from lat9nq/reset-to-defaults

yuzu qt: Add settings reset button to general configuration
bunnei 5 лет назад
Родитель
Сommit
fefc76e5da

+ 2 - 0
src/yuzu/configuration/configure_dialog.cpp

@@ -27,6 +27,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
 
 
     ui->inputTab->Initialize(input_subsystem);
     ui->inputTab->Initialize(input_subsystem);
 
 
+    ui->generalTab->SetResetCallback([&] { this->close(); });
+
     SetConfiguration();
     SetConfiguration();
     PopulateSelectionList();
     PopulateSelectionList();
 
 

+ 30 - 0
src/yuzu/configuration/configure_general.cpp

@@ -2,11 +2,15 @@
 // Licensed under GPLv2 or any later version
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 // Refer to the license.txt file included.
 
 
+#include <functional>
+#include <utility>
 #include <QCheckBox>
 #include <QCheckBox>
+#include <QMessageBox>
 #include <QSpinBox>
 #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/uisettings.h"
 #include "yuzu/uisettings.h"
@@ -23,6 +27,9 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
         connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit,
         connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit,
                 [this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); });
                 [this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); });
     }
     }
+
+    connect(ui->button_reset_defaults, &QPushButton::clicked, this,
+            &ConfigureGeneral::ResetDefaults);
 }
 }
 
 
 ConfigureGeneral::~ConfigureGeneral() = default;
 ConfigureGeneral::~ConfigureGeneral() = default;
@@ -41,6 +48,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 {
@@ -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() {
 void ConfigureGeneral::ApplyConfiguration() {
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core,
     ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core,
                                              use_multi_core);
                                              use_multi_core);
@@ -105,6 +133,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 - 0
src/yuzu/configuration/configure_general.h

@@ -4,9 +4,12 @@
 
 
 #pragma once
 #pragma once
 
 
+#include <functional>
 #include <memory>
 #include <memory>
 #include <QWidget>
 #include <QWidget>
 
 
+class ConfigureDialog;
+
 namespace ConfigurationShared {
 namespace ConfigurationShared {
 enum class CheckState;
 enum class CheckState;
 }
 }
@@ -24,6 +27,8 @@ public:
     explicit ConfigureGeneral(QWidget* parent = nullptr);
     explicit ConfigureGeneral(QWidget* parent = nullptr);
     ~ConfigureGeneral() override;
     ~ConfigureGeneral() override;
 
 
+    void SetResetCallback(std::function<void()> callback);
+    void ResetDefaults();
     void ApplyConfiguration();
     void ApplyConfiguration();
 
 
 private:
 private:
@@ -34,6 +39,8 @@ private:
 
 
     void SetupPerGameUI();
     void SetupPerGameUI();
 
 
+    std::function<void()> reset_callback;
+
     std::unique_ptr<Ui::ConfigureGeneral> ui;
     std::unique_ptr<Ui::ConfigureGeneral> ui;
 
 
     ConfigurationShared::CheckState use_frame_limit;
     ConfigurationShared::CheckState use_frame_limit;

+ 40 - 1
src/yuzu/configuration/configure_general.ui

@@ -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>
@@ -104,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>

+ 42 - 2
src/yuzu/main.cpp

@@ -2596,13 +2596,53 @@ 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");
+        }
+
+        // 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();
     InitializeHotkeys();
+
     if (UISettings::values.theme != old_theme) {
     if (UISettings::values.theme != old_theme) {
         UpdateUITheme();
         UpdateUITheme();
     }
     }

+ 1 - 0
src/yuzu/uisettings.h

@@ -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;