diff options
Diffstat (limited to 'src/frontend/qt_sdl/main.cpp')
-rw-r--r-- | src/frontend/qt_sdl/main.cpp | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 33db28f..d30a6db 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -21,14 +21,20 @@ #include <stdio.h> #include <string.h> +#include <vector> +#include <string> +#include <algorithm> + #include <QApplication> #include <QMessageBox> #include <QMenuBar> #include <QFileDialog> +#include <QInputDialog> #include <QPaintEvent> #include <QPainter> #include <QKeyEvent> #include <QMimeData> +#include <QVector> #include <SDL2/SDL.h> @@ -63,6 +69,7 @@ #include "main_shaders.h" +#include "ArchiveUtil.h" // TODO: uniform variable spelling @@ -1020,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) @@ -1462,7 +1472,7 @@ void MainWindow::loadROM(QString filename) recentFileList.removeAll(filename); recentFileList.prepend(filename); updateRecentFilesMenu(); - + // TODO: validate the input file!! // * check that it is a proper ROM // * ensure the binary offsets are sane @@ -1515,13 +1525,70 @@ void MainWindow::onOpenFile() QString filename = QFileDialog::getOpenFileName(this, "Open ROM", Config::LastROMFolder, - "DS ROMs (*.nds *.dsi *.srl);;GBA ROMs (*.gba);;Any file (*.*)"); + "DS ROMs (*.nds *.dsi *.srl);;GBA ROMs (*.gba *.zip);;Any file (*.*)"); + if (filename.isEmpty()) + { + emuThread->emuUnpause(); + return; + } + + 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); } |