frontend: Open transferable shader cache for a selected game in the gamelist
This commit is contained in:
		@@ -329,6 +329,8 @@ void GameList::PopupContextMenu(const QPoint& menu_location) {
 | 
				
			|||||||
    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_lfs_location = context_menu.addAction(tr("Open Mod Data Location"));
 | 
					    QAction* open_lfs_location = context_menu.addAction(tr("Open Mod Data Location"));
 | 
				
			||||||
 | 
					    QAction* open_transferable_shader_cache =
 | 
				
			||||||
 | 
					        context_menu.addAction(tr("Open Transferable Shader Cache"));
 | 
				
			||||||
    context_menu.addSeparator();
 | 
					    context_menu.addSeparator();
 | 
				
			||||||
    QAction* dump_romfs = context_menu.addAction(tr("Dump RomFS"));
 | 
					    QAction* dump_romfs = context_menu.addAction(tr("Dump RomFS"));
 | 
				
			||||||
    QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard"));
 | 
					    QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard"));
 | 
				
			||||||
@@ -344,6 +346,8 @@ void GameList::PopupContextMenu(const QPoint& menu_location) {
 | 
				
			|||||||
            [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::SaveData); });
 | 
					            [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::SaveData); });
 | 
				
			||||||
    connect(open_lfs_location, &QAction::triggered,
 | 
					    connect(open_lfs_location, &QAction::triggered,
 | 
				
			||||||
            [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::ModData); });
 | 
					            [&]() { emit OpenFolderRequested(program_id, GameListOpenTarget::ModData); });
 | 
				
			||||||
 | 
					    connect(open_transferable_shader_cache, &QAction::triggered,
 | 
				
			||||||
 | 
					            [&]() { emit OpenTransferableShaderCacheRequested(program_id); });
 | 
				
			||||||
    connect(dump_romfs, &QAction::triggered, [&]() { emit DumpRomFSRequested(program_id, path); });
 | 
					    connect(dump_romfs, &QAction::triggered, [&]() { emit DumpRomFSRequested(program_id, path); });
 | 
				
			||||||
    connect(copy_tid, &QAction::triggered, [&]() { emit CopyTIDRequested(program_id); });
 | 
					    connect(copy_tid, &QAction::triggered, [&]() { emit CopyTIDRequested(program_id); });
 | 
				
			||||||
    connect(navigate_to_gamedb_entry, &QAction::triggered,
 | 
					    connect(navigate_to_gamedb_entry, &QAction::triggered,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,6 +66,7 @@ signals:
 | 
				
			|||||||
    void GameChosen(QString game_path);
 | 
					    void GameChosen(QString game_path);
 | 
				
			||||||
    void ShouldCancelWorker();
 | 
					    void ShouldCancelWorker();
 | 
				
			||||||
    void OpenFolderRequested(u64 program_id, GameListOpenTarget target);
 | 
					    void OpenFolderRequested(u64 program_id, GameListOpenTarget target);
 | 
				
			||||||
 | 
					    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);
 | 
				
			||||||
    void NavigateToGamedbEntryRequested(u64 program_id,
 | 
					    void NavigateToGamedbEntryRequested(u64 program_id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -632,6 +632,8 @@ 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::OpenFolderRequested, this, &GMainWindow::OnGameListOpenFolder);
 | 
					    connect(game_list, &GameList::OpenFolderRequested, this, &GMainWindow::OnGameListOpenFolder);
 | 
				
			||||||
 | 
					    connect(game_list, &GameList::OpenTransferableShaderCacheRequested, this,
 | 
				
			||||||
 | 
					            &GMainWindow::OnTransferableShaderCacheOpenFile);
 | 
				
			||||||
    connect(game_list, &GameList::DumpRomFSRequested, this, &GMainWindow::OnGameListDumpRomFS);
 | 
					    connect(game_list, &GameList::DumpRomFSRequested, this, &GMainWindow::OnGameListDumpRomFS);
 | 
				
			||||||
    connect(game_list, &GameList::CopyTIDRequested, this, &GMainWindow::OnGameListCopyTID);
 | 
					    connect(game_list, &GameList::CopyTIDRequested, this, &GMainWindow::OnGameListCopyTID);
 | 
				
			||||||
    connect(game_list, &GameList::NavigateToGamedbEntryRequested, this,
 | 
					    connect(game_list, &GameList::NavigateToGamedbEntryRequested, this,
 | 
				
			||||||
@@ -1066,6 +1068,48 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target
 | 
				
			|||||||
    QDesktopServices::openUrl(QUrl::fromLocalFile(qpath));
 | 
					    QDesktopServices::openUrl(QUrl::fromLocalFile(qpath));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GMainWindow::OnTransferableShaderCacheOpenFile(u64 program_id) {
 | 
				
			||||||
 | 
					    ASSERT(program_id != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::string transferable_shader_cache_file_path;
 | 
				
			||||||
 | 
					    const std::string open_target = "Transferable Shader Cache";
 | 
				
			||||||
 | 
					    const std::string tranferable_shader_cache_folder =
 | 
				
			||||||
 | 
					        FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + "opengl" + DIR_SEP "transferable";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    transferable_shader_cache_file_path.append(tranferable_shader_cache_folder);
 | 
				
			||||||
 | 
					    transferable_shader_cache_file_path.append(DIR_SEP);
 | 
				
			||||||
 | 
					    transferable_shader_cache_file_path.append(fmt::format("{:016X}", program_id));
 | 
				
			||||||
 | 
					    transferable_shader_cache_file_path.append(".bin");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QString qpath_transferable_shader_cache_file =
 | 
				
			||||||
 | 
					        QString::fromStdString(transferable_shader_cache_file_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QFile qfile(qpath_transferable_shader_cache_file);
 | 
				
			||||||
 | 
					    if (!qfile.exists()) {
 | 
				
			||||||
 | 
					        QMessageBox::warning(this,
 | 
				
			||||||
 | 
					                             tr("Error Opening %1 File").arg(QString::fromStdString(open_target)),
 | 
				
			||||||
 | 
					                             tr("File does not exist!"));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    LOG_INFO(Frontend, "Opening {} path for program_id={:016x}", open_target, program_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Windows supports opening a folder with selecting a specified file in explorer. On every other
 | 
				
			||||||
 | 
					    // OS we just open the transferable shader cache folder without preselecting the transferable
 | 
				
			||||||
 | 
					    // shader cache file for the selected game.
 | 
				
			||||||
 | 
					#if defined(Q_OS_WIN)
 | 
				
			||||||
 | 
					    const QString explorer = "explorer";
 | 
				
			||||||
 | 
					    QStringList param;
 | 
				
			||||||
 | 
					    if (!QFileInfo(qpath_transferable_shader_cache_file).isDir())
 | 
				
			||||||
 | 
					        param << QLatin1String("/select,");
 | 
				
			||||||
 | 
					    param << QDir::toNativeSeparators(qpath_transferable_shader_cache_file);
 | 
				
			||||||
 | 
					    QProcess::startDetached(explorer, param);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    const QString qpath_transferable_shader_cache_folder =
 | 
				
			||||||
 | 
					        QString::fromStdString(tranferable_shader_cache_folder);
 | 
				
			||||||
 | 
					    QDesktopServices::openUrl(QUrl::fromLocalFile(qpath_transferable_shader_cache_folder));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static std::size_t CalculateRomFSEntrySize(const FileSys::VirtualDir& dir, bool full) {
 | 
					static std::size_t CalculateRomFSEntrySize(const FileSys::VirtualDir& dir, bool full) {
 | 
				
			||||||
    std::size_t out = 0;
 | 
					    std::size_t out = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -176,6 +176,7 @@ private slots:
 | 
				
			|||||||
    /// 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(u64 program_id, GameListOpenTarget target);
 | 
				
			||||||
 | 
					    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);
 | 
				
			||||||
    void OnGameListNavigateToGamedbEntry(u64 program_id,
 | 
					    void OnGameListNavigateToGamedbEntry(u64 program_id,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user