notebooknodeexplorer.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #ifndef NOTEBOOKNODEEXPLORER_H
  2. #define NOTEBOOKNODEEXPLORER_H
  3. #include <QWidget>
  4. #include <QSharedPointer>
  5. #include <QHash>
  6. #include <QScopedPointer>
  7. #include <QPair>
  8. #include "qtreewidgetstatecache.h"
  9. #include "clipboarddata.h"
  10. #include "navigationmodewrapper.h"
  11. class QSplitter;
  12. class QTreeWidget;
  13. class QTreeWidgetItem;
  14. class QMenu;
  15. namespace vnotex
  16. {
  17. class Notebook;
  18. class Node;
  19. class TreeWidget;
  20. struct FileOpenParameters;
  21. class Event;
  22. class ExternalNode;
  23. class NotebookNodeExplorer : public QWidget
  24. {
  25. Q_OBJECT
  26. public:
  27. // Used for a QTreeWidgetItem to hold the info of a node.
  28. // Make it public since we need to hold it in a QTreeWidgetItem.
  29. class NodeData
  30. {
  31. public:
  32. enum class NodeType { Node, ExternalNode, Invalid };
  33. NodeData();
  34. explicit NodeData(Node *p_node, bool p_loaded);
  35. explicit NodeData(const QSharedPointer<ExternalNode> &p_externalNode);
  36. NodeData(const NodeData &p_other);
  37. ~NodeData();
  38. NodeData &operator=(const NodeData &p_other);
  39. bool isValid() const;
  40. bool isNode() const;
  41. bool isExternalNode() const;
  42. NodeData::NodeType getType() const;
  43. Node *getNode() const;
  44. ExternalNode *getExternalNode() const;
  45. void clear();
  46. bool matched(const Node *p_node) const;
  47. bool isLoaded() const;
  48. private:
  49. NodeType m_type = NodeType::Invalid;
  50. Node *m_node = nullptr;
  51. QSharedPointer<ExternalNode> m_externalNode;
  52. bool m_loaded = false;
  53. };
  54. enum ViewOrder
  55. {
  56. OrderedByConfiguration = 0,
  57. OrderedByName,
  58. OrderedByNameReversed,
  59. OrderedByCreatedTime,
  60. OrderedByCreatedTimeReversed,
  61. OrderedByModifiedTime,
  62. OrderedByModifiedTimeReversed,
  63. ViewOrderMax
  64. };
  65. explicit NotebookNodeExplorer(QWidget *p_parent = nullptr);
  66. void setNotebook(const QSharedPointer<Notebook> &p_notebook);
  67. Node *getCurrentNode() const;
  68. // Update the tree of @p_node.
  69. // If @p_node is null, update the whole tree.
  70. void updateNode(Node *p_node);
  71. void setCurrentNode(Node *p_node);
  72. void reload();
  73. void setRecycleBinNodeVisible(bool p_visible);
  74. void setViewOrder(int p_order);
  75. void setExternalFilesVisible(bool p_visible);
  76. void setAutoImportExternalFiles(bool p_enabled);
  77. Node *currentExploredFolderNode() const;
  78. signals:
  79. void nodeActivated(Node *p_node, const QSharedPointer<FileOpenParameters> &p_paras);
  80. void fileActivated(const QString &p_path, const QSharedPointer<FileOpenParameters> &p_paras);
  81. // @m_response of @p_event: true to continue the move, false to cancel the move.
  82. void nodeAboutToMove(Node *p_node, const QSharedPointer<Event> &p_event);
  83. // @m_response of @p_event: true to continue the removal, false to cancel the removal.
  84. void nodeAboutToRemove(Node *p_node, const QSharedPointer<Event> &p_event);
  85. void nodeAboutToReload(Node *p_node, const QSharedPointer<Event> &p_event);
  86. private:
  87. enum Column { Name = 0 };
  88. enum class Action
  89. {
  90. NewNote,
  91. NewFolder,
  92. Properties,
  93. OpenLocation,
  94. CopyPath,
  95. Copy,
  96. Cut,
  97. Paste,
  98. EmptyRecycleBin,
  99. Delete,
  100. DeleteFromRecycleBin,
  101. RemoveFromConfig,
  102. Sort,
  103. Reload,
  104. ReloadIndex,
  105. ImportToConfig,
  106. Open
  107. };
  108. void setupUI();
  109. void setupMasterExplorer(QWidget *p_parent = nullptr);
  110. void clearExplorer();
  111. void generateNodeTree();
  112. void loadRootNode(const Node *p_node) const;
  113. void loadNode(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  114. void loadChildren(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  115. void loadNode(QTreeWidgetItem *p_item, const QSharedPointer<ExternalNode> &p_node) const;
  116. void loadRecycleBinNode(Node *p_node) const;
  117. void loadRecycleBinNode(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  118. void fillTreeItem(QTreeWidgetItem *p_item, Node *p_node, bool p_loaded) const;
  119. void fillTreeItem(QTreeWidgetItem *p_item, const QSharedPointer<ExternalNode> &p_node) const;
  120. const QIcon &getNodeItemIcon(const Node *p_node) const;
  121. const QIcon &getNodeItemIcon(const ExternalNode *p_node) const;
  122. void initNodeIcons() const;
  123. QTreeWidgetItem *findNode(const Node *p_node) const;
  124. QTreeWidgetItem *findNode(QTreeWidgetItem *p_item, const Node *p_node) const;
  125. QTreeWidgetItem *findNodeChild(QTreeWidgetItem *p_item, const Node *p_node) const;
  126. QTreeWidgetItem *findNodeTopLevelItem(QTreeWidget *p_tree, const Node *p_node) const;
  127. void saveNotebookTreeState(bool p_saveCurrentItem = true);
  128. QSharedPointer<QTreeWidgetStateCache<Node *>> stateCache() const;
  129. void clearStateCache(const Notebook *p_notebook);
  130. void createContextMenuOnRoot(QMenu *p_menu);
  131. void createContextMenuOnNode(QMenu *p_menu, const Node *p_node);
  132. void createContextMenuOnExternalNode(QMenu *p_menu, const ExternalNode *p_node);
  133. // Factory function to create action.
  134. QAction *createAction(Action p_act, QObject *p_parent);
  135. void copySelectedNodes(bool p_move);
  136. void pasteNodesFromClipboard();
  137. QPair<QVector<Node *>, QVector<ExternalNode *>> getSelectedNodes() const;
  138. void removeSelectedNodes(bool p_skipRecycleBin);
  139. void removeSelectedNodesFromConfig();
  140. QVector<Node *> confirmSelectedNodes(const QString &p_title,
  141. const QString &p_text,
  142. const QString &p_info) const;
  143. static QSharedPointer<ClipboardData> tryFetchClipboardData();
  144. bool isPasteOnNodeAvailable(const Node *p_node) const;
  145. void setNodeExpanded(const Node *p_node, bool p_expanded);
  146. void selectNodes(const QVector<const Node *> &p_nodes);
  147. // @p_skipRecycleBin is irrelevant if @p_configOnly is true.
  148. void removeNodes(QVector<Node *> p_nodes, bool p_skipRecycleBin, bool p_configOnly);
  149. void filterAwayChildrenNodes(QVector<Node *> &p_nodes);
  150. void updateAndExpandNode(Node *p_node);
  151. // Check if all selected items are the same type for operations.
  152. bool allSelectedItemsSameType() const;
  153. // Skip the recycle bin node if possible.
  154. void focusNormalNode();
  155. void sortNodes(QVector<QSharedPointer<Node>> &p_nodes) const;
  156. // [p_start, p_end).
  157. void sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int p_start, int p_end, int p_viewOrder) const;
  158. // Sort nodes in config file.
  159. void manualSort();
  160. void openSelectedNodes();
  161. QSharedPointer<Node> importToIndex(const ExternalNode *p_node);
  162. void importToIndex(const QVector<ExternalNode *> &p_nodes);
  163. // Check whether @p_node is a valid node. Will notify user.
  164. // Return true if it is invalid.
  165. bool checkInvalidNode(const Node *p_node) const;
  166. static NotebookNodeExplorer::NodeData getItemNodeData(const QTreeWidgetItem *p_item);
  167. static void setItemNodeData(QTreeWidgetItem *p_item, const NodeData &p_data);
  168. QSplitter *m_splitter = nullptr;
  169. TreeWidget *m_masterExplorer = nullptr;
  170. QSharedPointer<Notebook> m_notebook;
  171. QHash<const Notebook *, QSharedPointer<QTreeWidgetStateCache<Node *>>> m_stateCache;
  172. QScopedPointer<NavigationModeWrapper<QTreeWidget, QTreeWidgetItem>> m_navigationWrapper;
  173. bool m_recycleBinNodeVisible = false;
  174. int m_viewOrder = ViewOrder::OrderedByConfiguration;
  175. bool m_externalFilesVisible = true;
  176. bool m_autoImportExternalFiles = true;
  177. static QIcon s_folderNodeIcon;
  178. static QIcon s_fileNodeIcon;
  179. static QIcon s_invalidFolderNodeIcon;
  180. static QIcon s_invalidFileNodeIcon;
  181. static QIcon s_recycleBinNodeIcon;
  182. static QIcon s_externalFolderNodeIcon;
  183. static QIcon s_externalFileNodeIcon;
  184. };
  185. }
  186. Q_DECLARE_METATYPE(vnotex::NotebookNodeExplorer::NodeData);
  187. #endif // NOTEBOOKNODEEXPLORER_H