From e485ce3e1323205925ce6a5d15c077d29a012302 Mon Sep 17 00:00:00 2001 From: WaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com> Date: Thu, 7 Jan 2021 17:26:55 +0000 Subject: [PATCH] Add Open ROM inside Archive function instead of using file extensions --- src/frontend/qt_sdl/main.cpp | 109 ++++++++++++++++++++--------------- src/frontend/qt_sdl/main.h | 2 + 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 1897743f..1015800e 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -1028,6 +1027,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) actOpenROM = menu->addAction("Open ROM..."); connect(actOpenROM, &QAction::triggered, this, &MainWindow::onOpenFile); + + actOpenROMArchive = menu->addAction("Open ROM inside Archive..."); + connect(actOpenROMArchive, &QAction::triggered, this, &MainWindow::onOpenFileArchive); recentMenu = menu->addMenu("Open Recent"); for(int i = 0; i < 10; ++i) @@ -1470,52 +1472,6 @@ void MainWindow::loadROM(QString filename) recentFileList.removeAll(filename); recentFileList.prepend(filename); updateRecentFilesMenu(); - - - static const QSet compressedExts = {"zip", "7z", "rar", "tar", "tar.gz", "tar.xz", "tar.bz2"}; - if (compressedExts.contains(QFileInfo(filename).completeSuffix())) - { - printf("Finding list of ROMs...\n"); - QVector archiveROMList = Archive::ListArchive(filename.toUtf8().constData()); - if (archiveROMList.size() > 2) - { - archiveROMList.removeFirst(); - QString toLoad = QInputDialog::getItem(this, "melonDS", - "The archive was found to have multiple files. Select which ROM you want to load.", archiveROMList.toList(), 0, false); - printf("Extracting '%s'\n", toLoad.toUtf8().constData()); - QVector extractResult = Archive::ExtractFileFromArchive(filename.toUtf8().constData(), toLoad.toUtf8().constData()); - if (extractResult[0] != QString("Err")) - { - filename = extractResult[0]; - } - else - { - QMessageBox::critical(this, "melonDS", QString("There was an error while trying to extract the ROM from the archive: ") + extractResult[1]); - } - } - else if (archiveROMList.size() == 2) - { - printf("Extracting the only ROM in archive\n"); - QVector extractResult = Archive::ExtractFileFromArchive(filename.toUtf8().constData(), nullptr); - if (extractResult[0] != QString("Err")) - { - filename = extractResult[0]; - } - else - { - QMessageBox::critical(this, "melonDS", QString("There was an error while trying to extract the ROM from the archive: ") + extractResult[1]); - } - } - else if ((archiveROMList.size() == 1) && (archiveROMList[0] == QString("OK"))) - { - QMessageBox::warning(this, "melonDS", "The archive is intact, but there are no files inside."); - } - else - { - QMessageBox::critical(this, "melonDS", "The archive could not be read. It may be corrupt or you don't have the permissions."); - } - - } // TODO: validate the input file!! // * check that it is a proper ROM @@ -1569,7 +1525,7 @@ void MainWindow::onOpenFile() QString filename = QFileDialog::getOpenFileName(this, "Open ROM", Config::LastROMFolder, - "DS ROMs (*.nds *.dsi *.srl *.zip *.7z);;GBA ROMs (*.gba *.zip *.7z);;Other Compressed ROMs (*.zip *.7z *.rar *.tar *.tar.gz *.tar.xz *tar.bz2);;Any file (*.*)"); + "DS ROMs (*.nds *.dsi *.srl);;GBA ROMs (*.gba *.zip);;Any file (*.*)"); if (filename.isEmpty()) { emuThread->emuUnpause(); @@ -1579,6 +1535,63 @@ void MainWindow::onOpenFile() loadROM(filename); } +void MainWindow::onOpenFileArchive() +{ + emuThread->emuPause(); + + QString filename = QFileDialog::getOpenFileName(this, + "Open ROM Archive", + Config::LastROMFolder, + "Archived ROMs (*.zip *.7z *.rar *.tar *.tar.gz *.tar.xz *.tar.bz2);;Any file (*.*)"); + if (filename.isEmpty()) + { + emuThread->emuUnpause(); + return; + } + + printf("Finding list of ROMs...\n"); + QVector archiveROMList = Archive::ListArchive(filename.toUtf8().constData()); + if (archiveROMList.size() > 2) + { + archiveROMList.removeFirst(); + QString toLoad = QInputDialog::getItem(this, "melonDS", + "The archive was found to have multiple files. Select which ROM you want to load.", archiveROMList.toList(), 0, false); + printf("Extracting '%s'\n", toLoad.toUtf8().constData()); + QVector extractResult = Archive::ExtractFileFromArchive(filename.toUtf8().constData(), toLoad.toUtf8().constData()); + if (extractResult[0] != QString("Err")) + { + filename = extractResult[0]; + } + else + { + QMessageBox::critical(this, "melonDS", QString("There was an error while trying to extract the ROM from the archive: ") + extractResult[1]); + } + } + else if (archiveROMList.size() == 2) + { + printf("Extracting the only ROM in archive\n"); + QVector extractResult = Archive::ExtractFileFromArchive(filename.toUtf8().constData(), nullptr); + if (extractResult[0] != QString("Err")) + { + filename = extractResult[0]; + } + else + { + QMessageBox::critical(this, "melonDS", QString("There was an error while trying to extract the ROM from the archive: ") + extractResult[1]); + } + } + else if ((archiveROMList.size() == 1) && (archiveROMList[0] == QString("OK"))) + { + QMessageBox::warning(this, "melonDS", "The archive is intact, but there are no files inside."); + } + else + { + QMessageBox::critical(this, "melonDS", "The archive could not be read. It may be corrupt or you don't have the permissions."); + } + + loadROM(filename); +} + void MainWindow::onClearRecentFiles() { recentFileList.clear(); diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index d31e7069..97f514bb 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -191,6 +191,7 @@ signals: private slots: void onOpenFile(); + void onOpenFileArchive(); void onClickRecentFile(); void onClearRecentFiles(); void onBootFirmware(); @@ -251,6 +252,7 @@ public: QWidget* panel; QAction* actOpenROM; + QAction* actOpenROMArchive; QAction* actBootFirmware; QAction* actSaveState[9]; QAction* actLoadState[9];