From 332fbcfff184b98f8e6a521e7b8e834d89414177 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Tue, 7 May 2024 23:55:32 +0300 Subject: [PATCH] Qt: Add patching errors --- CMakeLists.txt | 2 +- docs/img/rpog_icon.png | Bin 0 -> 26925 bytes include/panda_qt/patch_window.hpp | 10 +++++++ src/panda_qt/patch_window.cpp | 45 ++++++++++++++++++++++++++---- 4 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 docs/img/rpog_icon.png diff --git a/CMakeLists.txt b/CMakeLists.txt index dca69d6b..88ad6aeb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -486,7 +486,7 @@ if(NOT BUILD_HYDRA_CORE) qt_add_resources(AlberCore "app_images" PREFIX "/" FILES - docs/img/rsob_icon.png docs/img/rstarstruck_icon.png + docs/img/rsob_icon.png docs/img/rstarstruck_icon.png docs/img/rpog_icon.png ) else() set(FRONTEND_SOURCE_FILES src/panda_sdl/main.cpp src/panda_sdl/frontend_sdl.cpp src/panda_sdl/mappings.cpp) diff --git a/docs/img/rpog_icon.png b/docs/img/rpog_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5426aed8a19dd97e2727087a0e44494574fab2f GIT binary patch literal 26925 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 literal 0 HcmV?d00001 diff --git a/include/panda_qt/patch_window.hpp b/include/panda_qt/patch_window.hpp index 652c9a23..06676a66 100644 --- a/include/panda_qt/patch_window.hpp +++ b/include/panda_qt/patch_window.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include @@ -13,6 +14,15 @@ class PatchWindow final : public QWidget { ~PatchWindow() = default; private: + // Show a message box + // Title: Title of the message box to display + // Message: Message to display + // Icon: The type of icon (error, warning, information, etc) to display + // IconPath: If non-null, then a path to an icon in our assets to display on the OK button + void displayMessage( + const QString& title, const QString& message, QMessageBox::Icon icon = QMessageBox::Icon::Warning, const char* iconPath = nullptr + ); + std::filesystem::path inputPath = ""; std::filesystem::path patchPath = ""; diff --git a/src/panda_qt/patch_window.cpp b/src/panda_qt/patch_window.cpp index 98983865..de5cd277 100644 --- a/src/panda_qt/patch_window.cpp +++ b/src/panda_qt/patch_window.cpp @@ -1,7 +1,9 @@ #include "panda_qt/patch_window.hpp" +#include #include #include +#include #include #include #include @@ -64,15 +66,20 @@ PatchWindow::PatchWindow(QWidget* parent) : QWidget(parent, Qt::Window) { connect(applyPatchButton, &QPushButton::clicked, this, [this]() { if (inputPath.empty() || patchPath.empty()) { - printf("Pls set paths properly"); + displayMessage(tr("Paths not provided correctly"), tr("Please provide paths for both the input file and the patch file")); return; } - auto path = QFileDialog::getSaveFileName(this, tr("Select file"), QString::fromStdU16String(inputPath.u16string()), tr("All files (*.*)")); + // std::filesystem::path only has += and not + for reasons unknown to humanity + auto defaultPath = inputPath.parent_path() / inputPath.stem(); + defaultPath += "-patched"; + defaultPath += inputPath.extension(); + + auto path = QFileDialog::getSaveFileName(this, tr("Select file"), QString::fromStdU16String(defaultPath.u16string()), tr("All files (*.*)")); std::filesystem::path outputPath = std::filesystem::path(path.toStdU16String()); if (outputPath.empty()) { - printf("Pls set paths properly"); + displayMessage(tr("No output path"), tr("No path was provided for the output file, no patching was done")); return; } @@ -87,7 +94,7 @@ PatchWindow::PatchWindow(QWidget* parent) : QWidget(parent, Qt::Window) { } else if (extension == ".bps") { patchType = Hips::PatchType::BPS; } else { - printf("Unknown patch format\n"); + displayMessage(tr("Unknown patch format"), tr("Unknown format for patch file. Currently IPS, UPS and BPS are supported")); return; } @@ -96,7 +103,7 @@ PatchWindow::PatchWindow(QWidget* parent) : QWidget(parent, Qt::Window) { IOFile patch(patchPath, "rb"); if (!input.isOpen() || !patch.isOpen()) { - printf("Failed to open input or patch file.\n"); + displayMessage(tr("Failed to open input files"), tr("Make sure they're in a directory Panda3DS has access to")); return; } @@ -119,5 +126,33 @@ PatchWindow::PatchWindow(QWidget* parent) : QWidget(parent, Qt::Window) { IOFile output(outputPath, "wb"); output.writeBytes(bytes.data(), bytes.size()); } + + switch (result) { + case Hips::Result::Success: + displayMessage( + tr("Patching Success"), tr("Your file was patched successfully."), QMessageBox::Icon::Information, ":/docs/img/rpog_icon.png" + ); + break; + + case Hips::Result::ChecksumMismatch: + displayMessage( + tr("Checksum mismatch"), + tr("Patch was applied successfully but a checksum mismatch was detected. The input or output files might not be correct") + ); + break; + + default: displayMessage(tr("Patching error"), tr("An error occured while patching")); break; + } }); +} + +void PatchWindow::PatchWindow::displayMessage(const QString& title, const QString& message, QMessageBox::Icon icon, const char* iconPath) { + QMessageBox messageBox(icon, title, message); + QAbstractButton* button = messageBox.addButton(tr("OK"), QMessageBox::ButtonRole::YesRole); + + if (iconPath != nullptr) { + button->setIcon(QIcon(iconPath)); + } + + messageBox.exec(); } \ No newline at end of file