소스 검색

Add 'Open Recent' to mapeditor

Joakim Thorén 11 달 전
부모
커밋
e9e129263a
5개의 변경된 파일80개의 추가작업 그리고 0개의 파일을 삭제
  1. BIN
      mapeditor/icons/document-open-recent.png
  2. 64 0
      mapeditor/mainwindow.cpp
  3. 5 0
      mapeditor/mainwindow.h
  4. 10 0
      mapeditor/mainwindow.ui
  5. 1 0
      mapeditor/resources.qrc

BIN
mapeditor/icons/document-open-recent.png


+ 64 - 0
mapeditor/mainwindow.cpp

@@ -16,6 +16,9 @@
 #include <QFile>
 #include <QMessageBox>
 #include <QFileInfo>
+#include <qdialog.h>
+#include <qlistwidget.h>
+#include <qnamespace.h>
 
 #include "../lib/VCMIDirs.h"
 #include "../lib/VCMI_Lib.h"
@@ -222,6 +225,7 @@ MainWindow::MainWindow(QWidget* parent) :
 	ui->toolFill->setIcon(QIcon{":/icons/tool-fill.png"});
 	ui->toolSelect->setIcon(QIcon{":/icons/tool-select.png"});
 	ui->actionOpen->setIcon(QIcon{":/icons/document-open.png"});
+	ui->actionOpenRecent->setIcon(QIcon{":/icons/document-open-recent.png"});
 	ui->actionSave->setIcon(QIcon{":/icons/document-save.png"});
 	ui->actionNew->setIcon(QIcon{":/icons/document-new.png"});
 	ui->actionLevel->setIcon(QIcon{":/icons/toggle-underground.png"});
@@ -412,9 +416,21 @@ bool MainWindow::openMap(const QString & filenameSelect)
 	
 	filename = filenameSelect;
 	initializeMap(controller.map()->version != EMapFormat::VCMI);
+
+	updateRecentMenu(filenameSelect);
+
 	return true;
 }
 
+void MainWindow::updateRecentMenu(const QString & filenameSelect) {
+	QSettings s(Ui::teamName, Ui::appName);
+	QStringList recentFiles = s.value(recentlyOpenedFilesSetting).toStringList();
+	recentFiles.removeAll(filenameSelect);
+	recentFiles.prepend(filenameSelect);
+	constexpr int maxRecentFiles = 10;
+	s.setValue(recentlyOpenedFilesSetting, QStringList(recentFiles.mid(0, maxRecentFiles)));
+}
+
 void MainWindow::on_actionOpen_triggered()
 {
 	if(!getAnswerAboutUnsavedChanges())
@@ -429,6 +445,54 @@ void MainWindow::on_actionOpen_triggered()
 	openMap(filenameSelect);
 }
 
+void MainWindow::on_actionOpenRecent_triggered()
+{
+	if(!getAnswerAboutUnsavedChanges())
+		return;
+
+	QSettings s(Ui::teamName, Ui::appName);
+	QStringList recentFiles = s.value(recentlyOpenedFilesSetting).toStringList();
+
+	struct RecentFileDialog : public QDialog {
+		
+		RecentFileDialog(QWidget *parent, const QStringList& recentFiles) : QDialog(parent), layout(this) {
+
+			setWindowTitle("Recently Opened Files");
+			setMinimumWidth(600);
+
+			for (const QString &file : recentFiles) {
+				QListWidgetItem *item = new QListWidgetItem(file);
+				listWidget.addItem(item);
+			}
+
+			// Select most recent items by default.
+			// This enables a "CTRL+R => Enter"-workflow instead of "CTRL+R => 'mouse click on first item'"
+			if(listWidget.count() > 0) {
+				listWidget.item(0)->setSelected(true);
+			}
+
+			layout.setSizeConstraint(QLayout::SetMaximumSize);
+			layout.addWidget(&listWidget);
+		}
+
+		QVBoxLayout layout;
+		QListWidget listWidget;
+	};
+
+	RecentFileDialog d(this, recentFiles);
+
+	auto onSelect = [this, &d](QListWidgetItem *item) {
+		QString filename = item->text();
+		openMap(filename);
+		d.close();
+	};
+
+	connect(&d.listWidget, &QListWidget::itemDoubleClicked, this, onSelect);
+	connect(&d.listWidget, &QListWidget::itemActivated, this, onSelect);
+
+	d.exec();
+}
+
 void MainWindow::saveMap()
 {
 	if(!controller.map())

+ 5 - 0
mapeditor/mainwindow.h

@@ -28,6 +28,7 @@ class MainWindow : public QMainWindow
 	const QString mainWindowSizeSetting = "MainWindow/Size";
 	const QString mainWindowPositionSetting = "MainWindow/Position";
 	const QString lastDirectorySetting = "MainWindow/Directory";
+	const QString recentlyOpenedFilesSetting = "MainWindow/RecentlyOpenedFiles";
 
 #ifdef ENABLE_QT_TRANSLATIONS
 	QTranslator translator;
@@ -58,6 +59,8 @@ public:
 
 private slots:
 	void on_actionOpen_triggered();
+	
+	void on_actionOpenRecent_triggered();
 
 	void on_actionSave_as_triggered();
 
@@ -170,6 +173,8 @@ private:
 
 	void parseCommandLine(ExtractionOptions & extractionOptions);
 
+	void updateRecentMenu(const QString & filenameSelect);
+
 private:
     Ui::MainWindow * ui;
 	ObjectBrowserProxyModel * objectBrowser = nullptr;

+ 10 - 0
mapeditor/mainwindow.ui

@@ -60,6 +60,7 @@
     </property>
     <addaction name="actionNew"/>
     <addaction name="actionOpen"/>
+    <addaction name="actionOpenRecent"/>
     <addaction name="actionSave"/>
     <addaction name="actionSave_as"/>
     <addaction name="actionExport"/>
@@ -133,6 +134,7 @@
    </attribute>
    <addaction name="actionNew"/>
    <addaction name="actionOpen"/>
+   <addaction name="actionOpenRecent"/>
    <addaction name="actionSave"/>
    <addaction name="separator"/>
    <addaction name="actionUndo"/>
@@ -1019,6 +1021,14 @@
     <string notr="true">Ctrl+O</string>
    </property>
   </action>
+  <action name="actionOpenRecent">
+    <property name="text">
+     <string>Open Recent</string>
+    </property>
+    <property name="shortcut">
+     <string notr="true">Ctrl+R</string>
+    </property>
+   </action>
   <action name="actionSave">
    <property name="text">
     <string>Save</string>

+ 1 - 0
mapeditor/resources.qrc

@@ -5,6 +5,7 @@
         <file>icons/brush-4.png</file>
         <file>icons/document-new.png</file>
         <file>icons/document-open.png</file>
+        <file>icons/document-open-recent.png</file>
         <file>icons/document-save.png</file>
         <file>icons/edit-clear.png</file>
         <file>icons/edit-copy.png</file>