From e6754c87babadbb3020cb3b6d9607f0b0b6dff45 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Fri, 19 Feb 2021 20:46:27 -0500 Subject: [PATCH] Added a recent ROMs sub menu to the Qt main menu. --- src/drivers/Qt/ConsoleWindow.cpp | 168 +++++++++++++++++++++++++++++-- src/drivers/Qt/ConsoleWindow.h | 24 +++++ src/drivers/Qt/config.cpp | 8 ++ src/drivers/Qt/fceuWrapper.cpp | 5 + 4 files changed, 198 insertions(+), 7 deletions(-) diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index 1eaee23d..face61ad 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -118,13 +118,13 @@ consoleWin_t::consoleWin_t(QWidget *parent) { viewport_SDL = new ConsoleViewSDL_t(this); - setCentralWidget(viewport_SDL); + setCentralWidget(viewport_SDL); } else { viewport_GL = new ConsoleViewGL_t(this); - setCentralWidget(viewport_GL); + setCentralWidget(viewport_GL); } setWindowTitle( tr(FCEU_NAME_AND_VERSION) ); @@ -159,6 +159,8 @@ consoleWin_t::consoleWin_t(QWidget *parent) setSchedParam( policy, prio ); #endif } + + recentRomMenuReset = false; } consoleWin_t::~consoleWin_t(void) @@ -225,6 +227,8 @@ consoleWin_t::~consoleWin_t(void) clipboard->clear( QClipboard::Selection ); } + clearRomList(); + if ( this == consoleWindow ) { consoleWindow = NULL; @@ -262,10 +266,10 @@ void consoleWin_t::QueueErrorMsgWindow( const char *msg ) void consoleWin_t::closeEvent(QCloseEvent *event) { - //printf("Main Window Close Event\n"); + //printf("Main Window Close Event\n"); closeGamePadConfWindow(); - event->accept(); + event->accept(); closeApp(); } @@ -277,13 +281,13 @@ void consoleWin_t::requestClose(void) void consoleWin_t::keyPressEvent(QKeyEvent *event) { - //printf("Key Press: 0x%x \n", event->key() ); + //printf("Key Press: 0x%x \n", event->key() ); pushKeyEvent( event, 1 ); } void consoleWin_t::keyReleaseEvent(QKeyEvent *event) { - //printf("Key Release: 0x%x \n", event->key() ); + //printf("Key Release: 0x%x \n", event->key() ); pushKeyEvent( event, 0 ); } @@ -330,6 +334,11 @@ void consoleWin_t::createMainMenu(void) fileMenu->addAction(closeROM); + // File -> Recent ROMs + recentRomMenu = fileMenu->addMenu( tr("&Recent ROMs") ); + + buildRecentRomMenu(); + fileMenu->addSeparator(); // File -> Play NSF @@ -392,7 +401,7 @@ void consoleWin_t::createMainMenu(void) state[i]->setCheckable(true); group->addAction(state[i]); - subMenu->addAction(state[i]); + subMenu->addAction(state[i]); } state[0]->setChecked(true); @@ -936,6 +945,120 @@ void consoleWin_t::createMainMenu(void) helpMenu->addAction(act); }; //--------------------------------------------------------------------------- +void consoleWin_t::clearRomList(void) +{ + std::list ::iterator it; + + for (it=romList.begin(); it != romList.end(); it++) + { + delete *it; + } + romList.clear(); +} +//--------------------------------------------------------------------------- +void consoleWin_t::buildRecentRomMenu(void) +{ + QAction *act; + std::string s; + std::string *sptr; + char buf[128]; + + clearRomList(); + recentRomMenu->clear(); + + for (int i=0; i<10; i++) + { + sprintf(buf, "SDL.RecentRom%02i", i); + + g_config->getOption( buf, &s); + + //printf("Recent Rom:%i '%s'\n", i, s.c_str() ); + + if ( s.size() > 0 ) + { + act = new consoleRecentRomAction( tr(s.c_str()), recentRomMenu); + + recentRomMenu->addAction( act ); + + connect(act, SIGNAL(triggered()), act, SLOT(activateCB(void)) ); + + sptr = new std::string(); + + sptr->assign( s.c_str() ); + + romList.push_front( sptr ); + } + } +} +//--------------------------------------------------------------------------- +void consoleWin_t::saveRecentRomMenu(void) +{ + int i; + std::string *s; + std::list ::iterator it; + char buf[128]; + + i = romList.size() - 1; + + for (it=romList.begin(); it != romList.end(); it++) + { + s = *it; + sprintf(buf, "SDL.RecentRom%02i", i); + + g_config->setOption( buf, s->c_str() ); + + //printf("Recent Rom:%u '%s'\n", i, s->c_str() ); + i--; + } +} +//--------------------------------------------------------------------------- +void consoleWin_t::addRecentRom( const char *rom ) +{ + std::string *s; + std::list ::iterator match_it; + + for (match_it=romList.begin(); match_it != romList.end(); match_it++) + { + s = *match_it; + + if ( s->compare( rom ) == 0 ) + { + //printf("Found Match: %s\n", rom ); + break; + } + } + + if ( match_it != romList.end() ) + { + s = *match_it; + + romList.erase(match_it); + + romList.push_back(s); + } + else + { + s = new std::string(); + + s->assign( rom ); + + romList.push_back(s); + + if ( romList.size() > 10 ) + { + s = romList.front(); + + romList.pop_front(); + + delete s; + } + } + + saveRecentRomMenu(); + + recentRomMenuReset = true; +} +//--------------------------------------------------------------------------- void consoleWin_t::toggleMenuVis(void) { if ( menubar->isVisible() ) @@ -2379,6 +2502,14 @@ void consoleWin_t::updatePeriodic(void) errorMsgValid = false; } + if ( recentRomMenuReset ) + { + fceuWrapperLock(); + buildRecentRomMenu(); + recentRomMenuReset = false; + fceuWrapperUnLock(); + } + if ( closeRequested ) { closeApp(); @@ -2630,3 +2761,26 @@ void consoleMenuBar::keyReleaseEvent(QKeyEvent *event) QMenuBar::keyReleaseEvent(event); } //----------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +consoleRecentRomAction::consoleRecentRomAction(QString desc, QWidget *parent) + : QAction( desc, parent ) +{ + path = desc.toStdString(); +} +//---------------------------------------------------------------------------- +consoleRecentRomAction::~consoleRecentRomAction(void) +{ + //printf("Recent ROM Menu Action Deleted\n"); +} +//---------------------------------------------------------------------------- +void consoleRecentRomAction::activateCB(void) +{ + printf("Activate Recent ROM: %s \n", path.c_str() ); + + fceuWrapperLock(); + CloseGame (); + LoadGame ( path.c_str() ); + fceuWrapperUnLock(); +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index 8ef7f994..e0309901 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -67,6 +67,21 @@ class consoleMenuBar : public QMenuBar void keyReleaseEvent(QKeyEvent *event); }; +class consoleRecentRomAction : public QAction +{ + Q_OBJECT + + public: + consoleRecentRomAction( QString title, QWidget *parent = 0); + ~consoleRecentRomAction(void); + + std::string path; + + public slots: + void activateCB(void); + +}; + class consoleWin_t : public QMainWindow { Q_OBJECT @@ -99,6 +114,8 @@ class consoleWin_t : public QMainWindow emulatorThread_t *emulatorThread; + void addRecentRom( const char *rom ); + protected: consoleMenuBar *menubar; @@ -109,6 +126,7 @@ class consoleWin_t : public QMainWindow QMenu *debugMenu; QMenu *movieMenu; QMenu *helpMenu; + QMenu *recentRomMenu; QAction *openROM; QAction *closeROM; @@ -166,6 +184,9 @@ class consoleWin_t : public QMainWindow std::string errorMsg; bool errorMsgValid; bool closeRequested; + bool recentRomMenuReset; + + std::list romList; protected: void closeEvent(QCloseEvent *event); @@ -176,6 +197,9 @@ class consoleWin_t : public QMainWindow private: void createMainMenu(void); + void buildRecentRomMenu(void); + void saveRecentRomMenu(void); + void clearRomList(void); public slots: void openDebugWindow(void); diff --git a/src/drivers/Qt/config.cpp b/src/drivers/Qt/config.cpp index c951f256..c453fe13 100644 --- a/src/drivers/Qt/config.cpp +++ b/src/drivers/Qt/config.cpp @@ -351,6 +351,14 @@ InitConfig() config->addOption("_lastopenmovie", "SDL.LastOpenMovie", movPath); config->addOption("_lastloadlua", "SDL.LastLoadLua", ""); + for (unsigned int i=0; i<10; i++) + { + char buf[128]; + sprintf(buf, "SDL.RecentRom%02u", i); + + config->addOption( buf, ""); + } + config->addOption("_useNativeFileDialog", "SDL.UseNativeFileDialog", false); config->addOption("_useNativeMenuBar" , "SDL.UseNativeMenuBar", false); diff --git a/src/drivers/Qt/fceuWrapper.cpp b/src/drivers/Qt/fceuWrapper.cpp index 290a61e7..53ab226e 100644 --- a/src/drivers/Qt/fceuWrapper.cpp +++ b/src/drivers/Qt/fceuWrapper.cpp @@ -266,6 +266,11 @@ int LoadGame(const char *path, bool silent) return 0; } + if ( consoleWindow ) + { + consoleWindow->addRecentRom( fullpath ); + } + hexEditorLoadBookmarks(); g_config->getOption( "SDL.AutoLoadDebugFiles", &autoLoadDebug );