aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com>2021-01-07 17:26:55 +0000
committerWaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com>2021-01-07 17:26:55 +0000
commite485ce3e1323205925ce6a5d15c077d29a012302 (patch)
tree5bbf011caa07a138e5bbda704318ab8499c51ba9
parent8a1f3d8ce2996d1c543da9e9f091d75ca4777454 (diff)
Add Open ROM inside Archive function
instead of using file extensions
-rw-r--r--src/frontend/qt_sdl/main.cpp109
-rw-r--r--src/frontend/qt_sdl/main.h2
2 files changed, 63 insertions, 48 deletions
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index 1897743..1015800 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -34,7 +34,6 @@
#include <QPainter>
#include <QKeyEvent>
#include <QMimeData>
-#include <QSet>
#include <QVector>
#include <SDL2/SDL.h>
@@ -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<QString> compressedExts = {"zip", "7z", "rar", "tar", "tar.gz", "tar.xz", "tar.bz2"};
- if (compressedExts.contains(QFileInfo(filename).completeSuffix()))
- {
- printf("Finding list of ROMs...\n");
- QVector<QString> 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<QString> 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<QString> 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<QString> 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<QString> 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<QString> 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 d31e706..97f514b 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];