NotebookExplorer: support view mode for notbooks

This commit is contained in:
Le Tan 2022-10-07 21:02:00 +08:00
parent 3d77c29393
commit 89cd40d0cf
10 changed files with 142 additions and 48 deletions

View File

@ -186,6 +186,18 @@ namespace vnotex
// Used for comparison. // Used for comparison.
ComparisonRole = 0x0103 ComparisonRole = 0x0103
}; };
enum ViewOrder
{
OrderedByConfiguration = 0,
OrderedByName,
OrderedByNameReversed,
OrderedByCreatedTime,
OrderedByCreatedTimeReversed,
OrderedByModifiedTime,
OrderedByModifiedTimeReversed,
ViewOrderMax
};
} // ns vnotex } // ns vnotex
Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::FindOptions); Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::FindOptions);

View File

@ -29,6 +29,8 @@ void WidgetConfig::init(const QJsonObject &p_app,
m_findAndReplaceOptions = static_cast<FindOptions>(READINT(QStringLiteral("find_and_replace_options"))); m_findAndReplaceOptions = static_cast<FindOptions>(READINT(QStringLiteral("find_and_replace_options")));
m_notebookSelectorViewOrder = READINT(QStringLiteral("notebook_selector_view_order"));
{ {
m_nodeExplorerViewOrder = READINT(QStringLiteral("node_explorer_view_order")); m_nodeExplorerViewOrder = READINT(QStringLiteral("node_explorer_view_order"));
m_nodeExplorerExploreMode = READINT(QStringLiteral("node_explorer_explore_mode")); m_nodeExplorerExploreMode = READINT(QStringLiteral("node_explorer_explore_mode"));
@ -58,6 +60,8 @@ QJsonObject WidgetConfig::toJson() const
obj[QStringLiteral("find_and_replace_options")] = static_cast<int>(m_findAndReplaceOptions); obj[QStringLiteral("find_and_replace_options")] = static_cast<int>(m_findAndReplaceOptions);
obj[QStringLiteral("notebook_selector_view_order")] = m_notebookSelectorViewOrder;
obj[QStringLiteral("node_explorer_view_order")] = m_nodeExplorerViewOrder; obj[QStringLiteral("node_explorer_view_order")] = m_nodeExplorerViewOrder;
obj[QStringLiteral("node_explorer_explore_mode")] = m_nodeExplorerExploreMode; obj[QStringLiteral("node_explorer_explore_mode")] = m_nodeExplorerExploreMode;
obj[QStringLiteral("node_explorer_external_files_visible")] = m_nodeExplorerExternalFilesVisible; 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); 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 int WidgetConfig::getNodeExplorerExploreMode() const
{ {
return m_nodeExplorerExploreMode; return m_nodeExplorerExploreMode;

View File

@ -27,6 +27,9 @@ namespace vnotex
FindOptions getFindAndReplaceOptions() const; FindOptions getFindAndReplaceOptions() const;
void setFindAndReplaceOptions(FindOptions p_options); void setFindAndReplaceOptions(FindOptions p_options);
int getNotebookSelectorViewOrder() const;
void setNotebookSelectorViewOrder(int p_viewOrder);
int getNodeExplorerViewOrder() const; int getNodeExplorerViewOrder() const;
void setNodeExplorerViewOrder(int p_viewOrder); void setNodeExplorerViewOrder(int p_viewOrder);
@ -67,6 +70,8 @@ namespace vnotex
FindOptions m_findAndReplaceOptions = FindOption::FindNone; FindOptions m_findAndReplaceOptions = FindOption::FindNone;
int m_notebookSelectorViewOrder = 0;
int m_nodeExplorerViewOrder = 0; int m_nodeExplorerViewOrder = 0;
int m_nodeExplorerExploreMode = 1; int m_nodeExplorerExploreMode = 1;

View File

@ -487,7 +487,9 @@
"outline_section_number_enabled" : false, "outline_section_number_enabled" : false,
"//comment" : "Default find options in FindAndReplace", "//comment" : "Default find options in FindAndReplace",
"find_and_replace_options" : 16, "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_view_order" : 0,
"node_explorer_external_files_visible" : true, "node_explorer_external_files_visible" : true,
"node_explorer_auto_import_external_files_enabled" : true, "node_explorer_auto_import_external_files_enabled" : true,

View File

@ -19,7 +19,6 @@
#include <core/vnotex.h> #include <core/vnotex.h>
#include "mainwindow.h" #include "mainwindow.h"
#include <notebook/notebook.h> #include <notebook/notebook.h>
#include <core/notebookmgr.h>
#include <utils/iconutils.h> #include <utils/iconutils.h>
#include <utils/widgetutils.h> #include <utils/widgetutils.h>
#include <utils/pathutils.h> #include <utils/pathutils.h>
@ -29,6 +28,7 @@
#include <core/configmgr.h> #include <core/configmgr.h>
#include <core/coreconfig.h> #include <core/coreconfig.h>
#include <core/widgetconfig.h> #include <core/widgetconfig.h>
#include <core/sessionconfig.h>
#include <core/events.h> #include <core/events.h>
#include <core/exception.h> #include <core/exception.h>
#include <core/fileopenparameters.h> #include <core/fileopenparameters.h>
@ -65,11 +65,14 @@ void NotebookExplorer::setupUI()
auto titleBar = setupTitleBar(this); auto titleBar = setupTitleBar(this);
mainLayout->addWidget(titleBar); mainLayout->addWidget(titleBar);
const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig();
// Selector. // Selector.
m_selector = new NotebookSelector(this); m_selector = new NotebookSelector(this);
m_selector->setWhatsThis(tr("Select one of all the notebooks as current notebook.<br/>" m_selector->setWhatsThis(tr("Select one of all the notebooks as current notebook.<br/>"
"Move mouse on one item to check its details.")); "Move mouse on one item to check its details."));
NavigationModeMgr::getInst().registerNavigationTarget(m_selector); NavigationModeMgr::getInst().registerNavigationTarget(m_selector);
m_selector->setViewOrder(widgetConfig.getNotebookSelectorViewOrder());
connect(m_selector, QOverload<int>::of(&QComboBox::activated), connect(m_selector, QOverload<int>::of(&QComboBox::activated),
this, [this](int p_idx) { this, [this](int p_idx) {
auto id = static_cast<ID>(m_selector->itemData(p_idx).toULongLong()); auto id = static_cast<ID>(m_selector->itemData(p_idx).toULongLong());
@ -79,7 +82,6 @@ void NotebookExplorer::setupUI()
this, &NotebookExplorer::newNotebook); this, &NotebookExplorer::newNotebook);
mainLayout->addWidget(m_selector); mainLayout->addWidget(m_selector);
const auto &widgetConfig = ConfigMgr::getInst().getWidgetConfig();
m_nodeExplorer = new NotebookNodeExplorer(this); m_nodeExplorer = new NotebookNodeExplorer(this);
m_nodeExplorer->setViewOrder(widgetConfig.getNodeExplorerViewOrder()); m_nodeExplorer->setViewOrder(widgetConfig.getNodeExplorerViewOrder());
m_nodeExplorer->setExploreMode(widgetConfig.getNodeExplorerExploreMode()); m_nodeExplorer->setExploreMode(widgetConfig.getNodeExplorerExploreMode());
@ -114,8 +116,13 @@ TitleBar *NotebookExplorer::setupTitleBar(QWidget *p_parent)
{ {
auto viewMenu = WidgetsFactory::createMenu(titleBar); 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() void NotebookExplorer::loadNotebooks()
{ {
auto &notebookMgr = VNoteX::getInst().getNotebookMgr(); m_selector->loadNotebooks();
const auto &notebooks = notebookMgr.getNotebooks();
m_selector->setNotebooks(notebooks);
} }
void NotebookExplorer::reloadNotebook(const Notebook *p_notebook) void NotebookExplorer::reloadNotebook(const Notebook *p_notebook)
@ -381,47 +386,50 @@ const QSharedPointer<Notebook> &NotebookExplorer::currentNotebook() const
return m_currentNotebook; 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 ag = new QActionGroup(p_menu);
auto act = ag->addAction(tr("View By Configuration")); auto act = ag->addAction(tr("View By Configuration"));
act->setCheckable(true); act->setCheckable(true);
act->setChecked(true); act->setChecked(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByConfiguration); act->setData(ViewOrder::OrderedByConfiguration);
p_menu->addAction(act); p_menu->addAction(act);
act = ag->addAction(tr("View By Name")); act = ag->addAction(tr("View By Name"));
act->setCheckable(true); act->setCheckable(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByName); act->setData(ViewOrder::OrderedByName);
p_menu->addAction(act); p_menu->addAction(act);
act = ag->addAction(tr("View By Name (Reversed)")); act = ag->addAction(tr("View By Name (Reversed)"));
act->setCheckable(true); act->setCheckable(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByNameReversed); act->setData(ViewOrder::OrderedByNameReversed);
p_menu->addAction(act); p_menu->addAction(act);
act = ag->addAction(tr("View By Created Time")); act = ag->addAction(tr("View By Created Time"));
act->setCheckable(true); act->setCheckable(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByCreatedTime); act->setData(ViewOrder::OrderedByCreatedTime);
p_menu->addAction(act); p_menu->addAction(act);
act = ag->addAction(tr("View By Created Time (Reversed)")); act = ag->addAction(tr("View By Created Time (Reversed)"));
act->setCheckable(true); act->setCheckable(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByCreatedTimeReversed); act->setData(ViewOrder::OrderedByCreatedTimeReversed);
p_menu->addAction(act); p_menu->addAction(act);
act = ag->addAction(tr("View By Modified Time")); if (!p_isNotebookView) {
act->setCheckable(true); act = ag->addAction(tr("View By Modified Time"));
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByModifiedTime); act->setCheckable(true);
p_menu->addAction(act); act->setData(ViewOrder::OrderedByModifiedTime);
p_menu->addAction(act);
act = ag->addAction(tr("View By Modified Time (Reversed)")); act = ag->addAction(tr("View By Modified Time (Reversed)"));
act->setCheckable(true); act->setCheckable(true);
act->setData(NotebookNodeExplorer::ViewOrder::OrderedByModifiedTimeReversed); act->setData(ViewOrder::OrderedByModifiedTimeReversed);
p_menu->addAction(act); 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()) { for (const auto &act : ag->actions()) {
if (act->data().toInt() == viewOrder) { if (act->data().toInt() == viewOrder) {
act->setChecked(true); act->setChecked(true);
@ -429,10 +437,15 @@ void NotebookExplorer::setupViewMenu(QMenu *p_menu)
} }
connect(ag, &QActionGroup::triggered, connect(ag, &QActionGroup::triggered,
this, [this](QAction *p_action) { this, [this, p_isNotebookView](QAction *p_action) {
int order = p_action->data().toInt(); const int order = p_action->data().toInt();
ConfigMgr::getInst().getWidgetConfig().setNodeExplorerViewOrder(order); if (p_isNotebookView) {
m_nodeExplorer->setViewOrder(order); ConfigMgr::getInst().getWidgetConfig().setNotebookSelectorViewOrder(order);
m_selector->setViewOrder(order);
} else {
ConfigMgr::getInst().getWidgetConfig().setNodeExplorerViewOrder(order);
m_nodeExplorer->setViewOrder(order);
}
}); });
} }

View File

@ -71,7 +71,7 @@ namespace vnotex
Node *checkNotebookAndGetCurrentExploredFolderNode() const; Node *checkNotebookAndGetCurrentExploredFolderNode() const;
void setupViewMenu(QMenu *p_menu); void setupViewMenu(QMenu *p_menu, bool p_isNotebookView);
void setupRecycleBinMenu(QMenu *p_menu); void setupRecycleBinMenu(QMenu *p_menu);

View File

@ -1852,7 +1852,7 @@ void NotebookNodeExplorer::sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int
reversed = true; reversed = true;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case ViewOrder::OrderedByName: case ViewOrder::OrderedByName:
std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> p_b) { std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> &p_b) {
if (reversed) { if (reversed) {
return p_b->getName().toLower() < p_a->getName().toLower(); return p_b->getName().toLower() < p_a->getName().toLower();
} else { } else {
@ -1865,7 +1865,7 @@ void NotebookNodeExplorer::sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int
reversed = true; reversed = true;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case ViewOrder::OrderedByCreatedTime: case ViewOrder::OrderedByCreatedTime:
std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> p_b) { std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> &p_b) {
if (reversed) { if (reversed) {
return p_b->getCreatedTimeUtc() < p_a->getCreatedTimeUtc(); return p_b->getCreatedTimeUtc() < p_a->getCreatedTimeUtc();
} else { } else {
@ -1878,7 +1878,7 @@ void NotebookNodeExplorer::sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int
reversed = true; reversed = true;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case ViewOrder::OrderedByModifiedTime: case ViewOrder::OrderedByModifiedTime:
std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> p_b) { std::sort(p_nodes.begin() + p_start, p_nodes.begin() + p_end, [reversed](const QSharedPointer<Node> &p_a, const QSharedPointer<Node> &p_b) {
if (reversed) { if (reversed) {
return p_b->getModifiedTimeUtc() < p_a->getModifiedTimeUtc(); return p_b->getModifiedTimeUtc() < p_a->getModifiedTimeUtc();
} else { } else {

View File

@ -10,6 +10,7 @@
#include "qtreewidgetstatecache.h" #include "qtreewidgetstatecache.h"
#include "clipboarddata.h" #include "clipboarddata.h"
#include "navigationmodewrapper.h" #include "navigationmodewrapper.h"
#include "global.h"
class QSplitter; class QSplitter;
class QMenu; class QMenu;
@ -78,18 +79,6 @@ namespace vnotex
bool m_loaded = false; bool m_loaded = false;
}; };
enum ViewOrder
{
OrderedByConfiguration = 0,
OrderedByName,
OrderedByNameReversed,
OrderedByCreatedTime,
OrderedByCreatedTimeReversed,
OrderedByModifiedTime,
OrderedByModifiedTimeReversed,
ViewOrderMax
};
enum ExploreMode enum ExploreMode
{ {
Combined = 0, Combined = 0,

View File

@ -7,8 +7,9 @@
#include <QListView> #include <QListView>
#include <QScrollBar> #include <QScrollBar>
#include "vnotex.h" #include <notebook/notebook.h>
#include "notebook/notebook.h" #include <core/notebookmgr.h>
#include <core/vnotex.h>
#include <utils/iconutils.h> #include <utils/iconutils.h>
#include <utils/widgetutils.h> #include <utils/widgetutils.h>
@ -26,11 +27,15 @@ NotebookSelector::NotebookSelector(QWidget *p_parent)
setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon);
} }
void NotebookSelector::setNotebooks(const QVector<QSharedPointer<Notebook>> &p_notebooks) void NotebookSelector::loadNotebooks()
{ {
clear(); clear();
for (auto &nb : p_notebooks) { auto &notebookMgr = VNoteX::getInst().getNotebookMgr();
auto notebooks = notebookMgr.getNotebooks();
sortNotebooks(notebooks);
for (auto &nb : notebooks) {
addNotebookItem(nb); addNotebookItem(nb);
} }
@ -39,6 +44,41 @@ void NotebookSelector::setNotebooks(const QVector<QSharedPointer<Notebook>> &p_n
m_notebooksInitialized = true; m_notebooksInitialized = true;
} }
void NotebookSelector::sortNotebooks(QVector<QSharedPointer<Notebook>> &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<Notebook> &p_a, const QSharedPointer<Notebook> &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<Notebook> &p_a, const QSharedPointer<Notebook> &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) void NotebookSelector::reloadNotebook(const Notebook *p_notebook)
{ {
Q_ASSERT(p_notebook); Q_ASSERT(p_notebook);
@ -216,3 +256,15 @@ void NotebookSelector::mousePressEvent(QMouseEvent *p_event)
ComboBox::mousePressEvent(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<ViewOrder>(p_order);
loadNotebooks();
}
}

View File

@ -6,6 +6,7 @@
#include "global.h" #include "global.h"
#include "navigationmode.h" #include "navigationmode.h"
#include "combobox.h" #include "combobox.h"
#include "notebooknodeexplorer.h"
namespace vnotex namespace vnotex
{ {
@ -17,12 +18,14 @@ namespace vnotex
public: public:
explicit NotebookSelector(QWidget *p_parent = nullptr); explicit NotebookSelector(QWidget *p_parent = nullptr);
void setNotebooks(const QVector<QSharedPointer<Notebook>> &p_notebooks); void loadNotebooks();
void reloadNotebook(const Notebook *p_notebook); void reloadNotebook(const Notebook *p_notebook);
void setCurrentNotebook(ID p_id); void setCurrentNotebook(ID p_id);
void setViewOrder(int p_order);
signals: signals:
void newNotebookRequested(); void newNotebookRequested();
@ -53,11 +56,15 @@ namespace vnotex
int findNotebook(ID p_id) const; int findNotebook(ID p_id) const;
void sortNotebooks(QVector<QSharedPointer<Notebook>> &p_notebooks) const;
static void fetchIconColor(const QString &p_name, QString &p_fg, QString &p_bg); static void fetchIconColor(const QString &p_name, QString &p_fg, QString &p_bg);
bool m_notebooksInitialized = false; bool m_notebooksInitialized = false;
QVector<QModelIndex> m_navigationIndexes; QVector<QModelIndex> m_navigationIndexes;
ViewOrder m_viewOrder = ViewOrder::OrderedByConfiguration;
}; };
} // ns vnotex } // ns vnotex