]> cloud.milkyroute.net Git - dolphin.git/commitdiff
KStandardItemListWidget: select by number of unicode chars
authorYifan Zhu <fanzhuyifan@gmail.com>
Fri, 9 Aug 2024 03:21:08 +0000 (20:21 -0700)
committerYifan Zhu <fanzhuyifan@gmail.com>
Tue, 13 Aug 2024 16:09:10 +0000 (16:09 +0000)
Previously during rename, the number of QChar is used for selection,
which might be different from number of unicode characters.

Test plan:
- create the file zz❤️❤️.txt
- rename the file
- verify that the first 4 characters are correctly selected, which
  didn't work before the patch.

BUG: 466814

src/kitemviews/kfileitemlistwidget.cpp
src/kitemviews/kfileitemlistwidget.h
src/kitemviews/kstandarditemlistwidget.cpp
src/kitemviews/kstandarditemlistwidget.h

index fcfc9d7b13764ca802497a8465b014d39cbebecb..b4e0895f2a7fcb0548e8393f63d9dd3832b28fb6 100644 (file)
@@ -162,33 +162,32 @@ QFont KFileItemListWidget::customizedFont(const QFont &baseFont) const
 
 int KFileItemListWidget::selectionLength(const QString &text) const
 {
 
 int KFileItemListWidget::selectionLength(const QString &text) const
 {
-    // Select the text without MIME-type extension
-    int selectionLength = text.length();
-
     // If item is a directory, use the whole text length for
     // selection (ignore all points)
     if (data().value("isDir").toBool()) {
     // If item is a directory, use the whole text length for
     // selection (ignore all points)
     if (data().value("isDir").toBool()) {
-        return selectionLength;
+        return numberOfUnicodeCharactersIn(text);
     }
 
     }
 
+    int indexOfExtension = text.length();
+
     QMimeDatabase db;
     const QString extension = db.suffixForFileName(text);
     if (extension.isEmpty()) {
         // For an unknown extension just exclude the extension after
         // the last point. This does not work for multiple extensions like
         // *.tar.gz but usually this is anyhow a known extension.
     QMimeDatabase db;
     const QString extension = db.suffixForFileName(text);
     if (extension.isEmpty()) {
         // For an unknown extension just exclude the extension after
         // the last point. This does not work for multiple extensions like
         // *.tar.gz but usually this is anyhow a known extension.
-        selectionLength = text.lastIndexOf(QLatin1Char('.'));
+        indexOfExtension = text.lastIndexOf(QLatin1Char('.'));
 
         // If no point could be found, use whole text length for selection.
 
         // If no point could be found, use whole text length for selection.
-        if (selectionLength < 1) {
-            selectionLength = text.length();
+        if (indexOfExtension < 1) {
+            indexOfExtension = text.length();
         }
 
     } else {
         }
 
     } else {
-        selectionLength -= extension.length() + 1;
+        indexOfExtension -= extension.length() + 1;
     }
 
     }
 
-    return selectionLength;
+    return numberOfUnicodeCharactersIn(text.left(indexOfExtension));
 }
 
 void KFileItemListWidget::hoverSequenceStarted()
 }
 
 void KFileItemListWidget::hoverSequenceStarted()
index 6e98e03c4a49243d1e45cdd9b88d42a0afa85b3d..5ce11b6da5797c65a83268f445e0cd639913ce75 100644 (file)
@@ -62,7 +62,7 @@ protected:
     QFont customizedFont(const QFont &baseFont) const override;
 
     /**
     QFont customizedFont(const QFont &baseFont) const override;
 
     /**
-     * @return Selection length without MIME-type extension
+     * @return Selection length without MIME-type extension in number of unicode characters, which might be different from number of QChars.
      */
     int selectionLength(const QString &text) const override;
 
      */
     int selectionLength(const QString &text) const override;
 
index c8a6955b9406c990ce51801476482b349db9a469..fe686d4fe4d6f0b6024c088f497c76b8aab21417 100644 (file)
@@ -25,6 +25,7 @@
 #include <QGraphicsView>
 #include <QPixmapCache>
 #include <QStyleOption>
 #include <QGraphicsView>
 #include <QPixmapCache>
 #include <QStyleOption>
+#include <QTextBoundaryFinder>
 #include <QVariantAnimation>
 
 // #define KSTANDARDITEMLISTWIDGET_DEBUG
 #include <QVariantAnimation>
 
 // #define KSTANDARDITEMLISTWIDGET_DEBUG
@@ -812,9 +813,19 @@ void KStandardItemListWidget::siblingsInformationChanged(const QBitArray &curren
     m_dirtyLayout = true;
 }
 
     m_dirtyLayout = true;
 }
 
+int KStandardItemListWidget::numberOfUnicodeCharactersIn(const QString &text)
+{
+    int count = 0;
+    QTextBoundaryFinder boundaryFinder(QTextBoundaryFinder::Grapheme, text);
+    while (boundaryFinder.toNextBoundary() != -1) {
+        ++count;
+    }
+    return count;
+}
+
 int KStandardItemListWidget::selectionLength(const QString &text) const
 {
 int KStandardItemListWidget::selectionLength(const QString &text) const
 {
-    return text.length();
+    return numberOfUnicodeCharactersIn(text);
 }
 
 void KStandardItemListWidget::editedRoleChanged(const QByteArray &current, const QByteArray &previous)
 }
 
 void KStandardItemListWidget::editedRoleChanged(const QByteArray &current, const QByteArray &previous)
index 35392b42068551ac7c9a7a19d33f1278db64e70f..02f897dbe56604723fa85348d5ed3be9d2094f6f 100644 (file)
@@ -159,6 +159,8 @@ protected:
      */
     QString roleText(const QByteArray &role, const QHash<QByteArray, QVariant> &values) const;
 
      */
     QString roleText(const QByteArray &role, const QHash<QByteArray, QVariant> &values) const;
 
+    static int numberOfUnicodeCharactersIn(const QString &text);
+
     /**
      * Fixes:
      * Select the text without MIME-type extension
     /**
      * Fixes:
      * Select the text without MIME-type extension
@@ -168,7 +170,7 @@ protected:
      * Inherited classes can define, if the MIME-type extension
      * should be selected or not.
      *
      * Inherited classes can define, if the MIME-type extension
      * should be selected or not.
      *
-     * @return Selection length (with or without MIME-type extension)
+     * @return Selection length (with or without MIME-type extension) in number of unicode characters, which might be different from number of QChars.
      */
     virtual int selectionLength(const QString &text) const;
 
      */
     virtual int selectionLength(const QString &text) const;