From 4c1e5ec74ce01de634d0948768d8157dc54d7da6 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sat, 13 Aug 2022 17:19:05 -0400 Subject: Support numeric aware sorting on Windows and macOS * Fix #8356 - Qt does not enable numeric aware sorting when using locale sort. Extracted both Windows and macOS locale aware sorting code and added the appropriate numeric aware flag. Note: There is no std library way to do this so Linux is out of luck for now. --- src/gui/SortFilterHideProxyModel.cpp | 14 ++++++++++++++ src/gui/SortFilterHideProxyModel.h | 1 + 2 files changed, 15 insertions(+) diff --git a/src/gui/SortFilterHideProxyModel.cpp b/src/gui/SortFilterHideProxyModel.cpp index 0193d9594..20a1dfacc 100644 --- a/src/gui/SortFilterHideProxyModel.cpp +++ b/src/gui/SortFilterHideProxyModel.cpp @@ -16,6 +16,7 @@ */ #include "SortFilterHideProxyModel.h" +#include SortFilterHideProxyModel::SortFilterHideProxyModel(QObject* parent) : QSortFilterProxyModel(parent) @@ -41,3 +42,16 @@ bool SortFilterHideProxyModel::filterAcceptsColumn(int sourceColumn, const QMode return sourceColumn >= m_hiddenColumns.size() || !m_hiddenColumns.at(sourceColumn); } + +bool SortFilterHideProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right) const +{ + auto leftData = sourceModel()->data(left, sortRole()); + auto rightData = sourceModel()->data(right, sortRole()); + if (leftData.type() == QVariant::String) { + QCollator sorter; + sorter.setNumericMode(true); + return sorter.compare(leftData.toString(), rightData.toString()) < 0; + } + + return QSortFilterProxyModel::lessThan(left, right); +} diff --git a/src/gui/SortFilterHideProxyModel.h b/src/gui/SortFilterHideProxyModel.h index 58d9ff703..746ccbd96 100644 --- a/src/gui/SortFilterHideProxyModel.h +++ b/src/gui/SortFilterHideProxyModel.h @@ -32,6 +32,7 @@ public: protected: bool filterAcceptsColumn(int sourceColumn, const QModelIndex& sourceParent) const override; + bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; private: QBitArray m_hiddenColumns; -- cgit v1.2.3