aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Belyavsky <belyavskyv@gmail.com>2022-06-08 15:51:45 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-06-17 09:58:19 +0000
commitea9276390069d79b65b8015bac68c7e5f72acdc2 (patch)
tree32b33a042e3cde595e3c037542db6ea08dc45713
parent9c7c3386bd55aef6b08341c6a70bb133ccbdffea (diff)
Fix TextEdit/TextArea mouse cursor shape handling logic
Previously IBeamCursor was wrongly shown in case when TextEdit was readonly and not selectable by mouse. Now ArrowCursor will be shown in such case. Additionally removed own mouse cursor shape handling logic in TextArea, so it will be unified now with derived logic from TextEdit. This is a change from 23f78b6b76fb9350a472485e34857e1a4842e5d3: we no longer attempt to restore a cursor that was set via setCursor(). [ChangeLog][QtQuick][TextEdit] TextEdit and TextArea now set their own mouse cursors more consistently, but without regard for any external call to setCursor(). Fixes: QTBUG-104089 Change-Id: Iba4e0cb55d555b0f360d7856346ff9e8393b9e1e Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry picked from commit 175dfd25c25fedee490c0578d34c2467cef83b00) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/quick/items/qquicktextedit.cpp42
-rw-r--r--src/quick/items/qquicktextedit_p_p.h5
-rw-r--r--src/quicktemplates2/qquicktextarea.cpp7
-rw-r--r--tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp4
-rw-r--r--tests/auto/quickcontrols2/cursor/tst_cursor.cpp14
5 files changed, 48 insertions, 24 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index f739474908..313a453b7f 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -1592,15 +1592,20 @@ bool QQuickTextEdit::selectByMouse() const
void QQuickTextEdit::setSelectByMouse(bool on)
{
Q_D(QQuickTextEdit);
- if (d->selectByMouse != on) {
- d->selectByMouse = on;
- setKeepMouseGrab(on);
- if (on)
- d->control->setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByMouse);
- else
- d->control->setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByMouse);
- emit selectByMouseChanged(on);
- }
+ if (d->selectByMouse == on)
+ return;
+
+ d->selectByMouse = on;
+ setKeepMouseGrab(on);
+ if (on)
+ d->control->setTextInteractionFlags(d->control->textInteractionFlags() | Qt::TextSelectableByMouse);
+ else
+ d->control->setTextInteractionFlags(d->control->textInteractionFlags() & ~Qt::TextSelectableByMouse);
+
+#if QT_CONFIG(cursor)
+ d->updateMouseCursorShape();
+#endif
+ emit selectByMouseChanged(on);
}
/*!
@@ -1663,6 +1668,9 @@ void QQuickTextEdit::setReadOnly(bool r)
#if QT_CONFIG(im)
updateInputMethod(Qt::ImEnabled);
#endif
+#if QT_CONFIG(cursor)
+ d->updateMouseCursorShape();
+#endif
q_canPasteChanged();
emit readOnlyChanged(r);
if (!d->selectByKeyboardSet)
@@ -2450,7 +2458,7 @@ void QQuickTextEditPrivate::init()
updateDefaultTextOption();
q->updateSize();
#if QT_CONFIG(cursor)
- q->setCursor(Qt::IBeamCursor);
+ updateMouseCursorShape();
#endif
}
@@ -2734,9 +2742,8 @@ void QQuickTextEdit::q_linkHovered(const QString &link)
emit linkHovered(link);
#if QT_CONFIG(cursor)
if (link.isEmpty()) {
- setCursor(d->cursorToRestoreAfterHover);
+ d->updateMouseCursorShape();
} else if (cursor().shape() != Qt::PointingHandCursor) {
- d->cursorToRestoreAfterHover = cursor().shape();
setCursor(Qt::PointingHandCursor);
}
#endif
@@ -2747,9 +2754,8 @@ void QQuickTextEdit::q_markerHovered(bool hovered)
Q_D(QQuickTextEdit);
#if QT_CONFIG(cursor)
if (!hovered) {
- setCursor(d->cursorToRestoreAfterHover);
+ d->updateMouseCursorShape();
} else if (cursor().shape() != Qt::PointingHandCursor) {
- d->cursorToRestoreAfterHover = cursor().shape();
setCursor(Qt::PointingHandCursor);
}
#endif
@@ -3020,6 +3026,14 @@ bool QQuickTextEditPrivate::isLinkHoveredConnected()
IS_SIGNAL_CONNECTED(q, QQuickTextEdit, linkHovered, (const QString &));
}
+#if QT_CONFIG(cursor)
+void QQuickTextEditPrivate::updateMouseCursorShape()
+{
+ Q_Q(QQuickTextEdit);
+ q->setCursor(q->isReadOnly() && !q->selectByMouse() ? Qt::ArrowCursor : Qt::IBeamCursor);
+}
+#endif
+
/*!
\qmlsignal QtQuick::TextEdit::linkHovered(string link)
\since 5.2
diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h
index 2381b46a05..4ec2752eb5 100644
--- a/src/quick/items/qquicktextedit_p_p.h
+++ b/src/quick/items/qquicktextedit_p_p.h
@@ -147,6 +147,10 @@ public:
Qt::LayoutDirection textDirection(const QString &text) const;
bool isLinkHoveredConnected();
+#if QT_CONFIG(cursor)
+ void updateMouseCursorShape();
+#endif
+
void setNativeCursorEnabled(bool) {}
void handleFocusEvent(QFocusEvent *event);
void addCurrentTextNodeToRoot(QQuickTextNodeEngine *, QSGTransformNode *, QQuickTextNode*, TextNodeIterator&, int startPos);
@@ -211,7 +215,6 @@ public:
Qt::InputMethodHints inputMethodHints;
#endif
UpdateType updateType;
- Qt::CursorShape cursorToRestoreAfterHover = Qt::IBeamCursor;
bool dirty : 1;
bool richText : 1;
diff --git a/src/quicktemplates2/qquicktextarea.cpp b/src/quicktemplates2/qquicktextarea.cpp
index 127c8d410c..72794fd36b 100644
--- a/src/quicktemplates2/qquicktextarea.cpp
+++ b/src/quicktemplates2/qquicktextarea.cpp
@@ -461,9 +461,6 @@ void QQuickTextAreaPrivate::readOnlyChanged(bool isReadOnly)
if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func()))
accessibleAttached->set_readOnly(isReadOnly);
#endif
-#if QT_CONFIG(cursor)
- q_func()->setCursor(isReadOnly && !selectByMouse ? Qt::ArrowCursor : Qt::IBeamCursor);
-#endif
}
#if QT_CONFIG(accessibility)
@@ -545,9 +542,7 @@ QQuickTextArea::QQuickTextArea(QQuickItem *parent)
setAcceptedMouseButtons(Qt::AllButtons);
d->setImplicitResizeEnabled(false);
d->pressHandler.control = this;
-#if QT_CONFIG(cursor)
- setCursor(Qt::IBeamCursor);
-#endif
+
QObjectPrivate::connect(this, &QQuickTextEdit::readOnlyChanged,
d, &QQuickTextAreaPrivate::readOnlyChanged);
}
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index 7cdaf6819e..aaf934dc0c 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -2612,8 +2612,6 @@ void tst_qquicktextedit::linkHover()
QCOMPARE(window.cursor().shape(), Qt::IBeamCursor);
QCOMPARE(hover.last()[0].toString(), QString());
- texteditObject->setCursor(Qt::OpenHandCursor);
-
QCursor::setPos(linkPos);
QTRY_COMPARE(hover.count(), 3);
QCOMPARE(window.cursor().shape(), Qt::PointingHandCursor);
@@ -2621,7 +2619,7 @@ void tst_qquicktextedit::linkHover()
QCursor::setPos(textPos);
QTRY_COMPARE(hover.count(), 4);
- QCOMPARE(window.cursor().shape(), Qt::OpenHandCursor);
+ QCOMPARE(window.cursor().shape(), Qt::IBeamCursor);
QCOMPARE(hover.last()[0].toString(), QString());
}
#endif
diff --git a/tests/auto/quickcontrols2/cursor/tst_cursor.cpp b/tests/auto/quickcontrols2/cursor/tst_cursor.cpp
index b3a44fa061..452bac15d9 100644
--- a/tests/auto/quickcontrols2/cursor/tst_cursor.cpp
+++ b/tests/auto/quickcontrols2/cursor/tst_cursor.cpp
@@ -58,6 +58,7 @@ private slots:
void editable();
void pageIndicator();
void scrollBar();
+ void textArea();
};
tst_cursor::tst_cursor()
@@ -225,6 +226,19 @@ void tst_cursor::scrollBar()
QCOMPARE(window->cursor().shape(), textArea->cursor().shape());
}
+// QTBUG-104089
+void tst_cursor::textArea()
+{
+ QQuickTextArea textArea;
+ QCOMPARE(textArea.cursor().shape(), Qt::IBeamCursor);
+
+ textArea.setReadOnly(true);
+ QCOMPARE(textArea.cursor().shape(), Qt::ArrowCursor);
+
+ textArea.setSelectByMouse(true);
+ QCOMPARE(textArea.cursor().shape(), Qt::IBeamCursor);
+}
+
QTEST_MAIN(tst_cursor)
#include "tst_cursor.moc"