mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-05 16:19:10 +00:00
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:
parent
b5fc036999
commit
95220eebae
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue