Преглед изворни кода

yuzu: game_list: Fix 'Open Save Data Location' for device saves.

bunnei пре 6 година
родитељ
комит
551c61bf27
4 измењених фајлова са 49 додато и 27 уклоњено
  1. 4 4
      src/yuzu/game_list.cpp
  2. 1 1
      src/yuzu/game_list.h
  3. 43 21
      src/yuzu/main.cpp
  4. 1 1
      src/yuzu/main.h

+ 4 - 4
src/yuzu/game_list.cpp

@@ -488,11 +488,11 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, std::string pat
     auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
     auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
     navigate_to_gamedb_entry->setVisible(it != compatibility_list.end() && program_id != 0);
     navigate_to_gamedb_entry->setVisible(it != compatibility_list.end() && program_id != 0);
 
 
-    connect(open_save_location, &QAction::triggered, [this, program_id]() {
-        emit OpenFolderRequested(program_id, GameListOpenTarget::SaveData);
+    connect(open_save_location, &QAction::triggered, [this, program_id, path]() {
+        emit OpenFolderRequested(GameListOpenTarget::SaveData, path);
     });
     });
-    connect(open_lfs_location, &QAction::triggered, [this, program_id]() {
-        emit OpenFolderRequested(program_id, GameListOpenTarget::ModData);
+    connect(open_lfs_location, &QAction::triggered, [this, program_id, path]() {
+        emit OpenFolderRequested(GameListOpenTarget::ModData, path);
     });
     });
     connect(open_transferable_shader_cache, &QAction::triggered,
     connect(open_transferable_shader_cache, &QAction::triggered,
             [this, program_id]() { emit OpenTransferableShaderCacheRequested(program_id); });
             [this, program_id]() { emit OpenTransferableShaderCacheRequested(program_id); });

+ 1 - 1
src/yuzu/game_list.h

@@ -73,7 +73,7 @@ public:
 signals:
 signals:
     void GameChosen(QString game_path);
     void GameChosen(QString game_path);
     void ShouldCancelWorker();
     void ShouldCancelWorker();
-    void OpenFolderRequested(u64 program_id, GameListOpenTarget target);
+    void OpenFolderRequested(GameListOpenTarget target, const std::string& game_path);
     void OpenTransferableShaderCacheRequested(u64 program_id);
     void OpenTransferableShaderCacheRequested(u64 program_id);
     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);

+ 43 - 21
src/yuzu/main.cpp

@@ -1154,39 +1154,61 @@ void GMainWindow::OnGameListLoadFile(QString game_path) {
     BootGame(game_path);
     BootGame(game_path);
 }
 }
 
 
-void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target) {
+void GMainWindow::OnGameListOpenFolder(GameListOpenTarget target, const std::string& game_path) {
     std::string path;
     std::string path;
     QString open_target;
     QString open_target;
+
+    const auto v_file = Core::GetGameFileFromPath(vfs, game_path);
+    const auto loader = Loader::GetLoader(v_file);
+    FileSys::NACP control{};
+    u64 program_id{};
+
+    loader->ReadControlData(control);
+    loader->ReadProgramId(program_id);
+
+    const bool has_user_save{control.GetDefaultNormalSaveSize() > 0};
+    const bool has_device_save{control.GetDeviceSaveDataSize() > 0};
+
+    ASSERT_MSG(has_user_save != has_device_save, "Game uses both user and device savedata?");
+
     switch (target) {
     switch (target) {
     case GameListOpenTarget::SaveData: {
     case GameListOpenTarget::SaveData: {
         open_target = tr("Save Data");
         open_target = tr("Save Data");
         const std::string nand_dir = FileUtil::GetUserPath(FileUtil::UserPath::NANDDir);
         const std::string nand_dir = FileUtil::GetUserPath(FileUtil::UserPath::NANDDir);
         ASSERT(program_id != 0);
         ASSERT(program_id != 0);
 
 
-        const auto select_profile = [this] {
-            QtProfileSelectionDialog dialog(this);
-            dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
-                                  Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
-            dialog.setWindowModality(Qt::WindowModal);
+        if (has_user_save) {
+            // User save data
+            const auto select_profile = [this] {
+                QtProfileSelectionDialog dialog(this);
+                dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
+                                      Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
+                dialog.setWindowModality(Qt::WindowModal);
 
 
-            if (dialog.exec() == QDialog::Rejected) {
-                return -1;
-            }
+                if (dialog.exec() == QDialog::Rejected) {
+                    return -1;
+                }
 
 
-            return dialog.GetIndex();
-        };
+                return dialog.GetIndex();
+            };
 
 
-        const auto index = select_profile();
-        if (index == -1) {
-            return;
-        }
+            const auto index = select_profile();
+            if (index == -1) {
+                return;
+            }
 
 
-        Service::Account::ProfileManager manager;
-        const auto user_id = manager.GetUser(static_cast<std::size_t>(index));
-        ASSERT(user_id);
-        path = nand_dir + FileSys::SaveDataFactory::GetFullPath(FileSys::SaveDataSpaceId::NandUser,
-                                                                FileSys::SaveDataType::SaveData,
-                                                                program_id, user_id->uuid, 0);
+            Service::Account::ProfileManager manager;
+            const auto user_id = manager.GetUser(static_cast<std::size_t>(index));
+            ASSERT(user_id);
+            path = nand_dir + FileSys::SaveDataFactory::GetFullPath(
+                                  FileSys::SaveDataSpaceId::NandUser,
+                                  FileSys::SaveDataType::SaveData, program_id, user_id->uuid, 0);
+        } else {
+            // Device save data
+            path = nand_dir + FileSys::SaveDataFactory::GetFullPath(
+                                  FileSys::SaveDataSpaceId::NandUser,
+                                  FileSys::SaveDataType::SaveData, program_id, {}, 0);
+        }
 
 
         if (!FileUtil::Exists(path)) {
         if (!FileUtil::Exists(path)) {
             FileUtil::CreateFullPath(path);
             FileUtil::CreateFullPath(path);

+ 1 - 1
src/yuzu/main.h

@@ -183,7 +183,7 @@ private slots:
     void OnMenuReportCompatibility();
     void OnMenuReportCompatibility();
     /// Called whenever a user selects a game in the game list widget.
     /// Called whenever a user selects a game in the game list widget.
     void OnGameListLoadFile(QString game_path);
     void OnGameListLoadFile(QString game_path);
-    void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target);
+    void OnGameListOpenFolder(GameListOpenTarget target, const std::string& game_path);
     void OnTransferableShaderCacheOpenFile(u64 program_id);
     void OnTransferableShaderCacheOpenFile(u64 program_id);
     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);