فهرست منبع

add exclude patterns for external nodes

implement reloadNodes() to reload all the notebook.
Le Tan 4 سال پیش
والد
کامیت
2bad915583

+ 22 - 0
src/core/coreconfig.cpp

@@ -8,6 +8,7 @@ using namespace vnotex;
 #define READSTR(key) readString(appObj, userObj, (key))
 #define READINT(key) readInt(appObj, userObj, (key))
 #define READBOOL(key) readBool(appObj, userObj, (key))
+#define READSTRLIST(key) readStringList(appObj, userObj, (key))
 
 QStringList CoreConfig::s_availableLocales;
 
@@ -46,6 +47,8 @@ void CoreConfig::init(const QJsonObject &p_app,
     if (m_toolBarIconSize <= 0) {
         m_toolBarIconSize = 16;
     }
+
+    loadNoteManagement(appObj, userObj);
 }
 
 QJsonObject CoreConfig::toJson() const
@@ -97,6 +100,20 @@ void CoreConfig::loadShortcuts(const QJsonObject &p_app, const QJsonObject &p_us
     }
 }
 
+void CoreConfig::loadNoteManagement(const QJsonObject &p_app, const QJsonObject &p_user)
+{
+    const auto topAppObj = p_app.value(QStringLiteral("note_management")).toObject();
+    const auto topUserObj = p_user.value(QStringLiteral("note_management")).toObject();
+
+    // External node.
+    {
+        const auto appObj = topAppObj.value(QStringLiteral("external_node")).toObject();
+        const auto userObj = topUserObj.value(QStringLiteral("external_node")).toObject();
+
+        m_externalNodeExcludePatterns = READSTRLIST(QStringLiteral("exclude_patterns"));
+    }
+}
+
 QJsonObject CoreConfig::saveShortcuts() const
 {
     QJsonObject obj;
@@ -126,3 +143,8 @@ void CoreConfig::setToolBarIconSize(int p_size)
     Q_ASSERT(p_size > 0);
     updateConfig(m_toolBarIconSize, p_size, this);
 }
+
+const QStringList &CoreConfig::getExternalNodeExcludePatterns() const
+{
+    return m_externalNodeExcludePatterns;
+}

+ 6 - 0
src/core/coreconfig.h

@@ -56,11 +56,15 @@ namespace vnotex
         int getToolBarIconSize() const;
         void setToolBarIconSize(int p_size);
 
+        const QStringList &getExternalNodeExcludePatterns() const;
+
         static const QStringList &getAvailableLocales();
 
     private:
         void loadShortcuts(const QJsonObject &p_app, const QJsonObject &p_user);
 
+        void loadNoteManagement(const QJsonObject &p_app, const QJsonObject &p_user);
+
         QJsonObject saveShortcuts() const;
 
         // Theme name.
@@ -75,6 +79,8 @@ namespace vnotex
         // Icon size of MainWindow tool bar.
         int m_toolBarIconSize = 16;
 
+        QStringList m_externalNodeExcludePatterns;
+
         static QStringList s_availableLocales;
     };
 } // ns vnotex

+ 14 - 0
src/core/iconfig.h

@@ -3,6 +3,7 @@
 
 #include <QSharedPointer>
 #include <QJsonObject>
+#include <QJsonArray>
 
 namespace vnotex
 {
@@ -80,6 +81,19 @@ namespace vnotex
             return read(p_default, p_user, p_key).toString();
         }
 
+        static QStringList readStringList(const QJsonObject &p_default,
+                                          const QJsonObject &p_user,
+                                          const QString &p_key)
+        {
+            auto arr = read(p_default, p_user, p_key).toArray();
+            QStringList res;
+            res.reserve(arr.size());
+            for (const auto &ele : arr) {
+                res.push_back(ele.toString());
+            }
+            return res;
+        }
+
         static QString readString(const QJsonObject &p_obj,
                                   const QString &p_key)
         {

+ 3 - 2
src/core/notebook/notebook.cpp

@@ -347,7 +347,8 @@ QSharedPointer<Node> Notebook::copyAsNode(Node *p_parent,
     return m_configMgr->copyAsNode(p_parent, p_flags, p_path);
 }
 
-void Notebook::reloadNode(Node *p_node)
+void Notebook::reloadNodes()
 {
-    m_configMgr->reloadNode(p_node);
+    m_root.clear();
+    getRootNode();
 }

+ 1 - 1
src/core/notebook/notebook.h

@@ -127,7 +127,7 @@ namespace vnotex
 
         bool isBuiltInFolder(const Node *p_node, const QString &p_name) const;
 
-        void reloadNode(Node *p_node);
+        void reloadNodes();
 
         static const QString c_defaultAttachmentFolder;
 

+ 0 - 2
src/core/notebookconfigmgr/inotebookconfigmgr.h

@@ -77,8 +77,6 @@ namespace vnotex
 
         virtual QVector<QSharedPointer<ExternalNode>> fetchExternalChildren(Node *p_node) const = 0;
 
-        virtual void reloadNode(Node *p_node) = 0;
-
     protected:
         // Version of the config processing code.
         virtual QString getCodeVersion() const;

+ 31 - 2
src/core/notebookconfigmgr/vxnotebookconfigmgr.cpp

@@ -16,6 +16,7 @@
 #include <exception.h>
 #include <core/configmgr.h>
 #include <core/editorconfig.h>
+#include <core/coreconfig.h>
 
 #include <utils/contentmediautils.h>
 
@@ -166,6 +167,10 @@ const QString VXNotebookConfigMgr::c_nodeConfigName = "vx.json";
 
 const QString VXNotebookConfigMgr::c_recycleBinFolderName = "vx_recycle_bin";
 
+bool VXNotebookConfigMgr::s_initialized = false;
+
+QVector<QRegExp> VXNotebookConfigMgr::s_externalNodeExcludePatterns;
+
 VXNotebookConfigMgr::VXNotebookConfigMgr(const QString &p_name,
                                          const QString &p_displayName,
                                          const QString &p_description,
@@ -174,6 +179,17 @@ VXNotebookConfigMgr::VXNotebookConfigMgr(const QString &p_name,
     : BundleNotebookConfigMgr(p_backend, p_parent),
       m_info(p_name, p_displayName, p_description)
 {
+    if (!s_initialized) {
+        s_initialized = true;
+
+        const auto &patterns = ConfigMgr::getInst().getCoreConfig().getExternalNodeExcludePatterns();
+        s_externalNodeExcludePatterns.reserve(patterns.size());
+        for (const auto &pat : patterns) {
+            if (!pat.isEmpty()) {
+                s_externalNodeExcludePatterns.push_back(QRegExp(pat, Qt::CaseInsensitive, QRegExp::Wildcard));
+            }
+        }
+    }
 }
 
 QString VXNotebookConfigMgr::getName() const
@@ -927,6 +943,10 @@ QVector<QSharedPointer<ExternalNode>> VXNotebookConfigMgr::fetchExternalChildren
                 continue;
             }
 
+            if (isExcludedFromExternalNode(folder)) {
+                continue;
+            }
+
             if (p_node->containsContainerChild(folder)) {
                 continue;
             }
@@ -943,6 +963,10 @@ QVector<QSharedPointer<ExternalNode>> VXNotebookConfigMgr::fetchExternalChildren
                 continue;
             }
 
+            if (isExcludedFromExternalNode(file)) {
+                continue;
+            }
+
             if (p_node->containsContentChild(file)) {
                 continue;
             }
@@ -954,7 +978,12 @@ QVector<QSharedPointer<ExternalNode>> VXNotebookConfigMgr::fetchExternalChildren
     return externalNodes;
 }
 
-void VXNotebookConfigMgr::reloadNode(Node *p_node)
+bool VXNotebookConfigMgr::isExcludedFromExternalNode(const QString &p_name) const
 {
-    // TODO.
+    for (const auto &regExp : s_externalNodeExcludePatterns) {
+        if (regExp.exactMatch(p_name)) {
+            return true;
+        }
+    }
+    return false;
 }

+ 7 - 2
src/core/notebookconfigmgr/vxnotebookconfigmgr.h

@@ -5,6 +5,7 @@
 
 #include <QDateTime>
 #include <QVector>
+#include <QRegExp>
 
 #include "../global.h"
 
@@ -70,8 +71,6 @@ namespace vnotex
 
         QVector<QSharedPointer<ExternalNode>> fetchExternalChildren(Node *p_node) const Q_DECL_OVERRIDE;
 
-        void reloadNode(Node *p_node) Q_DECL_OVERRIDE;
-
     private:
         // Config of a file child.
         struct NodeFileConfig
@@ -190,8 +189,14 @@ namespace vnotex
 
         void inheritNodeFlags(const Node *p_node, Node *p_child) const;
 
+        bool isExcludedFromExternalNode(const QString &p_name) const;
+
         Info m_info;
 
+        static bool s_initialized;
+
+        static QVector<QRegExp> s_externalNodeExcludePatterns;
+
         // Name of the node's config file.
         static const QString c_nodeConfigName;
 

+ 10 - 1
src/data/core/vnotex.json

@@ -27,7 +27,16 @@
             "NewWorkspace" : "Ctrl+G, N",
             "Export" : "Ctrl+G, T"
         },
-        "toolbar_icon_size" : 16
+        "toolbar_icon_size" : 16,
+        "note_management" : {
+            "external_node" : {
+                "//comment" : "Wildcard patterns of files and folders to exclude as external files",
+                "exclude_patterns" : [
+                    ".gitignore",
+                    ".git"
+                ]
+            }
+        }
     },
     "editor" : {
         "core": {

+ 13 - 3
src/widgets/mainwindow.cpp

@@ -102,6 +102,16 @@ void MainWindow::setupStatusBar()
 
 void MainWindow::setupTipsArea()
 {
+    connect(&VNoteX::getInst(), &VNoteX::tipsRequested,
+            this, &MainWindow::showTips);
+}
+
+void MainWindow::createTipsArea()
+{
+    if (m_tipsLabel) {
+        return;
+    }
+
     m_tipsLabel = new QLabel(this);
     m_tipsLabel->setObjectName("MainWindowTipsLabel");
     m_tipsLabel->hide();
@@ -113,9 +123,6 @@ void MainWindow::setupTipsArea()
             this, [this]() {
                 setTipsAreaVisible(false);
             });
-
-    connect(&VNoteX::getInst(), &VNoteX::tipsRequested,
-            this, &MainWindow::showTips);
 }
 
 void MainWindow::setupCentralWidget()
@@ -623,6 +630,8 @@ void MainWindow::exportNotes()
 
 void MainWindow::showTips(const QString &p_message, int p_timeoutMilliseconds)
 {
+    createTipsArea();
+
     m_tipsTimer->stop();
 
     setTipsAreaVisible(false);
@@ -639,6 +648,7 @@ void MainWindow::showTips(const QString &p_message, int p_timeoutMilliseconds)
 
 void MainWindow::setTipsAreaVisible(bool p_visible)
 {
+    Q_ASSERT(m_tipsLabel);
     if (p_visible) {
         m_tipsLabel->adjustSize();
         int labelW = m_tipsLabel->width();

+ 2 - 0
src/widgets/mainwindow.h

@@ -106,6 +106,8 @@ namespace vnotex
 
         void setupTipsArea();
 
+        void createTipsArea();
+
         void saveStateAndGeometry();
 
         void loadStateAndGeometry();

+ 2 - 0
src/widgets/notebookexplorer.cpp

@@ -76,6 +76,8 @@ void NotebookExplorer::setupUI()
             &VNoteX::getInst(), &VNoteX::nodeAboutToMove);
     connect(m_nodeExplorer, &NotebookNodeExplorer::nodeAboutToRemove,
             &VNoteX::getInst(), &VNoteX::nodeAboutToRemove);
+    connect(m_nodeExplorer, &NotebookNodeExplorer::nodeAboutToReload,
+            &VNoteX::getInst(), &VNoteX::nodeAboutToReload);
     mainLayout->addWidget(m_nodeExplorer);
 
     setFocusProxy(m_nodeExplorer);

+ 30 - 4
src/widgets/notebooknodeexplorer.cpp

@@ -761,6 +761,9 @@ void NotebookNodeExplorer::createContextMenuOnRoot(QMenu *p_menu)
     act = createAction(Action::Reload, p_menu);
     p_menu->addAction(act);
 
+    act = createAction(Action::ReloadIndex, p_menu);
+    p_menu->addAction(act);
+
     act = createAction(Action::OpenLocation, p_menu);
     p_menu->addAction(act);
 }
@@ -775,6 +778,9 @@ void NotebookNodeExplorer::createContextMenuOnNode(QMenu *p_menu, const Node *p_
         act = createAction(Action::Reload, p_menu);
         p_menu->addAction(act);
 
+        act = createAction(Action::ReloadIndex, p_menu);
+        p_menu->addAction(act);
+
         if (selectedSize == 1) {
             act = createAction(Action::EmptyRecycleBin, p_menu);
             p_menu->addAction(act);
@@ -800,6 +806,9 @@ void NotebookNodeExplorer::createContextMenuOnNode(QMenu *p_menu, const Node *p_
         act = createAction(Action::Reload, p_menu);
         p_menu->addAction(act);
 
+        act = createAction(Action::ReloadIndex, p_menu);
+        p_menu->addAction(act);
+
         if (selectedSize == 1) {
             p_menu->addSeparator();
 
@@ -845,6 +854,9 @@ void NotebookNodeExplorer::createContextMenuOnNode(QMenu *p_menu, const Node *p_
         act = createAction(Action::Reload, p_menu);
         p_menu->addAction(act);
 
+        act = createAction(Action::ReloadIndex, p_menu);
+        p_menu->addAction(act);
+
         act = createAction(Action::Sort, p_menu);
         p_menu->addAction(act);
 
@@ -1091,14 +1103,28 @@ QAction *NotebookNodeExplorer::createAction(Action p_act, QObject *p_parent)
         connect(act, &QAction::triggered,
                 this, [this]() {
                     auto node = currentExploredFolderNode();
-                    if (m_notebook && node) {
-                        // TODO: emit signals to notify other components.
-                        m_notebook->reloadNode(node);
-                    }
                     updateNode(node);
                 });
         break;
 
+    case Action::ReloadIndex:
+        act = new QAction(tr("Re&load Index From Disk"), p_parent);
+        connect(act, &QAction::triggered,
+                this, [this]() {
+                    if (!m_notebook) {
+                        return;
+                    }
+
+                    auto event = QSharedPointer<Event>::create();
+                    emit nodeAboutToReload(m_notebook->getRootNode().data(), event);
+                    if (!event->m_response.toBool()) {
+                        return;
+                    }
+
+                    reload();
+                });
+        break;
+
     case Action::ImportToConfig:
         act = new QAction(tr("&Import To Index"), p_parent);
         connect(act, &QAction::triggered,

+ 3 - 0
src/widgets/notebooknodeexplorer.h

@@ -123,6 +123,8 @@ namespace vnotex
         // @m_response of @p_event: true to continue the removal, false to cancel the removal.
         void nodeAboutToRemove(Node *p_node, const QSharedPointer<Event> &p_event);
 
+        void nodeAboutToReload(Node *p_node, const QSharedPointer<Event> &p_event);
+
     private:
         enum Column { Name = 0 };
 
@@ -142,6 +144,7 @@ namespace vnotex
             RemoveFromConfig,
             Sort,
             Reload,
+            ReloadIndex,
             ImportToConfig,
             Open
         };

+ 16 - 26
src/widgets/viewarea.cpp

@@ -61,37 +61,16 @@ ViewArea::ViewArea(QWidget *p_parent)
             });
 
     connect(&VNoteX::getInst(), &VNoteX::nodeAboutToMove,
-            this, [this](Node *p_node, const QSharedPointer<Event> &p_event) {
-                if (p_event->m_handled) {
-                    return;
-                }
-
-                bool ret = close(p_node, false);
-                p_event->m_response = ret;
-                p_event->m_handled = !ret;
-            });
+            this, &ViewArea::handleNodeChange);
 
     connect(&VNoteX::getInst(), &VNoteX::nodeAboutToRemove,
-            this, [this](Node *p_node, const QSharedPointer<Event> &p_event) {
-                if (p_event->m_handled) {
-                    return;
-                }
-
-                bool ret = close(p_node, false);
-                p_event->m_response = ret;
-                p_event->m_handled = !ret;
-            });
+            this, &ViewArea::handleNodeChange);
 
     connect(&VNoteX::getInst(), &VNoteX::nodeAboutToRename,
-            this, [this](Node *p_node, const QSharedPointer<Event> &p_event) {
-                if (p_event->m_handled) {
-                    return;
-                }
+            this, &ViewArea::handleNodeChange);
 
-                bool ret = close(p_node, false);
-                p_event->m_response = ret;
-                p_event->m_handled = !ret;
-            });
+    connect(&VNoteX::getInst(), &VNoteX::nodeAboutToReload,
+            this, &ViewArea::handleNodeChange);
 
     auto &configMgr = ConfigMgr::getInst();
     connect(&configMgr, &ConfigMgr::editorConfigChanged,
@@ -130,6 +109,17 @@ ViewArea::~ViewArea()
     Q_ASSERT(m_workspaces.isEmpty());
 }
 
+void ViewArea::handleNodeChange(Node *p_node, const QSharedPointer<Event> &p_event)
+{
+    if (p_event->m_handled) {
+        return;
+    }
+
+    bool ret = close(p_node, false);
+    p_event->m_response = ret;
+    p_event->m_handled = !ret;
+}
+
 void ViewArea::setupUI()
 {
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

+ 2 - 0
src/widgets/viewarea.h

@@ -127,6 +127,8 @@ namespace vnotex
 
         bool close(bool p_force);
 
+        void handleNodeChange(Node *p_node, const QSharedPointer<Event> &p_event);
+
     private:
         enum class SplitType
         {