浏览代码

sort notes by name case-insensitively

Le Tan 4 年之前
父节点
当前提交
7cc31a5d6e

+ 9 - 0
src/widgets/dialogs/sortdialog.cpp

@@ -8,6 +8,7 @@
 
 #include <widgets/treewidget.h>
 #include <widgets/widgetsfactory.h>
+#include <widgets/treewidgetitem.h>
 
 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;
+}

+ 4 - 0
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<QVariant> getSortedData() const;
 
+        // Add one item to the tree.
+        QTreeWidgetItem *addItem(const QStringList &p_cols);
+
     private:
         enum MoveOperation
         {

+ 3 - 3
src/widgets/notebooknodeexplorer.cpp

@@ -1660,9 +1660,9 @@ void NotebookNodeExplorer::sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int
     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) {
             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);
             }
         }

+ 25 - 0
src/widgets/treewidgetitem.cpp

@@ -0,0 +1,25 @@
+#include "treewidgetitem.h"
+
+#include <QTreeWidget>
+#include <QVariant>
+
+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<QString>() && v2.canConvert<QString>()) {
+        const auto s1 = v1.toString().toLower();
+        const auto s2 = v2.toString().toLower();
+        return s1 < s2;
+    }
+
+    return QTreeWidgetItem::operator<(p_other);
+}

+ 20 - 0
src/widgets/treewidgetitem.h

@@ -0,0 +1,20 @@
+#ifndef TREEWIDGETITEM_H
+#define TREEWIDGETITEM_H
+
+#include <QTreeWidgetItem>
+
+
+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

+ 2 - 0
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 \