diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index fdaef6df8ec75a870ce32c862952be94ecf46e3f..6bec2ce64677b74e693c10c74f26d0b5c54062be 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -155,7 +155,7 @@ namespace { newNode->setFlag(QSGNode::OwnedByParent); } - void resetCursorNode(QSGSimpleRectNode* newNode) + void resetCursorNode(QSGRectangleNode* newNode) { if (cursorNode) removeChildNode(cursorNode); @@ -165,7 +165,7 @@ namespace { cursorNode->setFlag(QSGNode::OwnedByParent); } - QSGSimpleRectNode *cursorNode; + QSGRectangleNode *cursorNode; QQuickTextNode* frameDecorationsNode; }; @@ -1914,7 +1914,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * QColor color = (!d->cursorVisible || !d->control->cursorOn()) ? QColor(0, 0, 0, 0) : d->color; - rootNode->resetCursorNode(new QSGSimpleRectNode(cursorRectangle(), color)); + rootNode->resetCursorNode(d->sceneGraphContext()->createRectangleNode(cursorRectangle(), color)); } return rootNode; diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index 0cf7ee28500d6b5bc3b38edf1637ce8e7965862c..8623e55a1d4d8a5ab4d5afcbc6fb3859acc29fa7 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -65,7 +65,7 @@ class QTextLayout; class QQuickTextDocumentWithImageResources; class QQuickTextControl; class QQuickTextNode; -class QSGSimpleRectNode; + class QQuickTextEditPrivate : public QQuickImplicitSizeItemPrivate { public: diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index f2cf89c1b92f4332c17ecc02585598ce0f43da4d..c63e1c87e6bda57fddb33dc60235d2fa48101df6 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1861,7 +1861,7 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData d->textNode = node; if (!d->textLayoutDirty && oldNode != 0) { - QSGSimpleRectNode *cursorNode = node->cursorNode(); + QSGRectangleNode *cursorNode = node->cursorNode(); if (cursorNode != 0 && !isReadOnly()) { cursorNode->setRect(cursorRectangle()); @@ -2706,14 +2706,20 @@ void QQuickTextInput::selectionChanged() void QQuickTextInputPrivate::showCursor() { - if (textNode != 0 && textNode->cursorNode() != 0) - textNode->cursorNode()->setColor(color); + if (textNode != 0 && textNode->cursorNode() != 0) { + QSGRectangleNode *cursor = textNode->cursorNode(); + cursor->setColor(color); + cursor->update(); + } } void QQuickTextInputPrivate::hideCursor() { - if (textNode != 0 && textNode->cursorNode() != 0) - textNode->cursorNode()->setColor(QColor(0, 0, 0, 0)); + if (textNode != 0 && textNode->cursorNode() != 0) { + QSGRectangleNode *cursor = textNode->cursorNode(); + cursor->setColor(QColor(0, 0, 0, 0)); + cursor->update(); + } } QRectF QQuickTextInput::boundingRect() const diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 02e321dfbaf261c3b0a302027a608721d0c63a33..480e141e30a370bdf469d4997ae16d68d8d44521 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -43,7 +43,6 @@ #include "qquicktextnodeengine_p.h" -#include <QtQuick/qsgsimplerectnode.h> #include <private/qsgadaptationlayer_p.h> #include <private/qsgdistancefieldglyphnode_p.h> #include <private/qquickclipnode_p.h> @@ -183,7 +182,8 @@ void QQuickTextNode::setCursor(const QRectF &rect, const QColor &color) if (m_cursorNode != 0) delete m_cursorNode; - m_cursorNode = new QSGSimpleRectNode(rect, color); + QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); + m_cursorNode = sg->sceneGraphContext()->createRectangleNode(rect, color); appendChildNode(m_cursorNode); } @@ -198,6 +198,13 @@ void QQuickTextNode::initEngine(const QColor& textColor, const QColor& selectedT m_engine->setPosition(position); } +void QQuickTextNode::addRectangleNode(const QRectF &rect, const QColor &color) +{ + QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); + appendChildNode(sg->sceneGraphContext()->createRectangleNode(rect, color)); +} + + void QQuickTextNode::addImage(const QRectF &rect, const QImage &image) { QSGRenderContext *sg = QQuickItemPrivate::get(m_ownerElement)->sceneGraphRenderContext(); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index 0bff0d5cff8493afb0f1d01259a9d6f4e00cf1c1..7099b19c46e0c897f29fdb6c5341caa0815cf1c5 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -59,7 +59,7 @@ class QColor; class QTextDocument; class QSGContext; class QRawFont; -class QSGSimpleRectNode; +class QSGRectangleNode; class QSGClipNode; class QSGTexture; @@ -96,12 +96,13 @@ public: int selectionStart = -1, int selectionEnd = -1); void setCursor(const QRectF &rect, const QColor &color); - QSGSimpleRectNode *cursorNode() const { return m_cursorNode; } + QSGRectangleNode *cursorNode() const { return m_cursorNode; } QSGGlyphNode *addGlyphs(const QPointF &position, const QGlyphRun &glyphs, const QColor &color, QQuickText::TextStyle style = QQuickText::Normal, const QColor &styleColor = QColor(), QSGNode *parentNode = 0); void addImage(const QRectF &rect, const QImage &image); + void addRectangleNode(const QRectF &rect, const QColor &color); bool useNativeRenderer() const { return m_useNativeRenderer; } void setUseNativeRenderer(bool on) { m_useNativeRenderer = on; } @@ -110,7 +111,7 @@ private: void initEngine(const QColor &textColor, const QColor &selectedTextColor, const QColor &selectionColor, const QColor& anchorColor = QColor() , const QPointF &position = QPointF()); - QSGSimpleRectNode *m_cursorNode; + QSGRectangleNode *m_cursorNode; QList<QSGTexture *> m_textures; QQuickItem *m_ownerElement; bool m_useNativeRenderer; diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index e9ff70e00bca845d755e2203bc16ba704c9aa462..d0754d511c198c0bfda17e20114fb5706c8dc861 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -49,7 +49,6 @@ #include <QtGui/qtextobject.h> #include <QtGui/qtexttable.h> #include <QtGui/qtextlist.h> -#include <QtQuick/qsgsimplerectnode.h> #include <private/qquicktext_p_p.h> #include <private/qtextdocumentlayout_p.h> @@ -647,14 +646,14 @@ void QQuickTextNodeEngine::addToSceneGraph(QQuickTextNode *parentNode, const QRectF &rect = m_backgrounds.at(i).first; const QColor &color = m_backgrounds.at(i).second; - parentNode->appendChildNode(new QSGSimpleRectNode(rect, color)); + parentNode->addRectangleNode(rect, color); } // First, prepend all selection rectangles to the tree for (int i=0; i<m_selectionRects.size(); ++i) { const QRectF &rect = m_selectionRects.at(i); - parentNode->appendChildNode(new QSGSimpleRectNode(rect, m_selectionColor)); + parentNode->addRectangleNode(rect, m_selectionColor); } // Finally, add decorations for each node to the tree. @@ -665,7 +664,7 @@ void QQuickTextNodeEngine::addToSceneGraph(QQuickTextNode *parentNode, ? m_selectedTextColor : textDecoration.color; - parentNode->appendChildNode(new QSGSimpleRectNode(textDecoration.rect, color)); + parentNode->addRectangleNode(textDecoration.rect, color); } // Then, go through all the nodes for all lines and combine all QGlyphRuns with a common @@ -714,7 +713,7 @@ void QQuickTextNodeEngine::addToSceneGraph(QQuickTextNode *parentNode, if (node->selectionState == Selected) { QColor color = m_selectionColor; color.setAlpha(128); - parentNode->appendChildNode(new QSGSimpleRectNode(node->boundingRect, color)); + parentNode->addRectangleNode(node->boundingRect, color); } } } diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index 4ea0cca553a9d3e1e43d0bbe35be403234e2fb36..f69dd7addead279882bb09781263be1f18b6eb0c 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -261,6 +261,19 @@ void QSGContext::renderContextInvalidated(QSGRenderContext *) { } + +/*! + Convenience factory function for creating a colored rectangle with the given geometry. + */ +QSGRectangleNode *QSGContext::createRectangleNode(const QRectF &rect, const QColor &c) +{ + QSGRectangleNode *node = createRectangleNode(); + node->setRect(rect); + node->setColor(c); + node->update(); + return node; +} + /*! Factory function for scene graph backends of the Rectangle element. */ diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h index cd69180c568df097e0380b98c7631d2f110931f4..abf1abd4c019a325152513d14690e31f1715ed96 100644 --- a/src/quick/scenegraph/qsgcontext_p.h +++ b/src/quick/scenegraph/qsgcontext_p.h @@ -172,6 +172,7 @@ public: virtual void renderContextInvalidated(QSGRenderContext *renderContext); virtual QSGRenderContext *createRenderContext(); + QSGRectangleNode *createRectangleNode(const QRectF &rect, const QColor &c); virtual QSGRectangleNode *createRectangleNode(); virtual QSGImageNode *createImageNode(); virtual QSGGlyphNode *createGlyphNode(QSGRenderContext *rc, bool preferNativeGlyphNode);