diff options
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 47 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodel.h | 3 |
2 files changed, 22 insertions, 28 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 711b0797b..1c92a2c6b 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -25,7 +25,6 @@ #include <KLocalizedString> #include <KStringHandler> #include <KDebug> -#include <kstringhandler_deprecated.h> //TODO: port to QCollator #include "private/kfileitemmodelsortalgorithm.h" #include "private/kfileitemmodeldirlister.h" @@ -47,7 +46,6 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_sortRole(NameRole), m_sortingProgressPercent(-1), m_roles(), - m_caseSensitivity(Qt::CaseInsensitive), m_itemData(), m_items(), m_filter(), @@ -60,6 +58,9 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_expandedDirs(), m_urlsToExpand() { + m_collator.setCaseSensitivity(Qt::CaseInsensitive); + m_collator.setNumericMode(true); + m_dirLister = new KFileItemModelDirLister(this); m_dirLister->setDelayedMimeTypes(true); @@ -1733,9 +1734,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const case ImageSizeRole: { // Alway use a natural comparing to interpret the numbers of a string like // "1600 x 1200" for having a correct sorting. - result = KStringHandler::naturalCompare(a->values.value("imageSize").toString(), - b->values.value("imageSize").toString(), - Qt::CaseSensitive); + result = m_collator.compare(a->values.value("imageSize").toString(), + b->values.value("imageSize").toString()); break; } @@ -1760,8 +1760,7 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const } // Fallback #2: KFileItem::text() may not be unique in case UDS_DISPLAY_NAME is used - result = stringCompare(itemA.name(m_caseSensitivity == Qt::CaseInsensitive), - itemB.name(m_caseSensitivity == Qt::CaseInsensitive)); + result = stringCompare(itemA.name(), itemB.name()); if (result != 0) { return result; } @@ -1774,24 +1773,19 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const int KFileItemModel::stringCompare(const QString& a, const QString& b) const { - // Taken from KDirSortFilterProxyModel (kdelibs/kfile/kdirsortfilterproxymodel.*) - // Copyright (C) 2006 by Peter Penz <[email protected]> - // Copyright (C) 2006 by Dominic Battre <[email protected]> - // Copyright (C) 2006 by Martin Pool <[email protected]> + if (m_naturalSorting) { + return m_collator.compare(a, b); + } - if (m_caseSensitivity == Qt::CaseInsensitive) { - const int result = m_naturalSorting ? KStringHandler::naturalCompare(a, b, Qt::CaseInsensitive) - : QString::compare(a, b, Qt::CaseInsensitive); - if (result != 0) { - // Only return the result, if the strings are not equal. If they are equal by a case insensitive - // comparison, still a deterministic sort order is required. A case sensitive - // comparison is done as fallback. - return result; - } + const int result = QString::compare(a, b, m_collator.caseSensitivity()); + if (result != 0 || m_collator.caseSensitivity() == Qt::CaseSensitive) { + // Only return the result, if the strings are not equal. If they are equal by a case insensitive + // comparison, still a deterministic sort order is required. A case sensitive + // comparison is done as fallback. + return result; } - return m_naturalSorting ? KStringHandler::naturalCompare(a, b, Qt::CaseSensitive) - : QString::compare(a, b, Qt::CaseSensitive); + return QString::compare(a, b, Qt::CaseSensitive); } bool KFileItemModel::useMaximumUpdateInterval() const @@ -1799,11 +1793,6 @@ bool KFileItemModel::useMaximumUpdateInterval() const return !m_dirLister->url().isLocalFile(); } -static bool localeAwareLessThan(const QChar& c1, const QChar& c2) -{ - return QString::localeAwareCompare(c1, c2) < 0; -} - QList<QPair<int, QVariant> > KFileItemModel::nameRoleGroups() const { Q_ASSERT(!m_itemData.isEmpty()); @@ -1837,6 +1826,10 @@ QList<QPair<int, QVariant> > KFileItemModel::nameRoleGroups() const } } + auto localeAwareLessThan = [this](const QChar& c1, const QChar& c2) -> bool { + return m_collator.compare(c1, c2) < 0; + }; + std::vector<QChar>::iterator it = std::lower_bound(lettersAtoZ.begin(), lettersAtoZ.end(), newFirstChar, localeAwareLessThan); if (it != lettersAtoZ.end()) { if (localeAwareLessThan(newFirstChar, *it) && it != lettersAtoZ.begin()) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index d98d4538d..df7a5e3f0 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -26,6 +26,7 @@ #include <kitemviews/kitemmodelbase.h> #include <kitemviews/private/kfileitemmodelfilter.h> +#include <QCollator> #include <QHash> #include <QSet> @@ -455,13 +456,13 @@ private: private: KFileItemModelDirLister* m_dirLister; + QCollator m_collator; bool m_naturalSorting; bool m_sortDirsFirst; RoleType m_sortRole; int m_sortingProgressPercent; // Value of directorySortingProgress() signal QSet<QByteArray> m_roles; - Qt::CaseSensitivity m_caseSensitivity; QList<ItemData*> m_itemData; |
