qt: Add Tools commands for system archive management

This commit is contained in:
Zach Hilman
2019-10-15 14:39:47 -04:00
parent bf5c2371a2
commit a8119a47a1
3 changed files with 118 additions and 0 deletions

View File

@@ -27,6 +27,7 @@
#include "core/hle/service/am/applets/applets.h"
#include "core/hle/service/hid/controllers/npad.h"
#include "core/hle/service/hid/hid.h"
#include "yuzu/status/system_archive.h"
// These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows
// defines.
@@ -40,6 +41,10 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
return dir->CreateFile(path);
}
static bool VfsDirectoryDeleteFileWrapper(const FileSys::VirtualDir& dir, const std::string& path) {
return dir->DeleteFile(path);
}
#include <fmt/ostream.h>
#include <glad/glad.h>
@@ -83,6 +88,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "core/file_sys/romfs.h"
#include "core/file_sys/savedata_factory.h"
#include "core/file_sys/submission_package.h"
#include "core/file_sys/system_archive/importer.h"
#include "core/frontend/applets/software_keyboard.h"
#include "core/hle/kernel/process.h"
#include "core/hle/service/am/am.h"
@@ -760,6 +766,16 @@ void GMainWindow::ConnectMenuEvents() {
connect(ui.action_Capture_Screenshot, &QAction::triggered, this,
&GMainWindow::OnCaptureScreenshot);
// Tools
connect(ui.actionImport_Directory, &QAction::triggered, this,
&GMainWindow::OnImportDirectorySystemUpdate);
connect(ui.actionImport_Cartridge, &QAction::triggered, this,
&GMainWindow::OnImportCartridgeSystemUpdate);
connect(ui.actionClear_Imported, &QAction::triggered, this,
&GMainWindow::OnClearImportedSysdata);
connect(ui.actionView_Status, &QAction::triggered, this,
&GMainWindow::OnViewSystemArchiveStatus);
// Help
connect(ui.action_Open_yuzu_Folder, &QAction::triggered, this, &GMainWindow::OnOpenYuzuFolder);
connect(ui.action_Rederive, &QAction::triggered, this,
@@ -1358,6 +1374,71 @@ void GMainWindow::OnGameListNavigateToGamedbEntry(u64 program_id,
QDesktopServices::openUrl(QUrl(QStringLiteral("https://yuzu-emu.org/game/") + directory));
}
void GMainWindow::OnClearImportedSysdata() {
Core::System& system{Core::System::GetInstance()};
const auto path = FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir) + "imported" DIR_SEP;
QDir dir(QString::fromStdString(path));
const auto list = dir.entryList(QDir::Files);
for (const auto& file : list) {
if (!dir.remove(file)) {
QMessageBox::warning(this, tr("Clear Failed"),
tr("The imported sysdata directory was not able to be cleared."));
return;
}
}
QMessageBox::information(this, tr("Clear Successful"),
tr("The imported sysdata directory was cleared successfully."));
}
void GMainWindow::OnImportDirectorySystemUpdate() {
Core::System& system{Core::System::GetInstance()};
const auto dir = QFileDialog::getExistingDirectory(this, tr("Select System Update Directory"));
if (dir.isEmpty()) {
return;
}
const auto vdir = vfs->OpenDirectory(dir.toStdString(), FileSys::Mode::Read);
if (FileSys::SystemArchive::ImportDirectorySystemUpdate(
system.GetFileSystemController().GetSysdataImportedDirectory(), vdir)) {
QMessageBox::information(this, tr("Import Successful"),
tr("The system update import was successful."));
} else {
QMessageBox::warning(this, tr("Import Failed"), tr("The system update import failed."));
}
}
void GMainWindow::OnImportCartridgeSystemUpdate() {
Core::System& system{Core::System::GetInstance()};
const auto file = QFileDialog::getOpenFileName(this, tr("Select Cartridge File"), QString{},
QStringLiteral("Cartridge Images (*.xci)"));
if (file.isEmpty()) {
return;
}
FileSys::XCI xci{vfs->OpenFile(file.toStdString(), FileSys::Mode::Read)};
if (FileSys::SystemArchive::ImportXCISystemUpdate(
system.GetFileSystemController().GetSysdataImportedDirectory(), xci)) {
QMessageBox::information(this, tr("Import Successful"),
tr("The system update import was successful."));
} else {
QMessageBox::warning(this, tr("Import Failed"), tr("The system update import failed."));
}
}
void GMainWindow::OnViewSystemArchiveStatus() {
Core::System& system{Core::System::GetInstance()};
system.GetFileSystemController().CreateFactories(*vfs);
SystemArchiveDialog dialog(this, system.GetFileSystemController());
dialog.exec();
}
void GMainWindow::OnGameListOpenDirectory(const QString& directory) {
QString path;
if (directory == QStringLiteral("SDMC")) {

View File

@@ -190,6 +190,10 @@ private slots:
void OnGameListCopyTID(u64 program_id);
void OnGameListNavigateToGamedbEntry(u64 program_id,
const CompatibilityList& compatibility_list);
void OnClearImportedSysdata();
void OnImportDirectorySystemUpdate();
void OnImportCartridgeSystemUpdate();
void OnViewSystemArchiveStatus();
void OnGameListOpenDirectory(const QString& directory);
void OnGameListAddDirectory();
void OnGameListShowList(bool show);

View File

@@ -104,9 +104,22 @@
<property name="title">
<string>Tools</string>
</property>
<widget class="QMenu" name="menuSystem_Archives">
<property name="title">
<string>System Archives</string>
</property>
<addaction name="actionImport_Directory"/>
<addaction name="actionImport_Cartridge"/>
<addaction name="separator"/>
<addaction name="actionClear_Imported"/>
<addaction name="separator"/>
<addaction name="actionView_Status"/>
</widget>
<addaction name="action_Rederive"/>
<addaction name="separator"/>
<addaction name="action_Capture_Screenshot"/>
<addaction name="separator"/>
<addaction name="menuSystem_Archives"/>
</widget>
<widget class="QMenu" name="menu_Help">
<property name="title">
@@ -293,6 +306,26 @@
<string>Capture Screenshot</string>
</property>
</action>
<action name="actionImport_Directory">
<property name="text">
<string>Import Directory</string>
</property>
</action>
<action name="actionImport_Cartridge">
<property name="text">
<string>Import Cartridge</string>
</property>
</action>
<action name="actionClear_Imported">
<property name="text">
<string>Clear Imported</string>
</property>
</action>
<action name="actionView_Status">
<property name="text">
<string>View Status</string>
</property>
</action>
</widget>
<resources/>
<connections/>