diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index e8c21990766c3bbf43338aad349db9ed15c6766a..aca7150ca2dff965c9fc0bc5b1ca498ab59fc28f 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -153,8 +153,10 @@ namespace { removeChildNode(cursorNode); delete cursorNode; cursorNode = newNode; - appendChildNode(cursorNode); - cursorNode->setFlag(QSGNode::OwnedByParent); + if (cursorNode) { + appendChildNode(cursorNode); + cursorNode->setFlag(QSGNode::OwnedByParent); + } } QSGRectangleNode *cursorNode; @@ -1903,10 +1905,10 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * } if (d->cursorComponent == 0 && !isReadOnly()) { - QColor color = (!d->cursorVisible || !d->control->cursorOn()) - ? QColor(0, 0, 0, 0) - : d->color; - rootNode->resetCursorNode(d->sceneGraphContext()->createRectangleNode(cursorRectangle(), color)); + QSGRectangleNode* cursor = 0; + if (d->cursorVisible && d->control->cursorOn()) + cursor = d->sceneGraphContext()->createRectangleNode(cursorRectangle(), d->color); + rootNode->resetCursorNode(cursor); } return rootNode; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index d3d4bde36b84857d78e09970b29d3e096c9cea76..c91b79dd34a63b6a2b2597e2b8775742a29a160f 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1852,17 +1852,13 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData node = new QQuickTextNode(this); d->textNode = node; - if (!d->textLayoutDirty && oldNode != 0) { - QSGRectangleNode *cursorNode = node->cursorNode(); - if (cursorNode != 0 && !isReadOnly()) { - cursorNode->setRect(cursorRectangle()); + const bool showCursor = !isReadOnly() && d->cursorItem == 0 && d->cursorVisible && (d->m_blinkStatus || d->m_blinkPeriod == 0); - if (!d->cursorVisible || d->cursorItem || (!d->m_blinkStatus && d->m_blinkPeriod > 0)) { - d->hideCursor(); - } else { - d->showCursor(); - } - } + if (!d->textLayoutDirty && oldNode != 0) { + if (showCursor) + node->setCursor(cursorRectangle(), d->color); + else + node->clearCursor(); } else { node->setUseNativeRenderer(d->renderType == NativeRendering); node->deleteContent(); @@ -1890,14 +1886,8 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData // selection } - if (!isReadOnly() && d->cursorItem == 0) { - node->setCursor(cursorRectangle(), d->color); - if (!d->cursorVisible || (!d->m_blinkStatus && d->m_blinkPeriod > 0)) { - d->hideCursor(); - } else { - d->showCursor(); - } - } + if (showCursor) + node->setCursor(cursorRectangle(), d->color); d->textLayoutDirty = false; } @@ -2696,24 +2686,6 @@ void QQuickTextInput::selectionChanged() } } -void QQuickTextInputPrivate::showCursor() -{ - if (textNode != 0 && textNode->cursorNode() != 0) { - QSGRectangleNode *cursor = textNode->cursorNode(); - cursor->setColor(color); - cursor->update(); - } -} - -void QQuickTextInputPrivate::hideCursor() -{ - if (textNode != 0 && textNode->cursorNode() != 0) { - QSGRectangleNode *cursor = textNode->cursorNode(); - cursor->setColor(QColor(0, 0, 0, 0)); - cursor->update(); - } -} - QRectF QQuickTextInput::boundingRect() const { Q_D(const QQuickTextInput); diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 2caca45bcef7278fa6d3c5ba6835f143ca51e2c8..7d9f3ff9cead86311a40bee9746c4ebd4373e424 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -150,8 +150,6 @@ public: #ifndef QT_NO_IM Qt::InputMethodHints effectiveInputMethodHints() const; #endif - void hideCursor(); - void showCursor(); void handleFocusEvent(QFocusEvent *event); struct MaskInputData { diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 964dd0d4a53f4044cf04fe8ac6c8e46ba6028c62..5f246682ecd6c2e6e665f6fe8d0c1a870a2f90c4 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -179,6 +179,14 @@ void QQuickTextNode::setCursor(const QRectF &rect, const QColor &color) appendChildNode(m_cursorNode); } +void QQuickTextNode::clearCursor() +{ + if (m_cursorNode) + removeChildNode(m_cursorNode); + delete m_cursorNode; + m_cursorNode = 0; +} + void QQuickTextNode::initEngine(const QColor& textColor, const QColor& selectedTextColor, const QColor& selectionColor, const QColor& anchorColor, const QPointF &position) { m_engine.reset(new QQuickTextNodeEngine); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index fef17ae8e80f46094103e212a75e3f8f23c7454b..7f9cd77152e5cdd23b39ee368233436af00fd416 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -88,6 +88,7 @@ public: int selectionStart = -1, int selectionEnd = -1); void setCursor(const QRectF &rect, const QColor &color); + void clearCursor(); QSGRectangleNode *cursorNode() const { return m_cursorNode; } QSGGlyphNode *addGlyphs(const QPointF &position, const QGlyphRun &glyphs, const QColor &color,