diff options
| author | Yifan Zhu <[email protected]> | 2024-08-08 20:21:08 -0700 |
|---|---|---|
| committer | Yifan Zhu <[email protected]> | 2024-08-13 16:09:10 +0000 |
| commit | 021365dceb590a14bfcdb904ea05ffdd69b7d663 (patch) | |
| tree | baf6b7ca2ee7a42932647a34ac714191d3d37326 | |
| parent | 822a7d33ab703da8e4d98454fb38cd480f7a0fd2 (diff) | |
KStandardItemListWidget: select by number of unicode chars
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
| -rw-r--r-- | src/kitemviews/kfileitemlistwidget.cpp | 17 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemlistwidget.h | 2 | ||||
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 13 | ||||
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.h | 4 |
4 files changed, 24 insertions, 12 deletions
diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index fcfc9d7b1..b4e0895f2 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -162,33 +162,32 @@ QFont KFileItemListWidget::customizedFont(const QFont &baseFont) 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()) { - 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. - selectionLength = text.lastIndexOf(QLatin1Char('.')); + indexOfExtension = text.lastIndexOf(QLatin1Char('.')); // 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 { - selectionLength -= extension.length() + 1; + indexOfExtension -= extension.length() + 1; } - return selectionLength; + return numberOfUnicodeCharactersIn(text.left(indexOfExtension)); } void KFileItemListWidget::hoverSequenceStarted() diff --git a/src/kitemviews/kfileitemlistwidget.h b/src/kitemviews/kfileitemlistwidget.h index 6e98e03c4..5ce11b6da 100644 --- a/src/kitemviews/kfileitemlistwidget.h +++ b/src/kitemviews/kfileitemlistwidget.h @@ -62,7 +62,7 @@ protected: 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; diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index c8a6955b9..fe686d4fe 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -25,6 +25,7 @@ #include <QGraphicsView> #include <QPixmapCache> #include <QStyleOption> +#include <QTextBoundaryFinder> #include <QVariantAnimation> // #define KSTANDARDITEMLISTWIDGET_DEBUG @@ -812,9 +813,19 @@ void KStandardItemListWidget::siblingsInformationChanged(const QBitArray ¤ 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 { - return text.length(); + return numberOfUnicodeCharactersIn(text); } void KStandardItemListWidget::editedRoleChanged(const QByteArray ¤t, const QByteArray &previous) diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 35392b420..02f897dbe 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -159,6 +159,8 @@ protected: */ 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 @@ -168,7 +170,7 @@ protected: * 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; |
