aboutsummaryrefslogtreecommitdiffstats
path: root/src/recent_files.cpp
diff options
context:
space:
mode:
authorConfuSomu2024-06-01 18:05:30 -0400
committerConfuSomu2024-06-01 18:07:06 -0400
commit48a338b1321d9e169c73b71c01cd2f9ba00f9c53 (patch)
treea4c991f800a7bd8bf0d33a56fc7998996c793c3b /src/recent_files.cpp
parente3efc04807f946cc75b06ec84b4af79d66b23cce (diff)
downloadActorViewer-48a338b1321d9e169c73b71c01cd2f9ba00f9c53.tar
ActorViewer-48a338b1321d9e169c73b71c01cd2f9ba00f9c53.tar.gz
ActorViewer-48a338b1321d9e169c73b71c01cd2f9ba00f9c53.zip
Implement Recent files list and menu
Diffstat (limited to 'src/recent_files.cpp')
-rw-r--r--src/recent_files.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/recent_files.cpp b/src/recent_files.cpp
new file mode 100644
index 0000000..2382f1a
--- /dev/null
+++ b/src/recent_files.cpp
@@ -0,0 +1,70 @@
+#include "recent_files.h"
+#include <QFileInfo>
+
+RecentFiles::RecentFiles(unsigned int size, bool force_empty) : size(size) {
+ if (not force_empty)
+ list = settings_interface.read_setting("ui/recent_files").value<QStringList>();
+}
+
+RecentFiles::~RecentFiles() {
+ if (has_list_changed) {
+ settings_interface.write_setting("ui/recent_files", list);
+ settings_interface.commit();
+ }
+}
+
+RecentFiles::QMenuPtr RecentFiles::create_menu(const QString& title, QWidget* parent) {
+ if (menu) return menu;
+
+ menu = std::make_shared<QMenu>(title, parent);
+ generate_menu_actions();
+
+ return menu;
+}
+
+void RecentFiles::generate_menu_actions() {
+ menu->clear();
+
+ if (not list.isEmpty()) {
+ int i = 1;
+ for (const QString& path : list) {
+ Action* action = new Action(QStringLiteral("&%1. %2").arg(i++).arg(QFileInfo(path).fileName()));
+ action->file_path = path;
+ menu->addAction(action);
+ }
+ } else {
+ Action* action = new Action(QWidget::tr("No recent files"));
+ action->setStatusTip(QWidget::tr("To view recent files, open a file"));
+ action->setEnabled(false);
+ menu->addAction(action);
+ }
+}
+
+void RecentFiles::add_file(const QString& path) {
+ if (not list.contains(path)) {
+ list.prepend(path);
+ if (list.size() > size)
+#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
+ list.resize(size);
+#else
+ do list.removeLast();
+ while (list.size() > size);
+#endif
+ has_list_changed = true;
+ generate_menu_actions();
+ }
+}
+
+const QStringList& RecentFiles::get_files() {
+ return list;
+}
+
+void RecentFiles::clear() {
+ list.empty();
+}
+
+RecentFiles::Action::Action(const QString &text, QObject *parent) : QAction(text, parent) {
+ connect(this, &QAction::triggered, this, [=](bool checked) {
+ emit this->chosen_file(file_path);
+ });
+}