This patch adds recent files list into main menu.

It adds upto four filenames to the File menu.

Originally I intended to show tooltip of absolute pathname on menu item
mouse hover, but failed to do so(room for future improvements).
From db554bacdcf06944efe336b762581738fbd8dccc Mon Sep 17 00:00:00 2001
From: Boris Barbulovski <[email protected]>
Date: Thu, 13 Feb 2014 22:40:12 +0100
Subject: [PATCH] Add recent files to main menu.

Add(up to four) recent files to File main menu.

Signed-off-by: Boris Barbulovski <[email protected]>
---
 qt-gui.cpp           |   1 +
 qt-ui/mainwindow.cpp | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++
 qt-ui/mainwindow.h   |   3 +
 qt-ui/mainwindow.ui  |  26 ++++++++
 4 files changed, 193 insertions(+)

diff --git a/qt-gui.cpp b/qt-gui.cpp
index 314e419..f2ce42b 100644
--- a/qt-gui.cpp
+++ b/qt-gui.cpp
@@ -151,6 +151,7 @@ void init_ui(int *argcp, char ***argvp)
 	s.endGroup();
 
 	window = new MainWindow();
+	window->loadRecentFiles(&s);
 	window->show();
 	if (existing_filename && existing_filename[0] != '\0')
 		window->setTitle(MWTF_FILENAME);
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index 8795b93..0e9d5a0 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -17,6 +17,8 @@
 #include <QTableView>
 #include <QDesktopWidget>
 #include <QDesktopServices>
+#include <QStringList>
+#include <QSettings>
 #include "divelistview.h"
 #include "starwidget.h"
 
@@ -56,6 +58,10 @@ MainWindow::MainWindow() : QMainWindow(),
 	connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.divePlanner, SLOT(settingsChanged()));
 	connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.divePlannerWidget, SLOT(settingsChanged()));
 	connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), TankInfoModel::instance(), SLOT(update()));
+	connect(ui.actionRecent1, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
+	connect(ui.actionRecent2, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
+	connect(ui.actionRecent3, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
+	connect(ui.actionRecent4, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool)));
 
 	ui.mainErrorMessage->hide();
 	initialUiSetup();
@@ -688,6 +694,160 @@ MainTab* MainWindow::information()
 	return ui.InfoWidget;
 }
 
+void MainWindow::loadRecentFiles(QSettings *s)
+{
+	QStringList files;
+	bool modified = false;
+
+	s->beginGroup("Recent_Files");
+	for (int c = 1; c <= 4; c++)
+	{
+		QString key = QString("File_%1").arg(c);
+		if (s->contains(key))
+		{
+			QString file = s->value(key).toString();
+
+			if (QFile::exists(file))
+			{
+				files.append(file);
+			}
+			else
+			{
+				modified = true;
+			}
+		}
+		else
+		{
+			break;
+		}
+	}
+
+	if (modified)
+	{
+		for (int c = 0; c < 4; c++)
+		{
+			QString key = QString("File_%1").arg(c + 1);
+
+			if (files.count() > c)
+			{
+				s->setValue(key, files.at(c));
+			}
+			else
+			{
+				if (s->contains(key))
+				{
+					s->remove(key);
+				}
+			}
+		}
+
+		s->sync();
+	}
+	s->endGroup();
+
+	for (int c = 0; c < 4; c++)
+	{
+		QAction *action = this->findChild<QAction *>(QString("actionRecent%1").arg(c + 1));
+
+		if (files.count() > c)
+		{
+			QFileInfo fi(files.at(c));
+			action->setText(fi.fileName());
+			action->setToolTip(fi.absoluteFilePath());
+			action->setVisible(true);
+		}
+		else
+		{
+			action->setVisible(false);
+		}
+	}
+}
+
+void MainWindow::addRecentFile(const QStringList &newFiles)
+{
+	QStringList files;
+	QSettings s;
+
+	if (newFiles.isEmpty())
+	{
+		return;
+	}
+
+	s.beginGroup("Recent_Files");
+
+	for (int c = 1; c <= 4; c++)
+	{
+		QString key = QString("File_%1").arg(c);
+		if (s.contains(key))
+		{
+			QString file = s.value(key).toString();
+
+			files.append(file);
+		}
+		else
+		{
+			break;
+		}
+	}
+
+	foreach(const QString &file, newFiles)
+	{
+		int index = files.indexOf(file);
+
+		if (index >= 0)
+		{
+			files.removeAt(index);
+		}
+	}
+
+	foreach(const QString &file, newFiles)
+	{
+		if (QFile::exists(file))
+		{
+			files.prepend(file);
+		}
+	}
+
+	while(files.count() > 4)
+	{
+		files.removeLast();
+	}
+
+	for (int c = 0; c < 4; c++)
+	{
+		QString key = QString("File_%1").arg(c + 1);
+
+		if (files.count() > c)
+		{
+			s.setValue(key, files.at(c));
+		}
+		else
+		{
+			if (s.contains(key))
+			{
+				s.remove(key);
+			}
+		}
+	}
+	s.endGroup();
+	s.sync();
+
+	loadRecentFiles(&s);
+}
+
+void MainWindow::recentFileTriggered(bool checked)
+{
+	Q_UNUSED(checked);
+
+	QAction *actionRecent = (QAction *)sender();
+
+	const QString &filename = actionRecent->toolTip();
+
+	updateLastUsedDir(QFileInfo(filename).dir().path());
+	on_actionClose_triggered();
+	loadFiles(QStringList() << filename);
+}
+
 void MainWindow::file_save_as(void)
 {
 	QString filename;
@@ -708,6 +868,7 @@ void MainWindow::file_save_as(void)
 		set_filename(filename.toUtf8().data(), true);
 		setTitle(MWTF_FILENAME);
 		mark_divelist_changed(false);
+		addRecentFile(QStringList() << filename);
 	}
 }
 
@@ -731,6 +892,7 @@ void MainWindow::file_save(void)
 	}
 	save_dives(existing_filename);
 	mark_divelist_changed(false);
+	addRecentFile(QStringList() << QString(existing_filename));
 }
 
 void MainWindow::showError(QString message)
@@ -803,6 +965,7 @@ void MainWindow::loadFiles(const QStringList fileNames)
 	}
 
 	process_dives(false, false);
+	addRecentFile(fileNames);
 
 	refreshDisplay();
 	ui.actionAutoGroup->setChecked(autogroup);
diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h
index deacdec..d4415f8 100644
--- a/qt-ui/mainwindow.h
+++ b/qt-ui/mainwindow.h
@@ -45,6 +45,8 @@ public:
 	static MainWindow *instance();
 	ProfileGraphicsView *graphics();
 	MainTab *information();
+	void loadRecentFiles(QSettings *s);
+	void addRecentFile(const QStringList &newFiles);
 	DiveListView *dive_list();
 	GlobeGPS *globe();
 	void showError(QString message);
@@ -60,6 +62,7 @@ public:
 	QTabWidget *tabWidget();
 private slots:
 	/* file menu action */
+	void recentFileTriggered(bool checked);
 	void on_actionNew_triggered();
 	void on_actionOpen_triggered();
 	void on_actionSave_triggered();
diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui
index 8de11ea..3f72c0b 100644
--- a/qt-ui/mainwindow.ui
+++ b/qt-ui/mainwindow.ui
@@ -607,6 +607,12 @@
     <addaction name="actionExportUDDF"/>
     <addaction name="actionPrint"/>
     <addaction name="actionPreferences"/>
+    <addaction name="separator"/>
+    <addaction name="actionRecent1"/>
+    <addaction name="actionRecent2"/>
+    <addaction name="actionRecent3"/>
+    <addaction name="actionRecent4"/>
+    <addaction name="separator"/>
     <addaction name="actionQuit"/>
    </widget>
    <widget class="QMenu" name="menuLog">
@@ -937,6 +943,26 @@
     <string>F11</string>
    </property>
   </action>
+  <action name="actionRecent1">
+   <property name="visible">
+    <bool>false</bool>
+   </property>
+  </action>
+  <action name="actionRecent2">
+   <property name="visible">
+    <bool>false</bool>
+   </property>
+  </action>
+  <action name="actionRecent3">
+   <property name="visible">
+    <bool>false</bool>
+   </property>
+  </action>
+  <action name="actionRecent4">
+   <property name="visible">
+    <bool>false</bool>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
-- 
1.8.3.2

_______________________________________________
subsurface mailing list
[email protected]
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to