Hide cursor when text fields becomes read only
authorSanttu Lakkala <santtu.lakkala@nomovok.com>
Thu, 16 Apr 2015 13:51:45 +0000 (16:51 +0300)
committerSanttu Lakkala <santtu.lakkala@nomovok.com>
Tue, 12 May 2015 08:23:16 +0000 (08:23 +0000)
Clear the cursor node in TextEdit if field is read only. Otherwise the
cursor stays visible indefinitely, if it were at the moment the flag
was set.

Task-number: QTBUG-44735
Change-Id: Ib39138260ad8a4d7e5ed2185b8a04c577ee1eff0
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
src/quick/items/qquicktextedit.cpp
src/quick/items/qquicktextinput.cpp
tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp

index 2f2fc0d4c1f3bc4379e69e91fe3e6d4c25838037..8237ad10e4394aee06c0023ab881d7c4d45352c0 100644 (file)
@@ -1436,6 +1436,11 @@ void QQuickTextEdit::setReadOnly(bool r)
     emit readOnlyChanged(r);
     if (!d->selectByKeyboardSet)
         emit selectByKeyboardChanged(!r);
+    if (r) {
+        setCursorVisible(false);
+    } else if (hasActiveFocus()) {
+        setCursorVisible(true);
+    }
 }
 
 bool QQuickTextEdit::isReadOnly() const
@@ -1937,9 +1942,9 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
         std::sort(d->textNodeMap.begin(), d->textNodeMap.end(), &comesBefore);
     }
 
-    if (d->cursorComponent == 0 && !isReadOnly()) {
+    if (d->cursorComponent == 0) {
         QSGRectangleNode* cursor = 0;
-        if (d->cursorVisible && d->control->cursorOn())
+        if (!isReadOnly() && d->cursorVisible && d->control->cursorOn())
             cursor = d->sceneGraphContext()->createRectangleNode(d->control->cursorRect(), d->color);
         rootNode->resetCursorNode(cursor);
     }
@@ -2408,7 +2413,8 @@ void QQuickTextEditPrivate::handleFocusEvent(QFocusEvent *event)
 {
     Q_Q(QQuickTextEdit);
     bool focus = event->type() == QEvent::FocusIn;
-    q->setCursorVisible(focus);
+    if (!q->isReadOnly())
+        q->setCursorVisible(focus);
     control->processEvent(event, QPointF(-xoff, -yoff));
     if (focus) {
         q->q_updateAlignment();
index 54da9a40d0f488b8ff3f444ca7edb0b126414522..a4c61209f2abc35c634815a9e82d1187e5a95e3f 100644 (file)
@@ -662,6 +662,12 @@ void QQuickTextInput::setReadOnly(bool ro)
     q_canPasteChanged();
     d->emitUndoRedoChanged();
     emit readOnlyChanged(ro);
+    if (ro) {
+        setCursorVisible(false);
+    } else if (hasActiveFocus()) {
+        setCursorVisible(true);
+    }
+    update();
 }
 
 /*!
@@ -2606,7 +2612,8 @@ void QQuickTextInputPrivate::handleFocusEvent(QFocusEvent *event)
 {
     Q_Q(QQuickTextInput);
     bool focus = event->gotFocus();
-    q->setCursorVisible(focus);
+    if (!m_readOnly)
+        q->setCursorVisible(focus);
     if (focus) {
         q->q_updateAlignment();
 #ifndef QT_NO_IM
index b8eee9ce21ca44419559692928174b9c73588fb8..88cac92864713b4b345b361fa39aedbf30b7225c 100644 (file)
@@ -3192,6 +3192,7 @@ void tst_qquicktextinput::readOnly()
     QVERIFY(input != 0);
     QTRY_VERIFY(input->hasActiveFocus() == true);
     QVERIFY(input->isReadOnly() == true);
+    QVERIFY(input->isCursorVisible() == false);
     QString initial = input->text();
     for (int k=Qt::Key_0; k<=Qt::Key_Z; k++)
         simulateKey(&window, k);
@@ -3204,6 +3205,7 @@ void tst_qquicktextinput::readOnly()
     input->setReadOnly(false);
     QCOMPARE(input->isReadOnly(), false);
     QCOMPARE(input->cursorPosition(), input->text().length());
+    QVERIFY(input->isCursorVisible() == true);
 }
 
 void tst_qquicktextinput::echoMode()