diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 2630e0507..abae7a5e2 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -282,17 +282,7 @@ void GameController::openGame(bool biosOnly) { m_threadContext.gameDir = VDirOpen(m_threadContext.fname); m_threadContext.stateDir = m_threadContext.gameDir; } else { - m_threadContext.rom = VFileOpen(m_threadContext.fname, O_RDONLY); -#if USE_LIBZIP - if (!m_threadContext.gameDir) { - m_threadContext.gameDir = VDirOpenZip(m_threadContext.fname, 0); - } -#endif -#if USE_LZMA - if (!m_threadContext.gameDir) { - m_threadContext.gameDir = VDirOpen7z(m_threadContext.fname, 0); - } -#endif + GBAThreadLoadROM(&m_threadContext, m_threadContext.fname); } } @@ -334,6 +324,19 @@ void GameController::yankPak() { threadContinue(); } + +void GameController::replaceGame(const QString& path) { + if (!m_gameOpen) { + return; + } + + m_fname = path; + threadInterrupt(); + m_threadContext.fname = strdup(m_fname.toLocal8Bit().constData()); + GBAThreadReplaceROM(&m_threadContext, m_threadContext.fname); + threadContinue(); +} + void GameController::loadPatch(const QString& path) { if (m_gameOpen) { closeGame(); diff --git a/src/platform/qt/GameController.h b/src/platform/qt/GameController.h index cc8ae2872..e80769dca 100644 --- a/src/platform/qt/GameController.h +++ b/src/platform/qt/GameController.h @@ -98,6 +98,7 @@ public slots: void loadGame(const QString& path, bool dirmode = false); void loadBIOS(const QString& path); void yankPak(); + void replaceGame(const QString& path); void setSkipBIOS(bool); void setUseBIOS(bool); void loadPatch(const QString& path); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index b7e56f421..d7e5c6662 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -230,6 +230,24 @@ void Window::selectROM() { } } +void Window::replaceROM() { + QStringList formats{ + "*.gba", +#ifdef USE_LIBZIP + "*.zip", +#endif +#ifdef USE_LZMA + "*.7z", +#endif + "*.rom", + "*.bin"}; + QString filter = tr("Game Boy Advance ROMs (%1)").arg(formats.join(QChar(' '))); + QString filename = GBAApp::app()->getOpenFileName(this, tr("Select ROM"), filter); + if (!filename.isEmpty()) { + m_controller->replaceGame(filename); + } +} + void Window::selectBIOS() { QString filename = GBAApp::app()->getOpenFileName(this, tr("Select BIOS")); if (!filename.isEmpty()) { @@ -615,6 +633,8 @@ void Window::setupMenu(QMenuBar* menubar) { addControlledAction(fileMenu, fileMenu->addAction(tr("Load &patch..."), this, SLOT(selectPatch())), "loadPatch"); addControlledAction(fileMenu, fileMenu->addAction(tr("Boot BIOS"), m_controller, SLOT(bootBIOS())), "bootBIOS"); + addControlledAction(fileMenu, fileMenu->addAction(tr("Replace ROM..."), this, SLOT(replaceROM())), "replaceROM"); + m_mruMenu = fileMenu->addMenu(tr("Recent")); fileMenu->addSeparator(); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 6e8cdde16..a7536322c 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -65,6 +65,8 @@ public slots: void loadConfig(); void saveConfig(); + void replaceROM(); + void importSharkport(); void exportSharkport();