notebooknodeexplorer.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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. Node *currentExploredNode() const;
  79. signals:
  80. void nodeActivated(Node *p_node, const QSharedPointer<FileOpenParameters> &p_paras);
  81. void fileActivated(const QString &p_path, const QSharedPointer<FileOpenParameters> &p_paras);
  82. // @m_response of @p_event: true to continue the move, false to cancel the move.
  83. void nodeAboutToMove(Node *p_node, const QSharedPointer<Event> &p_event);
  84. // @m_response of @p_event: true to continue the removal, false to cancel the removal.
  85. void nodeAboutToRemove(Node *p_node, const QSharedPointer<Event> &p_event);
  86. void nodeAboutToReload(Node *p_node, const QSharedPointer<Event> &p_event);
  87. private:
  88. enum Column { Name = 0 };
  89. enum class Action
  90. {
  91. NewNote,
  92. NewFolder,
  93. Properties,
  94. OpenLocation,
  95. CopyPath,
  96. Copy,
  97. Cut,
  98. Paste,
  99. EmptyRecycleBin,
  100. Delete,
  101. DeleteFromRecycleBin,
  102. RemoveFromConfig,
  103. Sort,
  104. Reload,
  105. ReloadIndex,
  106. ImportToConfig,
  107. Open,
  108. ExpandAll,
  109. PinToQuickAccess
  110. };
  111. void setupUI();
  112. void setupShortcuts();
  113. void setupMasterExplorer(QWidget *p_parent = nullptr);
  114. void clearExplorer();
  115. void generateNodeTree();
  116. void loadRootNode(const Node *p_node) const;
  117. void loadNode(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  118. void loadChildren(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  119. void loadNode(QTreeWidgetItem *p_item, const QSharedPointer<ExternalNode> &p_node) const;
  120. void loadRecycleBinNode(Node *p_node) const;
  121. void loadRecycleBinNode(QTreeWidgetItem *p_item, Node *p_node, int p_level) const;
  122. void fillTreeItem(QTreeWidgetItem *p_item, Node *p_node, bool p_loaded) const;
  123. void fillTreeItem(QTreeWidgetItem *p_item, const QSharedPointer<ExternalNode> &p_node) const;
  124. const QIcon &getNodeItemIcon(const Node *p_node) const;
  125. const QIcon &getNodeItemIcon(const ExternalNode *p_node) const;
  126. void initNodeIcons() const;
  127. QTreeWidgetItem *findNode(const Node *p_node) const;
  128. QTreeWidgetItem *findNode(QTreeWidgetItem *p_item, const Node *p_node) const;
  129. QTreeWidgetItem *findNodeChild(QTreeWidgetItem *p_item, const Node *p_node) const;
  130. QTreeWidgetItem *findNodeTopLevelItem(QTreeWidget *p_tree, const Node *p_node) const;
  131. void saveNotebookTreeState(bool p_saveCurrentItem = true);
  132. QSharedPointer<QTreeWidgetStateCache<Node *>> stateCache() const;
  133. void clearStateCache(const Notebook *p_notebook);
  134. void createContextMenuOnRoot(QMenu *p_menu);
  135. void createContextMenuOnNode(QMenu *p_menu, const Node *p_node);
  136. void createContextMenuOnExternalNode(QMenu *p_menu, const ExternalNode *p_node);
  137. // Factory function to create action.
  138. QAction *createAction(Action p_act, QObject *p_parent);
  139. void copySelectedNodes(bool p_move);
  140. void pasteNodesFromClipboard();
  141. QPair<QVector<Node *>, QVector<ExternalNode *>> getSelectedNodes() const;
  142. void removeSelectedNodes(bool p_skipRecycleBin);
  143. void removeSelectedNodesFromConfig();
  144. QVector<Node *> confirmSelectedNodes(const QString &p_title,
  145. const QString &p_text,
  146. const QString &p_info) const;
  147. static QSharedPointer<ClipboardData> tryFetchClipboardData();
  148. bool isPasteOnNodeAvailable(const Node *p_node) const;
  149. void setNodeExpanded(const Node *p_node, bool p_expanded);
  150. void selectNodes(const QVector<const Node *> &p_nodes);
  151. // @p_skipRecycleBin is irrelevant if @p_configOnly is true.
  152. void removeNodes(QVector<Node *> p_nodes, bool p_skipRecycleBin, bool p_configOnly);
  153. void filterAwayChildrenNodes(QVector<Node *> &p_nodes);
  154. void updateAndExpandNode(Node *p_node);
  155. // Check if all selected items are the same type for operations.
  156. bool allSelectedItemsSameType() const;
  157. // Skip the recycle bin node if possible.
  158. void focusNormalNode();
  159. void sortNodes(QVector<QSharedPointer<Node>> &p_nodes) const;
  160. // [p_start, p_end).
  161. void sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int p_start, int p_end, int p_viewOrder) const;
  162. // Sort nodes in config file.
  163. void manualSort();
  164. void openSelectedNodes();
  165. QSharedPointer<Node> importToIndex(const ExternalNode *p_node);
  166. void importToIndex(const QVector<ExternalNode *> &p_nodes);
  167. // Check whether @p_node is a valid node. Will notify user.
  168. // Return true if it is invalid.
  169. bool checkInvalidNode(Node *p_node) const;
  170. void expandCurrentNodeAll();
  171. void expandItemRecursively(QTreeWidgetItem *p_item);
  172. void addOpenWithMenu(QMenu *p_menu);
  173. QStringList getSelectedNodesPath() const;
  174. void openSelectedNodesWithDefaultProgram();
  175. void openSelectedNodesWithExternalProgram(const QString &p_command);
  176. static NotebookNodeExplorer::NodeData getItemNodeData(const QTreeWidgetItem *p_item);
  177. static void setItemNodeData(QTreeWidgetItem *p_item, const NodeData &p_data);
  178. QSplitter *m_splitter = nullptr;
  179. TreeWidget *m_masterExplorer = nullptr;
  180. QSharedPointer<Notebook> m_notebook;
  181. QHash<const Notebook *, QSharedPointer<QTreeWidgetStateCache<Node *>>> m_stateCache;
  182. QScopedPointer<NavigationModeWrapper<QTreeWidget, QTreeWidgetItem>> m_navigationWrapper;
  183. bool m_recycleBinNodeVisible = false;
  184. int m_viewOrder = ViewOrder::OrderedByConfiguration;
  185. bool m_externalFilesVisible = true;
  186. bool m_autoImportExternalFiles = true;
  187. static QIcon s_folderNodeIcon;
  188. static QIcon s_fileNodeIcon;
  189. static QIcon s_invalidFolderNodeIcon;
  190. static QIcon s_invalidFileNodeIcon;
  191. static QIcon s_recycleBinNodeIcon;
  192. static QIcon s_externalFolderNodeIcon;
  193. static QIcon s_externalFileNodeIcon;
  194. };
  195. }
  196. Q_DECLARE_METATYPE(vnotex::NotebookNodeExplorer::NodeData);
  197. #endif // NOTEBOOKNODEEXPLORER_H