From 89cd40d0cf7b843812a7caeb9dc6d8755e3bda5e Mon Sep 17 00:00:00 2001 From: Le Tan Date: Fri, 7 Oct 2022 21:02:00 +0800 Subject: [PATCH] NotebookExplorer: support view mode for notbooks --- src/core/global.h | 12 +++++ src/core/widgetconfig.cpp | 14 ++++++ src/core/widgetconfig.h | 5 +++ src/data/core/vnotex.json | 4 +- src/widgets/notebookexplorer.cpp | 65 +++++++++++++++++----------- src/widgets/notebookexplorer.h | 2 +- src/widgets/notebooknodeexplorer.cpp | 6 +-- src/widgets/notebooknodeexplorer.h | 13 +----- src/widgets/notebookselector.cpp | 60 +++++++++++++++++++++++-- src/widgets/notebookselector.h | 9 +++- 10 files changed, 142 insertions(+), 48 deletions(-) diff --git a/src/core/global.h b/src/core/global.h index ccb5d013..35a7b3e0 100644 --- a/src/core/global.h +++ b/src/core/global.h @@ -186,6 +186,18 @@ namespace vnotex // Used for comparison. ComparisonRole = 0x0103 }; + + enum ViewOrder + { + OrderedByConfiguration = 0, + OrderedByName, + OrderedByNameReversed, + OrderedByCreatedTime, + OrderedByCreatedTimeReversed, + OrderedByModifiedTime, + OrderedByModifiedTimeReversed, + ViewOrderMax + }; } // ns vnotex Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::FindOptions); diff --git a/src/core/widgetconfig.cpp b/src/core/widgetconfig.cpp index 86c32f39..7cfb3a3a 100644 --- a/src/core/widgetconfig.cpp +++ b/src/core/widgetconfig.cpp @@ -29,6 +29,8 @@ void WidgetConfig::init(const QJsonObject &p_app, m_findAndReplaceOptions = static_cast(READINT(QStringLiteral("find_and_replace_options"))); + m_notebookSelectorViewOrder = READINT(QStringLiteral("notebook_selector_view_order")); + { m_nodeExplorerViewOrder = READINT(QStringLiteral("node_explorer_view_order")); m_nodeExplorerExploreMode = READINT(QStringLiteral("node_explorer_explore_mode")); @@ -58,6 +60,8 @@ QJsonObject WidgetConfig::toJson() const obj[QStringLiteral("find_and_replace_options")] = static_cast(m_findAndReplaceOptions); + obj[QStringLiteral("notebook_selector_view_order")] = m_notebookSelectorViewOrder; + obj[QStringLiteral("node_explorer_view_order")] = m_nodeExplorerViewOrder; obj[QStringLiteral("node_explorer_explore_mode")] = m_nodeExplorerExploreMode; obj[QStringLiteral("node_explorer_external_files_visible")] = m_nodeExplorerExternalFilesVisible; @@ -114,6 +118,16 @@ void WidgetConfig::setNodeExplorerViewOrder(int p_viewOrder) updateConfig(m_nodeExplorerViewOrder, p_viewOrder, this); } +int WidgetConfig::getNotebookSelectorViewOrder() const +{ + return m_notebookSelectorViewOrder; +} + +void WidgetConfig::setNotebookSelectorViewOrder(int p_viewOrder) +{ + updateConfig(m_notebookSelectorViewOrder, p_viewOrder, this); +} + int WidgetConfig::getNodeExplorerExploreMode() const { return m_nodeExplorerExploreMode; diff --git a/src/core/widgetconfig.h b/src/core/widgetconfig.h index d5094f5a..e9fcc476 100644 --- a/src/core/widgetconfig.h +++ b/src/core/widgetconfig.h @@ -27,6 +27,9 @@ namespace vnotex FindOptions getFindAndReplaceOptions() const; void setFindAndReplaceOptions(FindOptions p_options); + int getNotebookSelectorViewOrder() const; + void setNotebookSelectorViewOrder(int p_viewOrder); + int getNodeExplorerViewOrder() const; void setNodeExplorerViewOrder(int p_viewOrder); @@ -67,6 +70,8 @@ namespace vnotex FindOptions m_findAndReplaceOptions = FindOption::FindNone; + int m_notebookSelectorViewOrder = 0; + int m_nodeExplorerViewOrder = 0; int m_nodeExplorerExploreMode = 1; diff --git a/src/data/core/vnotex.json b/src/data/core/vnotex.json index 8beab33c..799d61cf 100644 --- a/src/data/core/vnotex.json +++ b/src/data/core/vnotex.json @@ -487,7 +487,9 @@ "outline_section_number_enabled" : false, "//comment" : "Default find options in FindAndReplace", "find_and_replace_options" : 16, - "//comment" : "View order of the node explorer (NotebookNodeExplorer::ViewOrder)", + "//comment" : "View order of the notebook selector (enum ViewOrder)", + "notebook_selector_view_order" : 0, + "//comment" : "View order of the node explorer (enum ViewOrder)", "node_explorer_view_order" : 0, "node_explorer_external_files_visible" : true, "node_explorer_auto_import_external_files_enabled" : true, diff --git a/src/widgets/notebookexplorer.cpp b/src/widgets/notebookexplorer.cpp index 0a87455e..e5506973 100644 --- a/src/widgets/notebookexplorer.cpp +++ b/src/widgets/notebookexplorer.cpp @@ -19,7 +19,6 @@ #include #include "mainwindow.h" #include -#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -65,11 +65,14 @@ void NotebookExplorer::setupUI() auto titleBar = setupTitleBar(this); mainLayout->addWidget(titleBar); + const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig(); + // Selector. m_selector = new NotebookSelector(this); m_selector->setWhatsThis(tr("Select one of all the notebooks as current notebook.
" "Move mouse on one item to check its details.")); NavigationModeMgr::getInst().registerNavigationTarget(m_selector); + m_selector->setViewOrder(widgetConfig.getNotebookSelectorViewOrder()); connect(m_selector, QOverload::of(&QComboBox::activated), this, [this](int p_idx) { auto id = static_cast(m_selector->itemData(p_idx).toULongLong()); @@ -79,7 +82,6 @@ void NotebookExplorer::setupUI() this, &NotebookExplorer::newNotebook); mainLayout->addWidget(m_selector); - const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig(); m_nodeExplorer = new NotebookNodeExplorer(this); m_nodeExplorer->setViewOrder(widgetConfig.getNodeExplorerViewOrder()); m_nodeExplorer->setExploreMode(widgetConfig.getNodeExplorerExploreMode()); @@ -114,8 +116,13 @@ TitleBar *NotebookExplorer::setupTitleBar(QWidget *p_parent) { auto viewMenu = WidgetsFactory::createMenu(titleBar); - setupViewMenu(viewMenu); - titleBar->addActionButton(QStringLiteral("view.svg"), tr("View"), viewMenu); + + auto notebookMenu = viewMenu->addMenu(tr("Notebooks")); + setupViewMenu(notebookMenu, true); + auto nodeMenu = viewMenu->addMenu(tr("Notes")); + setupViewMenu(nodeMenu, false); + + titleBar->addActionButton(QStringLiteral("view.svg"), tr("View By"), viewMenu); } { @@ -210,9 +217,7 @@ TitleBar *NotebookExplorer::setupTitleBar(QWidget *p_parent) void NotebookExplorer::loadNotebooks() { - auto ¬ebookMgr = VNoteX::getInst().getNotebookMgr(); - const auto ¬ebooks = notebookMgr.getNotebooks(); - m_selector->setNotebooks(notebooks); + m_selector->loadNotebooks(); } void NotebookExplorer::reloadNotebook(const Notebook *p_notebook) @@ -381,47 +386,50 @@ const QSharedPointer &NotebookExplorer::currentNotebook() const return m_currentNotebook; } -void NotebookExplorer::setupViewMenu(QMenu *p_menu) +void NotebookExplorer::setupViewMenu(QMenu *p_menu, bool p_isNotebookView) { auto ag = new QActionGroup(p_menu); auto act = ag->addAction(tr("View By Configuration")); act->setCheckable(true); act->setChecked(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByConfiguration); + act->setData(ViewOrder::OrderedByConfiguration); p_menu->addAction(act); act = ag->addAction(tr("View By Name")); act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByName); + act->setData(ViewOrder::OrderedByName); p_menu->addAction(act); act = ag->addAction(tr("View By Name (Reversed)")); act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByNameReversed); + act->setData(ViewOrder::OrderedByNameReversed); p_menu->addAction(act); act = ag->addAction(tr("View By Created Time")); act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByCreatedTime); + act->setData(ViewOrder::OrderedByCreatedTime); p_menu->addAction(act); act = ag->addAction(tr("View By Created Time (Reversed)")); act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByCreatedTimeReversed); + act->setData(ViewOrder::OrderedByCreatedTimeReversed); p_menu->addAction(act); - act = ag->addAction(tr("View By Modified Time")); - act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByModifiedTime); - p_menu->addAction(act); + if (!p_isNotebookView) { + act = ag->addAction(tr("View By Modified Time")); + act->setCheckable(true); + act->setData(ViewOrder::OrderedByModifiedTime); + p_menu->addAction(act); - act = ag->addAction(tr("View By Modified Time (Reversed)")); - act->setCheckable(true); - act->setData(NotebookNodeExplorer::ViewOrder::OrderedByModifiedTimeReversed); - p_menu->addAction(act); + act = ag->addAction(tr("View By Modified Time (Reversed)")); + act->setCheckable(true); + act->setData(ViewOrder::OrderedByModifiedTimeReversed); + p_menu->addAction(act); + } - int viewOrder = ConfigMgr::getInst().getWidgetConfig().getNodeExplorerViewOrder(); + const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig(); + int viewOrder = p_isNotebookView ? widgetConfig.getNotebookSelectorViewOrder() : widgetConfig.getNodeExplorerViewOrder(); for (const auto &act : ag->actions()) { if (act->data().toInt() == viewOrder) { act->setChecked(true); @@ -429,10 +437,15 @@ void NotebookExplorer::setupViewMenu(QMenu *p_menu) } connect(ag, &QActionGroup::triggered, - this, [this](QAction *p_action) { - int order = p_action->data().toInt(); - ConfigMgr::getInst().getWidgetConfig().setNodeExplorerViewOrder(order); - m_nodeExplorer->setViewOrder(order); + this, [this, p_isNotebookView](QAction *p_action) { + const int order = p_action->data().toInt(); + if (p_isNotebookView) { + ConfigMgr::getInst().getWidgetConfig().setNotebookSelectorViewOrder(order); + m_selector->setViewOrder(order); + } else { + ConfigMgr::getInst().getWidgetConfig().setNodeExplorerViewOrder(order); + m_nodeExplorer->setViewOrder(order); + } }); } diff --git a/src/widgets/notebookexplorer.h b/src/widgets/notebookexplorer.h index baf73805..adfd8a84 100644 --- a/src/widgets/notebookexplorer.h +++ b/src/widgets/notebookexplorer.h @@ -71,7 +71,7 @@ namespace vnotex Node *checkNotebookAndGetCurrentExploredFolderNode() const; - void setupViewMenu(QMenu *p_menu); + void setupViewMenu(QMenu *p_menu, bool p_isNotebookView); void setupRecycleBinMenu(QMenu *p_menu); diff --git a/src/widgets/notebooknodeexplorer.cpp b/src/widgets/notebooknodeexplorer.cpp index babf13d6..227883fd 100644 --- a/src/widgets/notebooknodeexplorer.cpp +++ b/src/widgets/notebooknodeexplorer.cpp @@ -1852,7 +1852,7 @@ void NotebookNodeExplorer::sortNodes(QVector> &p_nodes, int reversed = true; Q_FALLTHROUGH(); case ViewOrder::OrderedByName: - std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer p_b) { + std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer &p_b) { if (reversed) { return p_b->getName().toLower() < p_a->getName().toLower(); } else { @@ -1865,7 +1865,7 @@ void NotebookNodeExplorer::sortNodes(QVector> &p_nodes, int reversed = true; Q_FALLTHROUGH(); case ViewOrder::OrderedByCreatedTime: - std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer p_b) { + std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer &p_b) { if (reversed) { return p_b->getCreatedTimeUtc() < p_a->getCreatedTimeUtc(); } else { @@ -1878,7 +1878,7 @@ void NotebookNodeExplorer::sortNodes(QVector> &p_nodes, int reversed = true; Q_FALLTHROUGH(); case ViewOrder::OrderedByModifiedTime: - std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer p_b) { + std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer &p_a, const QSharedPointer &p_b) { if (reversed) { return p_b->getModifiedTimeUtc() < p_a->getModifiedTimeUtc(); } else { diff --git a/src/widgets/notebooknodeexplorer.h b/src/widgets/notebooknodeexplorer.h index 10f194fe..88fdcdbe 100644 --- a/src/widgets/notebooknodeexplorer.h +++ b/src/widgets/notebooknodeexplorer.h @@ -10,6 +10,7 @@ #include "qtreewidgetstatecache.h" #include "clipboarddata.h" #include "navigationmodewrapper.h" +#include "global.h" class QSplitter; class QMenu; @@ -78,18 +79,6 @@ namespace vnotex bool m_loaded = false; }; - enum ViewOrder - { - OrderedByConfiguration = 0, - OrderedByName, - OrderedByNameReversed, - OrderedByCreatedTime, - OrderedByCreatedTimeReversed, - OrderedByModifiedTime, - OrderedByModifiedTimeReversed, - ViewOrderMax - }; - enum ExploreMode { Combined = 0, diff --git a/src/widgets/notebookselector.cpp b/src/widgets/notebookselector.cpp index 9a6570fe..0b825991 100644 --- a/src/widgets/notebookselector.cpp +++ b/src/widgets/notebookselector.cpp @@ -7,8 +7,9 @@ #include #include -#include "vnotex.h" -#include "notebook/notebook.h" +#include +#include +#include #include #include @@ -26,11 +27,15 @@ NotebookSelector::NotebookSelector(QWidget *p_parent) setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); } -void NotebookSelector::setNotebooks(const QVector> &p_notebooks) +void NotebookSelector::loadNotebooks() { clear(); - for (auto &nb : p_notebooks) { + auto ¬ebookMgr = VNoteX::getInst().getNotebookMgr(); + auto notebooks = notebookMgr.getNotebooks(); + sortNotebooks(notebooks); + + for (auto &nb : notebooks) { addNotebookItem(nb); } @@ -39,6 +44,41 @@ void NotebookSelector::setNotebooks(const QVector> &p_n m_notebooksInitialized = true; } +void NotebookSelector::sortNotebooks(QVector> &p_notebooks) const +{ + bool reversed = false; + switch (m_viewOrder) { + case ViewOrder::OrderedByNameReversed: + reversed = true; + Q_FALLTHROUGH(); + case ViewOrder::OrderedByName: + std::sort(p_notebooks.begin(), p_notebooks.end(), [reversed](const QSharedPointer &p_a, const QSharedPointer &p_b) { + if (reversed) { + return p_b->getName().toLower() < p_a->getName().toLower(); + } else { + return p_a->getName().toLower() < p_b->getName().toLower(); + } + }); + break; + + case ViewOrder::OrderedByCreatedTimeReversed: + reversed = true; + Q_FALLTHROUGH(); + case ViewOrder::OrderedByCreatedTime: + std::sort(p_notebooks.begin(), p_notebooks.end(), [reversed](const QSharedPointer &p_a, const QSharedPointer &p_b) { + if (reversed) { + return p_b->getCreatedTimeUtc() < p_a->getCreatedTimeUtc(); + } else { + return p_a->getCreatedTimeUtc() < p_b->getCreatedTimeUtc(); + } + }); + break; + + default: + break; + } +} + void NotebookSelector::reloadNotebook(const Notebook *p_notebook) { Q_ASSERT(p_notebook); @@ -216,3 +256,15 @@ void NotebookSelector::mousePressEvent(QMouseEvent *p_event) ComboBox::mousePressEvent(p_event); } + +void NotebookSelector::setViewOrder(int p_order) +{ + if (m_viewOrder == p_order) { + return; + } + + if (p_order >= 0 && p_order < ViewOrder::ViewOrderMax) { + m_viewOrder = static_cast(p_order); + loadNotebooks(); + } +} diff --git a/src/widgets/notebookselector.h b/src/widgets/notebookselector.h index e84ccde7..a6673122 100644 --- a/src/widgets/notebookselector.h +++ b/src/widgets/notebookselector.h @@ -6,6 +6,7 @@ #include "global.h" #include "navigationmode.h" #include "combobox.h" +#include "notebooknodeexplorer.h" namespace vnotex { @@ -17,12 +18,14 @@ namespace vnotex public: explicit NotebookSelector(QWidget *p_parent = nullptr); - void setNotebooks(const QVector> &p_notebooks); + void loadNotebooks(); void reloadNotebook(const Notebook *p_notebook); void setCurrentNotebook(ID p_id); + void setViewOrder(int p_order); + signals: void newNotebookRequested(); @@ -53,11 +56,15 @@ namespace vnotex int findNotebook(ID p_id) const; + void sortNotebooks(QVector> &p_notebooks) const; + static void fetchIconColor(const QString &p_name, QString &p_fg, QString &p_bg); bool m_notebooksInitialized = false; QVector m_navigationIndexes; + + ViewOrder m_viewOrder = ViewOrder::OrderedByConfiguration; }; } // ns vnotex