StringUtils: Use natural sorting in caseFriendlyCompare()

Seems to be the right choice in the contexts we use it in.
Supersedes db1d12f69a.

Task-number: QTCREATORBUG-29509
Change-Id: I3816ec57d8484404420c7bee1c2b12e8df224cb8
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Christian Kandeler
2023-09-04 15:40:05 +02:00
parent 6888d93385
commit c8ecacb335
2 changed files with 13 additions and 15 deletions

View File

@@ -14,6 +14,7 @@
#include <QClipboard> #include <QClipboard>
#endif #endif
#include <QCollator>
#include <QDir> #include <QDir>
#include <QFontMetrics> #include <QFontMetrics>
#include <QJsonArray> #include <QJsonArray>
@@ -325,10 +326,18 @@ QTCREATOR_UTILS_EXPORT int parseUsedPortFromNetstatOutput(const QByteArray &line
int caseFriendlyCompare(const QString &a, const QString &b) int caseFriendlyCompare(const QString &a, const QString &b)
{ {
int result = a.compare(b, Qt::CaseInsensitive); static const auto makeCollator = [](Qt::CaseSensitivity caseSensitivity) {
QCollator collator;
collator.setNumericMode(true);
collator.setCaseSensitivity(caseSensitivity);
return collator;
};
static const QCollator insensitiveCollator = makeCollator(Qt::CaseInsensitive);
const int result = insensitiveCollator.compare(a, b);
if (result != 0) if (result != 0)
return result; return result;
return a.compare(b, Qt::CaseSensitive); static const QCollator sensitiveCollator = makeCollator(Qt::CaseSensitive);
return sensitiveCollator.compare(a, b);
} }
QString quoteAmpersands(const QString &text) QString quoteAmpersands(const QString &text)

View File

@@ -32,7 +32,6 @@
#include <coreplugin/modemanager.h> #include <coreplugin/modemanager.h>
#include <QAction> #include <QAction>
#include <QCollator>
#include <QGuiApplication> #include <QGuiApplication>
#include <QItemDelegate> #include <QItemDelegate>
#include <QKeyEvent> #include <QKeyEvent>
@@ -141,18 +140,8 @@ private:
static bool compareItems(const TreeItem *ti1, const TreeItem *ti2) static bool compareItems(const TreeItem *ti1, const TreeItem *ti2)
{ {
static const QCollator collator = [] { return caseFriendlyCompare(static_cast<const GenericItem *>(ti1)->rawDisplayName(),
QCollator collator; static_cast<const GenericItem *>(ti2)->rawDisplayName()) < 0;
collator.setNumericMode(true);
collator.setCaseSensitivity(Qt::CaseInsensitive);
return collator;
}();
const int result = collator.compare(static_cast<const GenericItem *>(ti1)->rawDisplayName(),
static_cast<const GenericItem *>(ti2)->rawDisplayName());
if (result != 0)
return result < 0;
return ti1 < ti2;
} }
class GenericModel : public TreeModel<GenericItem, GenericItem> class GenericModel : public TreeModel<GenericItem, GenericItem>