>From 9d50d3c8631a7eb3fe55aa048da8bb1f6b6e3b50 Mon Sep 17 00:00:00 2001
From: Daniel Schaal
Date: Wed, 12 Oct 2011 16:51:51 +0200
Subject: [PATCH] GUI: list recent files in file menu
Adds the 5 most recently opened files to the file menu.
It also adds an option to clear the recent files list again.
---
src/player_qt.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
src/player_qt.h | 13 +++++++++
2 files changed, 90 insertions(+), 1 deletions(-)
diff --git a/src/player_qt.cpp b/src/player_qt.cpp
index ba6b536..c611210 100644
--- a/src/player_qt.cpp
+++ b/src/player_qt.cpp
@@ -2030,7 +2030,8 @@ main_window::main_window(QSettings *settings, const player_init_data &init_data)
_player(NULL),
_init_data(init_data),
_init_data_template(init_data),
- _stop_request(false)
+ _stop_request(false),
+ _max_recent_files(5)
{
// Application properties
setWindowTitle(PACKAGE_NAME);
@@ -2148,6 +2149,24 @@ main_window::main_window(QSettings *settings, const player_init_data &init_data)
file_open_device_act->setIcon(get_icon("camera-web"));
connect(file_open_device_act, SIGNAL(triggered()), this, SLOT(file_open_device()));
file_menu->addAction(file_open_device_act);
+
+ _recent_files_separator = file_menu->addSeparator();
+
+ for (int i = 0; i < _max_recent_files; ++i) {
+ QAction * recent = new QAction(this);
+ recent->setVisible(false);
+ file_menu->addAction(recent);
+ connect(recent, SIGNAL(triggered()),
+ this, SLOT(open_recent_file()));
+ _recent_file_actions.append(recent);
+ }
+ _clear_recent_files_act = new QAction(_("&Clear recent files"), this);
+ connect(_clear_recent_files_act,SIGNAL(triggered()), this, SLOT(clear_recent_files()));
+
+ _clear_recent_separator = file_menu->addSeparator();
+ file_menu->addAction(_clear_recent_files_act);
+ update_recent_file_actions();
+
file_menu->addSeparator();
QAction *file_quit_act = new QAction(_("&Quit..."), this);
file_quit_act->setShortcut(QKeySequence::Quit);
@@ -2242,6 +2261,46 @@ main_window::~main_window()
delete _video_output;
}
+void main_window::open_recent_file()
+{
+ QAction *action = qobject_cast(sender());
+ if (action)
+ open(action->data().toString());
+}
+
+void main_window::update_recent_file_actions()
+{
+ QStringList files = _settings->value("Session/recent-files").toStringList();
+
+ int num_recent_files = qMin(files.size(), (int)_max_recent_files);
+ bool have_recent_files = num_recent_files > 0;
+
+ for (int i = 0; i < num_recent_files; ++i) {
+ QString text = QString("&%1 %2").arg(i + 1).arg(stripped_name(files[i]));
+ _recent_file_actions[i]->setText(text);
+ _recent_file_actions[i]->setData(files[i]);
+ _recent_file_actions[i]->setVisible(true);
+ }
+ for (int j = num_recent_files; j < _max_recent_files; ++j)
+ _recent_file_actions[j]->setVisible(false);
+
+ _recent_files_separator->setVisible(have_recent_files);
+ _clear_recent_separator->setVisible(have_recent_files);
+ _clear_recent_files_act->setVisible(have_recent_files);
+
+}
+
+void main_window::clear_recent_files()
+{
+ _settings->remove("Session/recent-files");
+ update_recent_file_actions();
+}
+
+QString main_window::stripped_name(const QString& filename)
+{
+ return QFileInfo(filename).fileName();
+}
+
QString main_window::current_file_hash()
{
// Return SHA1 hash of the name of the current file as a hex string
@@ -2565,6 +2624,11 @@ void main_window::playloop_step()
}
}
+void main_window::open(QString url)
+{
+ open(QStringList(url));
+}
+
void main_window::open(QStringList filenames, const device_request &dev_request)
{
_player->force_stop();
@@ -2628,8 +2692,20 @@ void main_window::file_open()
{
return;
}
+
_settings->setValue("Session/file-open-dir", QFileInfo(file_names[0]).path());
open(file_names);
+
+ QStringList files = _settings->value("Session/recent-files").toStringList();
+
+ foreach(QString file, file_names) {
+ files.removeAll(file);
+ files.prepend(file);
+ }
+ while (files.size() > _max_recent_files)
+ files.removeLast();
+ _settings->setValue("Session/recent-files", files);
+ update_recent_file_actions();
}
void main_window::file_open_url()
diff --git a/src/player_qt.h b/src/player_qt.h
index 5c6e3d9..f986562 100644
--- a/src/player_qt.h
+++ b/src/player_qt.h
@@ -340,10 +340,20 @@ private:
player_init_data _init_data;
const player_init_data _init_data_template;
bool _stop_request;
+
+ int _max_recent_files;
+ QStringList _recent_files;
+ QList _recent_file_actions;
+ QAction * _recent_files_separator;
+ QAction * _clear_recent_separator;
+ QAction * _clear_recent_files_act;
QString current_file_hash();
bool open_player();
void open(QStringList urls, const device_request &dev_request = device_request());
+ void open(QString url);
+ void update_recent_file_actions();
+ QString stripped_name(const QString & filename);
private slots:
void move_event();
@@ -361,6 +371,9 @@ private slots:
void help_website();
void help_keyboard();
void help_about();
+
+ void open_recent_file();
+ void clear_recent_files();
protected:
void dragEnterEvent(QDragEnterEvent *event);
--
1.7.8.2