┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmmanuel Pescosta <[email protected]>2014-12-13 20:31:01 +0100
committerEmmanuel Pescosta <[email protected]>2014-12-17 17:48:10 +0100
commit95220eebae1be024b84b069ce9ae4be35c9e6a5f (patch)
treedae8f37c32901ca29bb9e11b0e4697163a194808 /src
parentb5fc0369993986c2e47abf223dd659f8820894bf (diff)
Port from KStringHandler naturalCompare to QCollator compare.
Make use of the QCollator instance (m_collator) in nameRoleGroups instead of using QString::localeAwareCompare (uses QCollator internally) We don't need the m_caseSensitivity anymore, because the QCollator instance also holds this information. (This patch doesn't make use of QCollatorSortKey) Reviewed by Kai REVIEW: 121480
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kfileitemmodel.cpp47
-rw-r--r--src/kitemviews/kfileitemmodel.h3
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;