]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Revert "Fix name grouping feature for cyrillic names"
authorElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 28 Jul 2019 20:11:51 +0000 (22:11 +0200)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 28 Jul 2019 20:14:18 +0000 (22:14 +0200)
This reverts commit dc586ada63d1822fbbe38a0dd3449c73b03928e0.

D22303 had a wrong diff.

CCBUG: 406867

src/kitemviews/kfileitemmodel.cpp

index 3cc140701634770d1d82d4d5d21de17a0d60babe..8145a00f11ba1f2fc22bd9f7aca0679c3ddfdfdb 100644 (file)
@@ -1905,8 +1905,30 @@ QList<QPair<int, QVariant> > KFileItemModel::nameRoleGroups() const
         if (firstChar != newFirstChar) {
             QString newGroupValue;
             if (newFirstChar.isLetter()) {
-                // Put together compatibility equivalent letters like latin 'A' and umlaut 'A' from the German locale
-                newGroupValue = QString(newFirstChar).normalized(QString::NormalizationForm_KD).at(0);
+                // Try to find a matching group in the range 'A' to 'Z'.
+                static std::vector<QChar> lettersAtoZ;
+                lettersAtoZ.reserve('Z' - 'A' + 1);
+                if (lettersAtoZ.empty()) {
+                    for (char c = 'A'; c <= 'Z'; ++c) {
+                        lettersAtoZ.push_back(QLatin1Char(c));
+                    }
+                }
+
+                auto localeAwareLessThan = [this](QChar c1, 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()) {
+                        // newFirstChar belongs to the group preceding *it.
+                        // Example: for an umlaut 'A' in the German locale, *it would be 'B' now.
+                        --it;
+                    }
+                    newGroupValue = *it;
+                } else {
+                    newGroupValue = newFirstChar;
+                }
             } else if (newFirstChar >= QLatin1Char('0') && newFirstChar <= QLatin1Char('9')) {
                 // Apply group '0 - 9' for any name that starts with a digit
                 newGroupValue = i18nc("@title:group Groups that start with a digit", "0 - 9");