]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Ignore diacritical marks for keyboard search
authorThomas Moerschell <tmoerschell@gmail.com>
Fri, 31 Jan 2025 18:52:09 +0000 (19:52 +0100)
committerThomas Moerschell <tmoerschell@gmail.com>
Sat, 1 Feb 2025 12:56:11 +0000 (13:56 +0100)
When using keyboard search, normalize the item names and remove marks
first. Now, items containing characters with marks can be found using
keyboard search.

BUG: 482394

src/kitemviews/kfileitemmodel.cpp
src/tests/kfileitemmodeltest.cpp

index f8c30b9e45d42ff04404240b346f0f3dd283534a..40ec0950710c5fa508fd3a17018e7025cb0f5848 100644 (file)
@@ -335,16 +335,32 @@ QMimeData *KFileItemModel::createMimeData(const KItemSet &indexes) const
     return data;
 }
 
+namespace
+{
+QString removeMarks(const QString &original)
+{
+    const auto normalized = original.normalized(QString::NormalizationForm_D);
+    QString res;
+    for (auto ch : normalized) {
+        if (!ch.isMark()) {
+            res.append(ch);
+        }
+    }
+    return res;
+}
+}
+
 int KFileItemModel::indexForKeyboardSearch(const QString &text, int startFromIndex) const
 {
+    const auto noMarkText = removeMarks(text);
     startFromIndex = qMax(0, startFromIndex);
     for (int i = startFromIndex; i < count(); ++i) {
-        if (fileItem(i).text().startsWith(text, Qt::CaseInsensitive)) {
+        if (removeMarks(fileItem(i).text()).startsWith(noMarkText, Qt::CaseInsensitive)) {
             return i;
         }
     }
     for (int i = 0; i < startFromIndex; ++i) {
-        if (fileItem(i).text().startsWith(text, Qt::CaseInsensitive)) {
+        if (removeMarks(fileItem(i).text()).startsWith(noMarkText, Qt::CaseInsensitive)) {
             return i;
         }
     }
index 4b1814391cb5cb9a98bcac7d34253a4c77069bea..4c6db590d8c78bfb40b1d42a6f8d7b9a1a24823c 100644 (file)
@@ -1357,7 +1357,7 @@ void KFileItemModelTest::testIndexForKeyboardSearch()
 {
     QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
 
-    m_testDir->createFiles({"a", "aa", "Image.jpg", "Image.png", "Text", "Text1", "Text2", "Text11"});
+    m_testDir->createFiles({"a", "aa", "Image.jpg", "Image.png", "Text", "Text1", "Text2", "Text11", "U", "Ü", "Üu", "Ž"});
 
     m_model->loadDirectory(m_testDir->url());
     QVERIFY(itemsInsertedSpy.wait());
@@ -1374,6 +1374,9 @@ void KFileItemModelTest::testIndexForKeyboardSearch()
     QCOMPARE(m_model->indexForKeyboardSearch("text1", 0), 5);
     QCOMPARE(m_model->indexForKeyboardSearch("text2", 0), 6);
     QCOMPARE(m_model->indexForKeyboardSearch("text11", 0), 7);
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 0), 8);
+    QCOMPARE(m_model->indexForKeyboardSearch("üu", 0), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("ž", 0), 11);
 
     // Start a search somewhere in the middle
     QCOMPARE(m_model->indexForKeyboardSearch("a", 1), 1);
@@ -1400,6 +1403,12 @@ void KFileItemModelTest::testIndexForKeyboardSearch()
     QCOMPARE(m_model->indexForKeyboardSearch("TexT", 5), 5);
     QCOMPARE(m_model->indexForKeyboardSearch("IMAGE", 4), 2);
 
+    // Test searches that match items with marks
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 9), 9);
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 10), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("uu", 0), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("z", 0), 11);
+
     // TODO: Maybe we should also test keyboard searches in directories which are not sorted by Name?
 }