From a9a05517a901dbee038d7c315d42a723936dce7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 13 Feb 2018 13:52:07 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@356 a8b55f48-bf90-11e4-a774-851b48703e85 --- qad/application/emainwindow.cpp | 99 +++++++++++++++++++++++++++- qad/application/emainwindow.h | 16 ++++- qad/application/qad_application.qrc | 1 + qad/icons/document-open-recent.png | Bin 0 -> 17232 bytes 4 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 qad/icons/document-open-recent.png diff --git a/qad/application/emainwindow.cpp b/qad/application/emainwindow.cpp index 7c80935..79dd409 100644 --- a/qad/application/emainwindow.cpp +++ b/qad/application/emainwindow.cpp @@ -19,11 +19,16 @@ #include "emainwindow.h" #include #include +#include #include EMainWindow::EMainWindow(QWidget * parent): QMainWindow(parent), action_show_all_tools(this), action_hide_all_tools(this), action_show_all_docks(this), action_hide_all_docks(this), first_show(true) { + tid = 0; + menu_recent = 0; + action_clear_recent = new QAction(QIcon(":/icons/edit-clear.png"), tr("Clear recent list"), this); + connect(action_clear_recent, SIGNAL(triggered()), this, SLOT(clearRecent())); qRegisterMetaType("Qt::DockWidgetArea"); action_show_all_tools.setText(trUtf8("Show all")); action_show_all_docks.setText(trUtf8("Show all")); @@ -33,6 +38,7 @@ action_show_all_docks(this), action_hide_all_docks(this), first_show(true) { action_show_all_docks.setIcon(QIcon(":/icons/layer-visible-on.png")); action_hide_all_tools.setIcon(QIcon(":/icons/layer-visible-off.png")); action_hide_all_docks.setIcon(QIcon(":/icons/layer-visible-off.png")); + max_recent = 8; setChanged(false); initMenus(); initSession(); @@ -41,10 +47,33 @@ action_show_all_docks(this), action_hide_all_docks(this), first_show(true) { EMainWindow::~EMainWindow() { + if (tid > 0) killTimer(tid); + tid = 0; saveSession(); } +void EMainWindow::setRecentFiles(const QStringList & rl) { + clearRecent(); + for (int i = rl.size() - 1; i >= 0; --i) + addToRecent(rl[i]); +} + + +QStringList EMainWindow::recentFiles() const { + QStringList ret; + foreach (QAction * a, actions_recent) + ret << a->data().toString(); + return ret; +} + + +void EMainWindow::setRecentMenu(QMenu * m) { + menu_recent = m; + prepareRecent(); +} + + void EMainWindow::showEvent(QShowEvent * e) { QWidget::showEvent(e); initMenus(); @@ -169,6 +198,42 @@ QMenu * EMainWindow::createPopupMenu() { } +void EMainWindow::addToRecent(const QString & path) { + if (path.isEmpty()) return; + QFileInfo fi(path); + QString fp = fi.absoluteFilePath(); + bool insert = true; + for (int i = 0; i < actions_recent.size(); ++i) + if (actions_recent[i]->data().toString() == fp) { + actions_recent.push_front(actions_recent.takeAt(i)); + insert = false; + prepareRecent(); + break; + } + if (!insert) return; + QAction * a = new QAction(this); + a->setData(fp); + connect(a, SIGNAL(triggered()), this, SLOT(recentTriggered())); + actions_recent.push_front(a); + while (actions_recent.size() > max_recent) + delete actions_recent.takeLast(); + prepareRecent(); +} + + +void EMainWindow::prepareRecent() { + for (int i = 0; i < actions_recent.size(); ++i) { + QAction * a = actions_recent[i]; + a->setText(QString("&%1 - %2").arg(i + 1).arg(a->data().toString())); + } + if (!menu_recent) return; + menu_recent->clear(); + menu_recent->addActions(actions_recent); + menu_recent->addSeparator(); + menu_recent->addAction(action_clear_recent); +} + + void EMainWindow::initMenus() { action_show_all_tools.disconnect(); action_hide_all_tools.disconnect(); @@ -298,6 +363,24 @@ void EMainWindow::closeDock(int index) { } +void EMainWindow::recentTriggered() { + QAction * a = qobject_cast(sender()); + if (!a) return; + QString path = a->data().toString(); + if (path.isEmpty()) return; + if (!checkSave()) return; + if (load(path)) + addToRecent(path); +} + + +void EMainWindow::setMaxRecentItems(int mr) { + max_recent = qMax(0, mr); + for (int i = actions_recent.size() - 1; i >= mr; --i) + delete actions_recent.takeLast(); +} + + void EMainWindow::newFile() { if (!checkSave()) return; reset(true); @@ -309,7 +392,8 @@ void EMainWindow::openFile() { if (!checkSave()) return; QString ret = QFileDialog::getOpenFileName(this, trUtf8("Select file to open"), file_name, loadFilter()); if (ret.isEmpty()) return; - load(ret); + if (load(ret)) + addToRecent(ret); } @@ -321,7 +405,8 @@ bool EMainWindow::saveFile(bool ask) { return true; } if (file_name.isEmpty()) return saveAsFile(); - save(file_name); + if (save(file_name)) + addToRecent(file_name); return true; } @@ -329,6 +414,14 @@ bool EMainWindow::saveFile(bool ask) { bool EMainWindow::saveAsFile() { QString ret = QFileDialog::getSaveFileName(this, trUtf8("Select file to save"), file_name, saveFilter()); if (ret.isEmpty()) return false; - save(ret); + if (save(ret)) + addToRecent(ret); return true; } + + +void EMainWindow::clearRecent() { + qDeleteAll(actions_recent); + actions_recent.clear(); + prepareRecent(); +} diff --git a/qad/application/emainwindow.h b/qad/application/emainwindow.h index e7bd332..ae0615a 100644 --- a/qad/application/emainwindow.h +++ b/qad/application/emainwindow.h @@ -50,6 +50,7 @@ signals: class EMainWindow: public QMainWindow { Q_OBJECT + Q_PROPERTY(int maxRecentItems READ maxRecentItems WRITE setMaxRecentItems) public: EMainWindow(QWidget * parent = 0); ~EMainWindow(); @@ -59,6 +60,11 @@ public: virtual bool save(const QString & path) {return true;} void addSeparator() {} + void setRecentFiles(const QStringList & rl); + QStringList recentFiles() const; + void setRecentMenu(QMenu * m); + + int maxRecentItems() const {return max_recent;} protected: // Qt`s overloaded @@ -67,6 +73,8 @@ protected: bool eventFilter(QObject * o, QEvent * e); void timerEvent(QTimerEvent * e); QMenu * createPopupMenu(); + void addToRecent(const QString & path); + void prepareRecent(); void init(const QString & config) {session.setFile(config); initMenus(); initSession(); loadSession();} // unusable void saveSession(); @@ -87,9 +95,12 @@ protected: QString file_name; QList tbars; QList tdocks; + QList actions_recent; + QAction * action_clear_recent; + QMenu * menu_recent; SessionManager session; bool isChanged, first_show; - int tid; + int tid, max_recent; private slots: void changedDock(); @@ -97,13 +108,16 @@ private slots: void sessionSaving(QPIConfig & conf) {savingSession(conf);} // void changedDockClose(QObject * dock); void closeDock(int index); + void recentTriggered(); public slots: + void setMaxRecentItems(int mr); void changed() {setChanged(true);} void newFile(); void openFile(); bool saveFile(bool ask = false); bool saveAsFile(); + void clearRecent(); signals: diff --git a/qad/application/qad_application.qrc b/qad/application/qad_application.qrc index a981101..6a6c8f9 100644 --- a/qad/application/qad_application.qrc +++ b/qad/application/qad_application.qrc @@ -10,6 +10,7 @@ ../icons/document-save-all.png ../icons/document-save-as.png ../icons/document-open.png + ../icons/document-open-recent.png ../icons/document-close.png ../icons/edit-clear.png ../icons/edit-clear-locationbar-rtl.png diff --git a/qad/icons/document-open-recent.png b/qad/icons/document-open-recent.png new file mode 100644 index 0000000000000000000000000000000000000000..5dea408dcc2c5bd9f650e76944d23fcc7518e9fb GIT binary patch literal 17232 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 literal 0 HcmV?d00001