sort notes by name case-insensitively

This commit is contained in:
Le Tan 2021-08-16 16:45:08 +08:00
parent f4aabc1f2d
commit 7cc31a5d6e
6 changed files with 63 additions and 3 deletions

View File

@ -8,6 +8,7 @@
#include <widgets/treewidget.h> #include <widgets/treewidget.h>
#include <widgets/widgetsfactory.h> #include <widgets/widgetsfactory.h>
#include <widgets/treewidgetitem.h>
using namespace vnotex; using namespace vnotex;
@ -37,6 +38,8 @@ void SortDialog::setupUI(const QString &p_title, const QString &p_info)
mainLayout->addLayout(bodyLayout); mainLayout->addLayout(bodyLayout);
// Tree widget. // 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 = new TreeWidget(mainWidget);
m_treeWidget->setRootIsDecorated(false); m_treeWidget->setRootIsDecorated(false);
m_treeWidget->setSelectionMode(QAbstractItemView::ContiguousSelection); m_treeWidget->setSelectionMode(QAbstractItemView::ContiguousSelection);
@ -255,3 +258,9 @@ void SortDialog::handleMoveOperation(MoveOperation p_op)
m_treeWidget->scrollToItem(firstItem); m_treeWidget->scrollToItem(firstItem);
} }
} }
QTreeWidgetItem *SortDialog::addItem(const QStringList &p_cols)
{
auto item = new TreeWidgetItem(m_treeWidget, p_cols);
return item;
}

View File

@ -4,6 +4,7 @@
#include "scrolldialog.h" #include "scrolldialog.h"
class QTreeWidget; class QTreeWidget;
class QTreeWidgetItem;
class QPushButton; class QPushButton;
namespace vnotex namespace vnotex
@ -22,6 +23,9 @@ namespace vnotex
// Get user data of column 0 from sorted items. // Get user data of column 0 from sorted items.
QVector<QVariant> getSortedData() const; QVector<QVariant> getSortedData() const;
// Add one item to the tree.
QTreeWidgetItem *addItem(const QStringList &p_cols);
private: private:
enum MoveOperation enum MoveOperation
{ {

View File

@ -1660,9 +1660,9 @@ void NotebookNodeExplorer::sortNodes(QVector<QSharedPointer<Node>> &p_nodes, int
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() < p_a->getName(); return p_b->getName().toLower() < p_a->getName().toLower();
} else { } else {
return p_a->getName() < p_b->getName(); return p_a->getName().toLower() < p_b->getName().toLower();
} }
}); });
break; break;
@ -1769,7 +1769,7 @@ void NotebookNodeExplorer::manualSort()
QStringList cols {child->getName(), QStringList cols {child->getName(),
Utils::dateTimeString(child->getCreatedTimeUtc().toLocalTime()), Utils::dateTimeString(child->getCreatedTimeUtc().toLocalTime()),
Utils::dateTimeString(child->getModifiedTimeUtc().toLocalTime())}; Utils::dateTimeString(child->getModifiedTimeUtc().toLocalTime())};
auto item = new QTreeWidgetItem(treeWidget, cols); auto item = sortDlg.addItem(cols);
item->setData(0, Qt::UserRole, i); item->setData(0, Qt::UserRole, i);
} }
} }

View File

@ -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);
}

View File

@ -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

View File

@ -78,6 +78,7 @@ SOURCES += \
$$PWD/textviewwindow.cpp \ $$PWD/textviewwindow.cpp \
$$PWD/toolbarhelper.cpp \ $$PWD/toolbarhelper.cpp \
$$PWD/treeview.cpp \ $$PWD/treeview.cpp \
$$PWD/treewidgetitem.cpp \
$$PWD/viewareasession.cpp \ $$PWD/viewareasession.cpp \
$$PWD/viewsplit.cpp \ $$PWD/viewsplit.cpp \
$$PWD/viewwindow.cpp \ $$PWD/viewwindow.cpp \
@ -193,6 +194,7 @@ HEADERS += \
$$PWD/textviewwindowhelper.h \ $$PWD/textviewwindowhelper.h \
$$PWD/toolbarhelper.h \ $$PWD/toolbarhelper.h \
$$PWD/treeview.h \ $$PWD/treeview.h \
$$PWD/treewidgetitem.h \
$$PWD/viewareasession.h \ $$PWD/viewareasession.h \
$$PWD/viewsplit.h \ $$PWD/viewsplit.h \
$$PWD/viewwindow.h \ $$PWD/viewwindow.h \