From 7cc31a5d6e5ff345bf9b6c6dfbfebbcef058b4dc Mon Sep 17 00:00:00 2001 From: Le Tan Date: Mon, 16 Aug 2021 16:45:08 +0800 Subject: [PATCH] sort notes by name case-insensitively --- src/widgets/dialogs/sortdialog.cpp | 9 +++++++++ src/widgets/dialogs/sortdialog.h | 4 ++++ src/widgets/notebooknodeexplorer.cpp | 6 +++--- src/widgets/treewidgetitem.cpp | 25 +++++++++++++++++++++++++ src/widgets/treewidgetitem.h | 20 ++++++++++++++++++++ src/widgets/widgets.pri | 2 ++ 6 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/widgets/treewidgetitem.cpp create mode 100644 src/widgets/treewidgetitem.h diff --git a/src/widgets/dialogs/sortdialog.cpp b/src/widgets/dialogs/sortdialog.cpp index 473e9de7..b5c28326 100644 --- a/src/widgets/dialogs/sortdialog.cpp +++ b/src/widgets/dialogs/sortdialog.cpp @@ -8,6 +8,7 @@ #include #include +#include using namespace vnotex; @@ -37,6 +38,8 @@ void SortDialog::setupUI(const QString &p_title, const QString &p_info) mainLayout->addLayout(bodyLayout); // Tree widget. + // We want to sort it case-insensitive. QTreeView and QSortFilterProxyModel should be the choice. + // For simplicity, we subclass QTreeWidgetItem here. m_treeWidget = new TreeWidget(mainWidget); m_treeWidget->setRootIsDecorated(false); m_treeWidget->setSelectionMode(QAbstractItemView::ContiguousSelection); @@ -255,3 +258,9 @@ void SortDialog::handleMoveOperation(MoveOperation p_op) m_treeWidget->scrollToItem(firstItem); } } + +QTreeWidgetItem *SortDialog::addItem(const QStringList &p_cols) +{ + auto item = new TreeWidgetItem(m_treeWidget, p_cols); + return item; +} diff --git a/src/widgets/dialogs/sortdialog.h b/src/widgets/dialogs/sortdialog.h index b8c04884..13dc3ee2 100644 --- a/src/widgets/dialogs/sortdialog.h +++ b/src/widgets/dialogs/sortdialog.h @@ -4,6 +4,7 @@ #include "scrolldialog.h" class QTreeWidget; +class QTreeWidgetItem; class QPushButton; namespace vnotex @@ -22,6 +23,9 @@ namespace vnotex // Get user data of column 0 from sorted items. QVector getSortedData() const; + // Add one item to the tree. + QTreeWidgetItem *addItem(const QStringList &p_cols); + private: enum MoveOperation { diff --git a/src/widgets/notebooknodeexplorer.cpp b/src/widgets/notebooknodeexplorer.cpp index 126a378d..758db989 100644 --- a/src/widgets/notebooknodeexplorer.cpp +++ b/src/widgets/notebooknodeexplorer.cpp @@ -1660,9 +1660,9 @@ void NotebookNodeExplorer::sortNodes(QVector> &p_nodes, int case ViewOrder::OrderedByName: 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() < p_a->getName(); + return p_b->getName().toLower() < p_a->getName().toLower(); } else { - return p_a->getName() < p_b->getName(); + return p_a->getName().toLower() < p_b->getName().toLower(); } }); break; @@ -1769,7 +1769,7 @@ void NotebookNodeExplorer::manualSort() QStringList cols {child->getName(), Utils::dateTimeString(child->getCreatedTimeUtc().toLocalTime()), Utils::dateTimeString(child->getModifiedTimeUtc().toLocalTime())}; - auto item = new QTreeWidgetItem(treeWidget, cols); + auto item = sortDlg.addItem(cols); item->setData(0, Qt::UserRole, i); } } diff --git a/src/widgets/treewidgetitem.cpp b/src/widgets/treewidgetitem.cpp new file mode 100644 index 00000000..97867cf3 --- /dev/null +++ b/src/widgets/treewidgetitem.cpp @@ -0,0 +1,25 @@ +#include "treewidgetitem.h" + +#include +#include + +using namespace vnotex; + +TreeWidgetItem::TreeWidgetItem(QTreeWidget *p_parent, const QStringList &p_strings, int p_type) + : QTreeWidgetItem(p_parent, p_strings, p_type) +{ +} + +bool TreeWidgetItem::operator<(const QTreeWidgetItem &p_other) const +{ + int column = treeWidget() ? treeWidget()->sortColumn() : 0; + const QVariant v1 = data(column, Qt::DisplayRole); + const QVariant v2 = p_other.data(column, Qt::DisplayRole); + if (v1.canConvert() && v2.canConvert()) { + const auto s1 = v1.toString().toLower(); + const auto s2 = v2.toString().toLower(); + return s1 < s2; + } + + return QTreeWidgetItem::operator<(p_other); +} diff --git a/src/widgets/treewidgetitem.h b/src/widgets/treewidgetitem.h new file mode 100644 index 00000000..68254a9c --- /dev/null +++ b/src/widgets/treewidgetitem.h @@ -0,0 +1,20 @@ +#ifndef TREEWIDGETITEM_H +#define TREEWIDGETITEM_H + +#include + + +namespace vnotex +{ + // Provide additional features: + // 1. Sorting case-insensitive. + class TreeWidgetItem : public QTreeWidgetItem + { + public: + TreeWidgetItem(QTreeWidget *p_parent, const QStringList &p_strings, int p_type = Type); + + bool operator<(const QTreeWidgetItem &p_other) const Q_DECL_OVERRIDE; + }; +} + +#endif // TREEWIDGETITEM_H diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index 6b721084..e7683163 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -78,6 +78,7 @@ SOURCES += \ $$PWD/textviewwindow.cpp \ $$PWD/toolbarhelper.cpp \ $$PWD/treeview.cpp \ + $$PWD/treewidgetitem.cpp \ $$PWD/viewareasession.cpp \ $$PWD/viewsplit.cpp \ $$PWD/viewwindow.cpp \ @@ -193,6 +194,7 @@ HEADERS += \ $$PWD/textviewwindowhelper.h \ $$PWD/toolbarhelper.h \ $$PWD/treeview.h \ + $$PWD/treewidgetitem.h \ $$PWD/viewareasession.h \ $$PWD/viewsplit.h \ $$PWD/viewwindow.h \