mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Add Context Menu Options to Open Application and Update Location (#3411)
* Add Context Menu Options to Open Application and Update Location * address jroweboy's feedback move enum definition to game list header declare sdmc_dir in SAVE_DATA case fix log formatting * Address Merry's feedback remove redundant line format program ID as 16 digit hex in log| change case of open_target to look better in title bar add whitespace for readability
This commit is contained in:
		
							parent
							
								
									40b9e55e60
								
							
						
					
					
						commit
						d3a0375f47
					
				
					 4 changed files with 55 additions and 10 deletions
				
			
		|  | @ -316,10 +316,24 @@ void GameList::PopupContextMenu(const QPoint& menu_location) { | ||||||
|     u64 program_id = child_file->data(GameListItemPath::ProgramIdRole).toULongLong(); |     u64 program_id = child_file->data(GameListItemPath::ProgramIdRole).toULongLong(); | ||||||
| 
 | 
 | ||||||
|     QMenu context_menu; |     QMenu context_menu; | ||||||
|  | 
 | ||||||
|     QAction* open_save_location = context_menu.addAction(tr("Open Save Data Location")); |     QAction* open_save_location = context_menu.addAction(tr("Open Save Data Location")); | ||||||
|  |     QAction* open_application_location = context_menu.addAction(tr("Open Application Location")); | ||||||
|  |     QAction* open_update_location = context_menu.addAction(tr("Open Update Data Location")); | ||||||
|  | 
 | ||||||
|     open_save_location->setEnabled(program_id != 0); |     open_save_location->setEnabled(program_id != 0); | ||||||
|  |     open_application_location->setVisible(FileUtil::Exists( | ||||||
|  |         Service::AM::GetTitleContentPath(Service::FS::MediaType::SDMC, program_id))); | ||||||
|  |     open_update_location->setEnabled(0x00040000'00000000 <= program_id && | ||||||
|  |                                      program_id <= 0x00040000'FFFFFFFF); | ||||||
|  | 
 | ||||||
|     connect(open_save_location, &QAction::triggered, |     connect(open_save_location, &QAction::triggered, | ||||||
|             [&]() { emit OpenSaveFolderRequested(program_id); }); |             [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::SAVE_DATA); }); | ||||||
|  |     connect(open_application_location, &QAction::triggered, | ||||||
|  |             [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::APPLICATION); }); | ||||||
|  |     connect(open_update_location, &QAction::triggered, | ||||||
|  |             [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::UPDATE_DATA); }); | ||||||
|  | 
 | ||||||
|     context_menu.exec(tree_view->viewport()->mapToGlobal(menu_location)); |     context_menu.exec(tree_view->viewport()->mapToGlobal(menu_location)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,6 +21,8 @@ class QTreeView; | ||||||
| class QToolButton; | class QToolButton; | ||||||
| class QVBoxLayout; | class QVBoxLayout; | ||||||
| 
 | 
 | ||||||
|  | enum class GameListOpenTarget { SAVE_DATA = 0, APPLICATION = 1, UPDATE_DATA = 2 }; | ||||||
|  | 
 | ||||||
| class GameList : public QWidget { | class GameList : public QWidget { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
| 
 | 
 | ||||||
|  | @ -76,7 +78,7 @@ public: | ||||||
| signals: | signals: | ||||||
|     void GameChosen(QString game_path); |     void GameChosen(QString game_path); | ||||||
|     void ShouldCancelWorker(); |     void ShouldCancelWorker(); | ||||||
|     void OpenSaveFolderRequested(u64 program_id); |     void OpenFolderRequested(u64 program_id, GameListOpenTarget target); | ||||||
| 
 | 
 | ||||||
| private slots: | private slots: | ||||||
|     void onTextChanged(const QString& newText); |     void onTextChanged(const QString& newText); | ||||||
|  | @ -99,3 +101,5 @@ private: | ||||||
|     GameListWorker* current_worker = nullptr; |     GameListWorker* current_worker = nullptr; | ||||||
|     QFileSystemWatcher* watcher = nullptr; |     QFileSystemWatcher* watcher = nullptr; | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | Q_DECLARE_METATYPE(GameListOpenTarget); | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/file_sys/archive_source_sd_savedata.h" | #include "core/file_sys/archive_source_sd_savedata.h" | ||||||
| #include "core/gdbstub/gdbstub.h" | #include "core/gdbstub/gdbstub.h" | ||||||
|  | #include "core/hle/service/fs/archive.h" | ||||||
| #include "core/loader/loader.h" | #include "core/loader/loader.h" | ||||||
| #include "core/settings.h" | #include "core/settings.h" | ||||||
| 
 | 
 | ||||||
|  | @ -359,8 +360,7 @@ void GMainWindow::RestoreUIState() { | ||||||
| 
 | 
 | ||||||
| void GMainWindow::ConnectWidgetEvents() { | void GMainWindow::ConnectWidgetEvents() { | ||||||
|     connect(game_list, &GameList::GameChosen, this, &GMainWindow::OnGameListLoadFile); |     connect(game_list, &GameList::GameChosen, this, &GMainWindow::OnGameListLoadFile); | ||||||
|     connect(game_list, &GameList::OpenSaveFolderRequested, this, |     connect(game_list, &GameList::OpenFolderRequested, this, &GMainWindow::OnGameListOpenFolder); | ||||||
|             &GMainWindow::OnGameListOpenSaveFolder); |  | ||||||
| 
 | 
 | ||||||
|     connect(this, &GMainWindow::EmulationStarting, render_window, |     connect(this, &GMainWindow::EmulationStarting, render_window, | ||||||
|             &GRenderWindow::OnEmulationStarting); |             &GRenderWindow::OnEmulationStarting); | ||||||
|  | @ -699,18 +699,44 @@ void GMainWindow::OnGameListLoadFile(QString game_path) { | ||||||
|     BootGame(game_path); |     BootGame(game_path); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GMainWindow::OnGameListOpenSaveFolder(u64 program_id) { | void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target) { | ||||||
|     std::string sdmc_dir = FileUtil::GetUserPath(D_SDMC_IDX); |     std::string path; | ||||||
|     std::string path = FileSys::ArchiveSource_SDSaveData::GetSaveDataPathFor(sdmc_dir, program_id); |     std::string open_target; | ||||||
|  | 
 | ||||||
|  |     switch (target) { | ||||||
|  |     case GameListOpenTarget::SAVE_DATA: { | ||||||
|  |         open_target = "Save Data"; | ||||||
|  |         std::string sdmc_dir = FileUtil::GetUserPath(D_SDMC_IDX); | ||||||
|  |         path = FileSys::ArchiveSource_SDSaveData::GetSaveDataPathFor(sdmc_dir, program_id); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case GameListOpenTarget::APPLICATION: | ||||||
|  |         open_target = "Application"; | ||||||
|  |         path = Service::AM::GetTitlePath(Service::FS::MediaType::SDMC, program_id) + "content/"; | ||||||
|  |         break; | ||||||
|  |     case GameListOpenTarget::UPDATE_DATA: | ||||||
|  |         open_target = "Update Data"; | ||||||
|  |         path = Service::AM::GetTitlePath(Service::FS::MediaType::SDMC, program_id + 0xe00000000) + | ||||||
|  |                "content/"; | ||||||
|  |         break; | ||||||
|  |     default: | ||||||
|  |         LOG_ERROR(Frontend, "Unexpected target %d", target); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     QString qpath = QString::fromStdString(path); |     QString qpath = QString::fromStdString(path); | ||||||
| 
 | 
 | ||||||
|     QDir dir(qpath); |     QDir dir(qpath); | ||||||
|     if (!dir.exists()) { |     if (!dir.exists()) { | ||||||
|         QMessageBox::critical(this, tr("Error Opening Save Folder"), tr("Folder does not exist!")); |         QMessageBox::critical( | ||||||
|  |             this, tr("Error Opening %1 Folder").arg(QString::fromStdString(open_target)), | ||||||
|  |             tr("Folder does not exist!")); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     LOG_INFO(Frontend, "Opening save data path for program_id=%" PRIu64, program_id); |     LOG_INFO(Frontend, "Opening %s path for program_id=%016" PRIx64, open_target.c_str(), | ||||||
|  |              program_id); | ||||||
|  | 
 | ||||||
|     QDesktopServices::openUrl(QUrl::fromLocalFile(qpath)); |     QDesktopServices::openUrl(QUrl::fromLocalFile(qpath)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ class AboutDialog; | ||||||
| class Config; | class Config; | ||||||
| class EmuThread; | class EmuThread; | ||||||
| class GameList; | class GameList; | ||||||
|  | enum class GameListOpenTarget; | ||||||
| class GImageInfo; | class GImageInfo; | ||||||
| class GPUCommandListWidget; | class GPUCommandListWidget; | ||||||
| class GPUCommandStreamWidget; | class GPUCommandStreamWidget; | ||||||
|  | @ -130,7 +131,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 OnGameListOpenSaveFolder(u64 program_id); |     void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target); | ||||||
|     void OnMenuLoadFile(); |     void OnMenuLoadFile(); | ||||||
|     void OnMenuInstallCIA(); |     void OnMenuInstallCIA(); | ||||||
|     void OnUpdateProgress(size_t written, size_t total); |     void OnUpdateProgress(size_t written, size_t total); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue