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
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();
- selectionLength -= extension.length() + 1;
+ indexOfExtension -= extension.length() + 1;
- return selectionLength;
+ return numberOfUnicodeCharactersIn(text.left(indexOfExtension));
}
void KFileItemListWidget::hoverSequenceStarted()
}
void KFileItemListWidget::hoverSequenceStarted()
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;
#include <QGraphicsView>
#include <QPixmapCache>
#include <QStyleOption>
#include <QGraphicsView>
#include <QPixmapCache>
#include <QStyleOption>
+#include <QTextBoundaryFinder>
#include <QVariantAnimation>
// #define KSTANDARDITEMLISTWIDGET_DEBUG
#include <QVariantAnimation>
// #define KSTANDARDITEMLISTWIDGET_DEBUG
+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 numberOfUnicodeCharactersIn(text);
}
void KStandardItemListWidget::editedRoleChanged(const QByteArray ¤t, const QByteArray &previous)
}
void KStandardItemListWidget::editedRoleChanged(const QByteArray ¤t, const QByteArray &previous)
*/
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
* 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;