diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-08-13 10:17:53 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-08-23 10:55:35 +0200 |
commit | 441dca459286d5ab033be403f381c0914c6f74f9 (patch) | |
tree | 7e0d1fecb9df99208fab17b471b43a2e598c2c9f /src | |
parent | 8d0e307bc7f9f4458e6ea2d2fc0d6cd25be4fda9 (diff) |
Improve the internal NodeVisitorEx API
Allow the implementation of visit to control whether the children should be
processed afterwards or not. This is modelled after the JS AST visitor in
Qml.
Change-Id: I5b1adf5e1aefd8899bf444e993ddfbf2c5c125c9
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/scenegraph/qsgadaptationlayer.cpp | 24 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgadaptationlayer_p.h | 30 |
2 files changed, 33 insertions, 21 deletions
diff --git a/src/quick/scenegraph/qsgadaptationlayer.cpp b/src/quick/scenegraph/qsgadaptationlayer.cpp index 68b1882c3f..1ed4122ce9 100644 --- a/src/quick/scenegraph/qsgadaptationlayer.cpp +++ b/src/quick/scenegraph/qsgadaptationlayer.cpp @@ -297,22 +297,22 @@ void QSGNodeVisitorEx::visitChildren(QSGNode *node) switch (child->type()) { case QSGNode::ClipNodeType: { QSGClipNode *c = static_cast<QSGClipNode*>(child); - visit(c); - visitChildren(c); + if (visit(c)) + visitChildren(c); endVisit(c); break; } case QSGNode::TransformNodeType: { QSGTransformNode *c = static_cast<QSGTransformNode*>(child); - visit(c); - visitChildren(c); + if (visit(c)) + visitChildren(c); endVisit(c); break; } case QSGNode::OpacityNodeType: { QSGOpacityNode *c = static_cast<QSGOpacityNode*>(child); - visit(c); - visitChildren(c); + if (visit(c)) + visitChildren(c); endVisit(c); break; } @@ -322,13 +322,19 @@ void QSGNodeVisitorEx::visitChildren(QSGNode *node) v->accept(this); } else { QSGGeometryNode *c = static_cast<QSGGeometryNode*>(child); - visit(c); - visitChildren(c); + if (visit(c)) + visitChildren(c); endVisit(c); } break; } - case QSGNode::RootNodeType: // fall through + case QSGNode::RootNodeType: { + QSGRootNode *root = static_cast<QSGRootNode*>(child); + if (visit(root)) + visitChildren(root); + endVisit(root); + break; + } case QSGNode::BasicNodeType: { visitChildren(child); break; diff --git a/src/quick/scenegraph/qsgadaptationlayer_p.h b/src/quick/scenegraph/qsgadaptationlayer_p.h index 2e17cfdf40..f15941dc7c 100644 --- a/src/quick/scenegraph/qsgadaptationlayer_p.h +++ b/src/quick/scenegraph/qsgadaptationlayer_p.h @@ -71,26 +71,32 @@ class QSGImageNode; class QSGRectangleNode; class QSGGlyphNode; class QSGNinePatchNode; +class QSGRootNode; class Q_QUICK_PRIVATE_EXPORT QSGNodeVisitorEx { public: - virtual void visit(QSGTransformNode *) = 0; + // visit(...) returns true if the children are supposed to be + // visisted and false if they're supposed to be skipped by the visitor. + + virtual bool visit(QSGTransformNode *) = 0; virtual void endVisit(QSGTransformNode *) = 0; - virtual void visit(QSGClipNode *) = 0; + virtual bool visit(QSGClipNode *) = 0; virtual void endVisit(QSGClipNode *) = 0; - virtual void visit(QSGGeometryNode *) = 0; + virtual bool visit(QSGGeometryNode *) = 0; virtual void endVisit(QSGGeometryNode *) = 0; - virtual void visit(QSGOpacityNode *) = 0; + virtual bool visit(QSGOpacityNode *) = 0; virtual void endVisit(QSGOpacityNode *) = 0; - virtual void visit(QSGImageNode *) = 0; + virtual bool visit(QSGImageNode *) = 0; virtual void endVisit(QSGImageNode *) = 0; - virtual void visit(QSGRectangleNode *) = 0; + virtual bool visit(QSGRectangleNode *) = 0; virtual void endVisit(QSGRectangleNode *) = 0; - virtual void visit(QSGGlyphNode *) = 0; + virtual bool visit(QSGGlyphNode *) = 0; virtual void endVisit(QSGGlyphNode *) = 0; - virtual void visit(QSGNinePatchNode *) = 0; + virtual bool visit(QSGNinePatchNode *) = 0; virtual void endVisit(QSGNinePatchNode *) = 0; + virtual bool visit(QSGRootNode *) = 0; + virtual void endVisit(QSGRootNode *) = 0; void visitChildren(QSGNode *node); }; @@ -118,7 +124,7 @@ public: virtual void update() = 0; - virtual void accept(QSGNodeVisitorEx *visitor) { visitor->visit(this); visitor->visitChildren(this); visitor->endVisit(this); } + virtual void accept(QSGNodeVisitorEx *visitor) { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); } }; @@ -142,7 +148,7 @@ public: virtual void update() = 0; - virtual void accept(QSGNodeVisitorEx *visitor) { visitor->visit(this); visitor->visitChildren(this); visitor->endVisit(this); } + virtual void accept(QSGNodeVisitorEx *visitor) { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); } }; class Q_QUICK_PRIVATE_EXPORT QSGNinePatchNode : public QSGVisitableNode @@ -155,7 +161,7 @@ public: virtual void update() = 0; - virtual void accept(QSGNodeVisitorEx *visitor) { visitor->visit(this); visitor->visitChildren(this); visitor->endVisit(this); } + virtual void accept(QSGNodeVisitorEx *visitor) { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); } }; class Q_QUICK_EXPORT QSGLayer : public QSGDynamicTexture @@ -217,7 +223,7 @@ public: void setOwnerElement(QQuickItem *ownerElement) { m_ownerElement = ownerElement; } QQuickItem *ownerElement() const { return m_ownerElement; } - virtual void accept(QSGNodeVisitorEx *visitor) { visitor->visit(this); visitor->visitChildren(this); visitor->endVisit(this); } + virtual void accept(QSGNodeVisitorEx *visitor) { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); } protected: QRectF m_bounding_rect; QQuickItem *m_ownerElement; |