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
@ -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…
Reference in New Issue
Block a user