mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 08:59:03 -06:00 
			
		
		
		
	Merge pull request #6361 from lat9nq/per-hb-cfg
yuzu qt: Handle per-game configs for title id 0
This commit is contained in:
		@@ -16,7 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FS = Common::FS;
 | 
					namespace FS = Common::FS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Config::Config(const std::string& config_name, ConfigType config_type) : type(config_type) {
 | 
					Config::Config(std::string_view config_name, ConfigType config_type) : type(config_type) {
 | 
				
			||||||
    global = config_type == ConfigType::GlobalConfig;
 | 
					    global = config_type == ConfigType::GlobalConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Initialize(config_name);
 | 
					    Initialize(config_name);
 | 
				
			||||||
@@ -242,7 +242,7 @@ const std::array<UISettings::Shortcut, 17> Config::default_hotkeys{{
 | 
				
			|||||||
}};
 | 
					}};
 | 
				
			||||||
// clang-format on
 | 
					// clang-format on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Config::Initialize(const std::string& config_name) {
 | 
					void Config::Initialize(std::string_view config_name) {
 | 
				
			||||||
    const auto fs_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir);
 | 
					    const auto fs_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir);
 | 
				
			||||||
    const auto config_file = fmt::format("{}.ini", config_name);
 | 
					    const auto config_file = fmt::format("{}.ini", config_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ public:
 | 
				
			|||||||
        InputProfile,
 | 
					        InputProfile,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    explicit Config(const std::string& config_name = "qt-config",
 | 
					    explicit Config(std::string_view config_name = "qt-config",
 | 
				
			||||||
                    ConfigType config_type = ConfigType::GlobalConfig);
 | 
					                    ConfigType config_type = ConfigType::GlobalConfig);
 | 
				
			||||||
    ~Config();
 | 
					    ~Config();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,7 +45,7 @@ public:
 | 
				
			|||||||
    static const std::array<UISettings::Shortcut, 17> default_hotkeys;
 | 
					    static const std::array<UISettings::Shortcut, 17> default_hotkeys;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    void Initialize(const std::string& config_name);
 | 
					    void Initialize(std::string_view config_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void ReadValues();
 | 
					    void ReadValues();
 | 
				
			||||||
    void ReadPlayerValue(std::size_t player_index);
 | 
					    void ReadPlayerValue(std::size_t player_index);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
#include <utility>
 | 
					#include <utility>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QAbstractButton>
 | 
					#include <QAbstractButton>
 | 
				
			||||||
@@ -17,6 +18,7 @@
 | 
				
			|||||||
#include <QTimer>
 | 
					#include <QTimer>
 | 
				
			||||||
#include <QTreeView>
 | 
					#include <QTreeView>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/fs/path_util.h"
 | 
				
			||||||
#include "core/core.h"
 | 
					#include "core/core.h"
 | 
				
			||||||
#include "core/file_sys/control_metadata.h"
 | 
					#include "core/file_sys/control_metadata.h"
 | 
				
			||||||
#include "core/file_sys/patch_manager.h"
 | 
					#include "core/file_sys/patch_manager.h"
 | 
				
			||||||
@@ -29,10 +31,11 @@
 | 
				
			|||||||
#include "yuzu/uisettings.h"
 | 
					#include "yuzu/uisettings.h"
 | 
				
			||||||
#include "yuzu/util/util.h"
 | 
					#include "yuzu/util/util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id)
 | 
					ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, std::string_view file_name)
 | 
				
			||||||
    : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) {
 | 
					    : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGame>()), title_id(title_id) {
 | 
				
			||||||
    game_config = std::make_unique<Config>(fmt::format("{:016X}", title_id),
 | 
					    const auto config_file_name =
 | 
				
			||||||
                                           Config::ConfigType::PerGameConfig);
 | 
					        title_id == 0 ? Common::FS::GetFilename(file_name) : fmt::format("{:016X}", title_id);
 | 
				
			||||||
 | 
					    game_config = std::make_unique<Config>(config_file_name, Config::ConfigType::PerGameConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Settings::SetConfiguringGlobal(false);
 | 
					    Settings::SetConfiguringGlobal(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QDialog>
 | 
					#include <QDialog>
 | 
				
			||||||
@@ -27,7 +28,7 @@ class ConfigurePerGame : public QDialog {
 | 
				
			|||||||
    Q_OBJECT
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit ConfigurePerGame(QWidget* parent, u64 title_id);
 | 
					    explicit ConfigurePerGame(QWidget* parent, u64 title_id, std::string_view file_name);
 | 
				
			||||||
    ~ConfigurePerGame() override;
 | 
					    ~ConfigurePerGame() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Save all button configurations to settings file
 | 
					    /// Save all button configurations to settings file
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -561,11 +561,11 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri
 | 
				
			|||||||
    connect(remove_dlc, &QAction::triggered, [this, program_id]() {
 | 
					    connect(remove_dlc, &QAction::triggered, [this, program_id]() {
 | 
				
			||||||
        emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent);
 | 
					        emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    connect(remove_shader_cache, &QAction::triggered, [this, program_id]() {
 | 
					    connect(remove_shader_cache, &QAction::triggered, [this, program_id, path]() {
 | 
				
			||||||
        emit RemoveFileRequested(program_id, GameListRemoveTarget::ShaderCache);
 | 
					        emit RemoveFileRequested(program_id, GameListRemoveTarget::ShaderCache, path);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    connect(remove_custom_config, &QAction::triggered, [this, program_id]() {
 | 
					    connect(remove_custom_config, &QAction::triggered, [this, program_id, path]() {
 | 
				
			||||||
        emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration);
 | 
					        emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration, path);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    connect(dump_romfs, &QAction::triggered,
 | 
					    connect(dump_romfs, &QAction::triggered,
 | 
				
			||||||
            [this, program_id, path]() { emit DumpRomFSRequested(program_id, path); });
 | 
					            [this, program_id, path]() { emit DumpRomFSRequested(program_id, path); });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,8 @@ signals:
 | 
				
			|||||||
                             const std::string& game_path);
 | 
					                             const std::string& game_path);
 | 
				
			||||||
    void OpenTransferableShaderCacheRequested(u64 program_id);
 | 
					    void OpenTransferableShaderCacheRequested(u64 program_id);
 | 
				
			||||||
    void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type);
 | 
					    void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type);
 | 
				
			||||||
    void RemoveFileRequested(u64 program_id, GameListRemoveTarget target);
 | 
					    void RemoveFileRequested(u64 program_id, GameListRemoveTarget target,
 | 
				
			||||||
 | 
					                             std::string_view game_path);
 | 
				
			||||||
    void DumpRomFSRequested(u64 program_id, const std::string& game_path);
 | 
					    void DumpRomFSRequested(u64 program_id, const std::string& game_path);
 | 
				
			||||||
    void CopyTIDRequested(u64 program_id);
 | 
					    void CopyTIDRequested(u64 program_id);
 | 
				
			||||||
    void NavigateToGamedbEntryRequested(u64 program_id,
 | 
					    void NavigateToGamedbEntryRequested(u64 program_id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1334,7 +1334,10 @@ void GMainWindow::BootGame(const QString& filename, std::size_t program_index) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (!(loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success)) {
 | 
					    if (!(loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success)) {
 | 
				
			||||||
        // Load per game settings
 | 
					        // Load per game settings
 | 
				
			||||||
        Config per_game_config(fmt::format("{:016X}", title_id), Config::ConfigType::PerGameConfig);
 | 
					        const auto config_file_name = title_id == 0
 | 
				
			||||||
 | 
					                                          ? Common::FS::GetFilename(filename.toStdString())
 | 
				
			||||||
 | 
					                                          : fmt::format("{:016X}", title_id);
 | 
				
			||||||
 | 
					        Config per_game_config(config_file_name, Config::ConfigType::PerGameConfig);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ConfigureVibration::SetAllVibrationDevices();
 | 
					    ConfigureVibration::SetAllVibrationDevices();
 | 
				
			||||||
@@ -1795,7 +1798,8 @@ void GMainWindow::RemoveAddOnContent(u64 program_id, const QString& entry_type)
 | 
				
			|||||||
                             tr("Successfully removed %1 installed DLC.").arg(count));
 | 
					                             tr("Successfully removed %1 installed DLC.").arg(count));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target) {
 | 
					void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target,
 | 
				
			||||||
 | 
					                                       std::string_view game_path) {
 | 
				
			||||||
    const QString question = [this, target] {
 | 
					    const QString question = [this, target] {
 | 
				
			||||||
        switch (target) {
 | 
					        switch (target) {
 | 
				
			||||||
        case GameListRemoveTarget::ShaderCache:
 | 
					        case GameListRemoveTarget::ShaderCache:
 | 
				
			||||||
@@ -1817,7 +1821,7 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ
 | 
				
			|||||||
        RemoveTransferableShaderCache(program_id);
 | 
					        RemoveTransferableShaderCache(program_id);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case GameListRemoveTarget::CustomConfiguration:
 | 
					    case GameListRemoveTarget::CustomConfiguration:
 | 
				
			||||||
        RemoveCustomConfiguration(program_id);
 | 
					        RemoveCustomConfiguration(program_id, game_path);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1842,9 +1846,12 @@ void GMainWindow::RemoveTransferableShaderCache(u64 program_id) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GMainWindow::RemoveCustomConfiguration(u64 program_id) {
 | 
					void GMainWindow::RemoveCustomConfiguration(u64 program_id, std::string_view game_path) {
 | 
				
			||||||
    const auto custom_config_file_path = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) /
 | 
					    const auto config_file_name = program_id == 0
 | 
				
			||||||
                                         "custom" / fmt::format("{:016X}.ini", program_id);
 | 
					                                      ? fmt::format("{:s}.ini", Common::FS::GetFilename(game_path))
 | 
				
			||||||
 | 
					                                      : fmt::format("{:016X}.ini", program_id);
 | 
				
			||||||
 | 
					    const auto custom_config_file_path =
 | 
				
			||||||
 | 
					        Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "custom" / config_file_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!Common::FS::Exists(custom_config_file_path)) {
 | 
					    if (!Common::FS::Exists(custom_config_file_path)) {
 | 
				
			||||||
        QMessageBox::warning(this, tr("Error Removing Custom Configuration"),
 | 
					        QMessageBox::warning(this, tr("Error Removing Custom Configuration"),
 | 
				
			||||||
@@ -2635,7 +2642,7 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file
 | 
				
			|||||||
    const auto v_file = Core::GetGameFileFromPath(vfs, file_name);
 | 
					    const auto v_file = Core::GetGameFileFromPath(vfs, file_name);
 | 
				
			||||||
    const auto& system = Core::System::GetInstance();
 | 
					    const auto& system = Core::System::GetInstance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ConfigurePerGame dialog(this, title_id);
 | 
					    ConfigurePerGame dialog(this, title_id, file_name);
 | 
				
			||||||
    dialog.LoadFromFile(v_file);
 | 
					    dialog.LoadFromFile(v_file);
 | 
				
			||||||
    const auto result = dialog.exec();
 | 
					    const auto result = dialog.exec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -236,7 +236,8 @@ private slots:
 | 
				
			|||||||
                              const std::string& game_path);
 | 
					                              const std::string& game_path);
 | 
				
			||||||
    void OnTransferableShaderCacheOpenFile(u64 program_id);
 | 
					    void OnTransferableShaderCacheOpenFile(u64 program_id);
 | 
				
			||||||
    void OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type);
 | 
					    void OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type);
 | 
				
			||||||
    void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target);
 | 
					    void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target,
 | 
				
			||||||
 | 
					                              std::string_view game_path);
 | 
				
			||||||
    void OnGameListDumpRomFS(u64 program_id, const std::string& game_path);
 | 
					    void OnGameListDumpRomFS(u64 program_id, const std::string& game_path);
 | 
				
			||||||
    void OnGameListCopyTID(u64 program_id);
 | 
					    void OnGameListCopyTID(u64 program_id);
 | 
				
			||||||
    void OnGameListNavigateToGamedbEntry(u64 program_id,
 | 
					    void OnGameListNavigateToGamedbEntry(u64 program_id,
 | 
				
			||||||
@@ -275,7 +276,7 @@ private:
 | 
				
			|||||||
    void RemoveUpdateContent(u64 program_id, const QString& entry_type);
 | 
					    void RemoveUpdateContent(u64 program_id, const QString& entry_type);
 | 
				
			||||||
    void RemoveAddOnContent(u64 program_id, const QString& entry_type);
 | 
					    void RemoveAddOnContent(u64 program_id, const QString& entry_type);
 | 
				
			||||||
    void RemoveTransferableShaderCache(u64 program_id);
 | 
					    void RemoveTransferableShaderCache(u64 program_id);
 | 
				
			||||||
    void RemoveCustomConfiguration(u64 program_id);
 | 
					    void RemoveCustomConfiguration(u64 program_id, std::string_view game_path);
 | 
				
			||||||
    std::optional<u64> SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id);
 | 
					    std::optional<u64> SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id);
 | 
				
			||||||
    InstallResult InstallNSPXCI(const QString& filename);
 | 
					    InstallResult InstallNSPXCI(const QString& filename);
 | 
				
			||||||
    InstallResult InstallNCA(const QString& filename);
 | 
					    InstallResult InstallNCA(const QString& filename);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user