Improvements for MRU
avoid duplicates always put the last file loaded to top of the list
This commit is contained in:
		| @@ -287,6 +287,17 @@ void GMainWindow::ShutdownGame() { | ||||
|     render_window->hide(); | ||||
| } | ||||
|  | ||||
| void GMainWindow::StoreRecentFile(const QString& filename) | ||||
| { | ||||
|     QSettings settings; | ||||
|     QStringList recent_files = settings.value("recentFiles").toStringList(); | ||||
|     recent_files.prepend(filename); | ||||
|     recent_files.removeDuplicates(); | ||||
|     settings.setValue("recentFiles", recent_files); | ||||
|  | ||||
|     UpdateRecentFiles(); | ||||
| } | ||||
|  | ||||
| void GMainWindow::UpdateRecentFiles() { | ||||
|     QSettings settings; | ||||
|     QStringList recent_files = settings.value("recentFiles").toStringList(); | ||||
| @@ -297,6 +308,7 @@ void GMainWindow::UpdateRecentFiles() { | ||||
|         QString text = QString("&%1. %2").arg(i + 1).arg(QFileInfo(recent_files[i]).fileName()); | ||||
|         actions_recent_files[i]->setText(text); | ||||
|         actions_recent_files[i]->setData(recent_files[i]); | ||||
|         actions_recent_files[i]->setToolTip(recent_files[i]); | ||||
|         actions_recent_files[i]->setVisible(true); | ||||
|     } | ||||
|  | ||||
| @@ -319,11 +331,7 @@ void GMainWindow::OnMenuLoadFile() { | ||||
|     QString filename = QFileDialog::getOpenFileName(this, tr("Load File"), rom_path, tr("3DS executable (*.3ds *.3dsx *.elf *.axf *.cci *.cxi)")); | ||||
|     if (filename.size()) { | ||||
|         settings.setValue("romsPath", QFileInfo(filename).path()); | ||||
|         // Update recent files list | ||||
|         QStringList recent_files = settings.value("recentFiles").toStringList(); | ||||
|         recent_files.prepend(filename); | ||||
|         settings.setValue("recentFiles", recent_files); | ||||
|         UpdateRecentFiles(); // Update UI | ||||
|         StoreRecentFile(filename); | ||||
|  | ||||
|         BootGame(filename.toLatin1().data()); | ||||
|     } | ||||
| @@ -349,6 +357,7 @@ void GMainWindow::OnMenuRecentFile() { | ||||
|     QFileInfo file_info(filename); | ||||
|     if (file_info.exists()) { | ||||
|         BootGame(filename.toLatin1().data()); | ||||
|         StoreRecentFile(filename); // Put the filename on top of the list | ||||
|     } else { | ||||
|         // Display an error message and remove the file from the list. | ||||
|         QMessageBox::information(this, tr("File not found"), tr("File \"%1\" not found").arg(filename)); | ||||
| @@ -357,12 +366,7 @@ void GMainWindow::OnMenuRecentFile() { | ||||
|         QStringList recent_files = settings.value("recentFiles").toStringList(); | ||||
|         recent_files.removeOne(filename); | ||||
|         settings.setValue("recentFiles", recent_files); | ||||
|  | ||||
|         action->setVisible(false); | ||||
|         // Grey out the recent files menu if the list is empty | ||||
|         if (ui.menu_recent_files->isEmpty()) { | ||||
|             ui.menu_recent_files->setEnabled(false); | ||||
|         } | ||||
|         UpdateRecentFiles(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -60,6 +60,24 @@ private: | ||||
|     void BootGame(const std::string& filename); | ||||
|     void ShutdownGame(); | ||||
|  | ||||
|     /** | ||||
|      * Stores the filename in the recently loaded files list. | ||||
|      * The new filename is stored at the beginning of the recently loaded files list. | ||||
|      * After inserting the new entry, duplicates are removed meaning that if | ||||
|      * this was inserted from \a OnMenuRecentFile(), the entry will be put on top | ||||
|      * and remove from its previous position. | ||||
|      * | ||||
|      * Finally, this function calls \a UpdateRecentFiles() to update the UI. | ||||
|      * | ||||
|      * @param filename the filename to store | ||||
|      */ | ||||
|     void StoreRecentFile(const QString& filename); | ||||
|  | ||||
|     /** | ||||
|      * Updates the recent files menu. | ||||
|      * Menu entries are rebuilt from the configuration file. | ||||
|      * If there is no entry in the menu, the menu is greyed out. | ||||
|      */ | ||||
|     void UpdateRecentFiles(); | ||||
|  | ||||
|     void closeEvent(QCloseEvent* event) override; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user