frontend: Open transferable shader cache for a selected game in the gamelist
This commit is contained in:
parent
f09d1dffd1
commit
9d411699d8
|
@ -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