aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-08-13 10:17:53 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-08-23 10:55:35 +0200
commit441dca459286d5ab033be403f381c0914c6f74f9 (patch)
tree7e0d1fecb9df99208fab17b471b43a2e598c2c9f /src
parent8d0e307bc7f9f4458e6ea2d2fc0d6cd25be4fda9 (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.cpp24
-rw-r--r--src/quick/scenegraph/qsgadaptationlayer_p.h30
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;