Просмотр исходного кода

Improvements for MRU

avoid duplicates
always put the last file loaded to top of the list
LittleWhite 11 лет назад
Родитель
Сommit
adee93d784
2 измененных файлов с 33 добавлено и 11 удалено
  1. 15 11
      src/citra_qt/main.cpp
  2. 18 0
      src/citra_qt/main.h

+ 15 - 11
src/citra_qt/main.cpp

@@ -287,6 +287,17 @@ void GMainWindow::ShutdownGame() {
     render_window->hide();
     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() {
 void GMainWindow::UpdateRecentFiles() {
     QSettings settings;
     QSettings settings;
     QStringList recent_files = settings.value("recentFiles").toStringList();
     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());
         QString text = QString("&%1. %2").arg(i + 1).arg(QFileInfo(recent_files[i]).fileName());
         actions_recent_files[i]->setText(text);
         actions_recent_files[i]->setText(text);
         actions_recent_files[i]->setData(recent_files[i]);
         actions_recent_files[i]->setData(recent_files[i]);
+        actions_recent_files[i]->setToolTip(recent_files[i]);
         actions_recent_files[i]->setVisible(true);
         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)"));
     QString filename = QFileDialog::getOpenFileName(this, tr("Load File"), rom_path, tr("3DS executable (*.3ds *.3dsx *.elf *.axf *.cci *.cxi)"));
     if (filename.size()) {
     if (filename.size()) {
         settings.setValue("romsPath", QFileInfo(filename).path());
         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());
         BootGame(filename.toLatin1().data());
     }
     }
@@ -349,6 +357,7 @@ void GMainWindow::OnMenuRecentFile() {
     QFileInfo file_info(filename);
     QFileInfo file_info(filename);
     if (file_info.exists()) {
     if (file_info.exists()) {
         BootGame(filename.toLatin1().data());
         BootGame(filename.toLatin1().data());
+        StoreRecentFile(filename); // Put the filename on top of the list
     } else {
     } else {
         // Display an error message and remove the file from the list.
         // 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));
         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();
         QStringList recent_files = settings.value("recentFiles").toStringList();
         recent_files.removeOne(filename);
         recent_files.removeOne(filename);
         settings.setValue("recentFiles", recent_files);
         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();
     }
     }
 }
 }
 
 

+ 18 - 0
src/citra_qt/main.h

@@ -60,6 +60,24 @@ private:
     void BootGame(const std::string& filename);
     void BootGame(const std::string& filename);
     void ShutdownGame();
     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 UpdateRecentFiles();
 
 
     void closeEvent(QCloseEvent* event) override;
     void closeEvent(QCloseEvent* event) override;