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
This commit is contained in:
Emmanuel Pescosta 2014-12-13 20:31:01 +01:00
parent b5fc036999
commit 95220eebae
2 changed files with 23 additions and 29 deletions

View file

@ -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 <peter.penz@gmx.at>
// Copyright (C) 2006 by Dominic Battre <dominic@battre.de>
// Copyright (C) 2006 by Martin Pool <mbp@canonical.com>
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;
}
if (m_naturalSorting) {
return m_collator.compare(a, b);
}
return m_naturalSorting ? KStringHandler::naturalCompare(a, b, Qt::CaseSensitive)
: QString::compare(a, b, Qt::CaseSensitive);
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 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()) {

View file

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