summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2015-12-02 17:03:29 +0100
committerKevin Ottens <kevin.ottens@kdab.com>2015-12-03 11:44:10 +0000
commit8a49e06fbbeff56993fe74868400b33709b24ac8 (patch)
treea7d3001ace9fcd1fc4a92d12f350a45289dd3fc4 /src/core
parentc45b47e99eaf0bcecec606a304b338424d58561b (diff)
Factor out in QAbstractAspect common behavior
There was code involving the node visitor duplicated in several aspect, move that logic back into their common base class: QAbstractAspect. Change-Id: I47320e93691edb43e3cccdd81753423816ad955d Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/aspects/qabstractaspect.cpp30
-rw-r--r--src/core/aspects/qabstractaspect.h8
2 files changed, 37 insertions, 1 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 8c2e58939..3db95d315 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -41,6 +41,8 @@
#include <Qt3DCore/private/qaspectjobmanager_p.h>
#include <private/qchangearbiter_p.h>
#include <Qt3DCore/private/qscene_p.h>
+#include <Qt3DCore/qnodevisitor.h>
+#include <Qt3DCore/qscenepropertychange.h>
QT_BEGIN_NAMESPACE
@@ -92,6 +94,23 @@ void QAbstractAspect::registerBackendType(const QMetaObject &obj, const QBackend
d->m_backendCreatorFunctors.insert(className(obj), functor);
}
+void QAbstractAspect::sceneNodeAdded(QSceneChangePtr &e)
+{
+ QScenePropertyChangePtr propertyChange = e.staticCast<QScenePropertyChange>();
+ QNodePtr nodePtr = propertyChange->value().value<QNodePtr>();
+ QNode *n = nodePtr.data();
+ QNodeVisitor visitor;
+ visitor.traverse(n, this, &QAbstractAspect::visitNode);
+}
+
+void QAbstractAspect::sceneNodeRemoved(QSceneChangePtr &e)
+{
+ QScenePropertyChangePtr propertyChange = e.staticCast<QScenePropertyChange>();
+ QNodePtr nodePtr = propertyChange->value().value<QNodePtr>();
+ QNode *n = nodePtr.data();
+ QAbstractAspect::clearBackendNode(n);
+}
+
QVariant QAbstractAspect::executeCommand(const QStringList &args)
{
Q_UNUSED(args);
@@ -167,6 +186,12 @@ void QAbstractAspect::clearBackendNode(QNode *frontend) const
}
}
+void QAbstractAspect::setRootEntity(QEntity *rootObject)
+{
+ QNodeVisitor visitor;
+ visitor.traverse(rootObject, this, &QAbstractAspect::visitNode);
+}
+
void QAbstractAspect::registerAspect(QEntity *rootObject)
{
Q_D(QAbstractAspect);
@@ -203,6 +228,11 @@ void QAbstractAspect::onShutdown()
{
}
+void QAbstractAspect::visitNode(QNode *node)
+{
+ createBackendNode(node);
+}
+
} // of namespace Qt3DCore
QT_END_NAMESPACE
diff --git a/src/core/aspects/qabstractaspect.h b/src/core/aspects/qabstractaspect.h
index 1aec7aa5f..7d121d9ae 100644
--- a/src/core/aspects/qabstractaspect.h
+++ b/src/core/aspects/qabstractaspect.h
@@ -81,6 +81,9 @@ public:
void registerBackendType(const QBackendNodeFunctorPtr &functor);
void registerBackendType(const QMetaObject &, const QBackendNodeFunctorPtr &functor);
+ void sceneNodeAdded(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
+ void sceneNodeRemoved(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
+
virtual QVariant executeCommand(const QStringList &args);
protected:
@@ -90,13 +93,16 @@ protected:
QBackendNode *getBackendNode(QNode *frontend) const;
void clearBackendNode(QNode *frontend) const;
+ virtual void setRootEntity(QEntity *rootObject);
+
private:
- virtual void setRootEntity(QEntity *rootObject) = 0;
virtual void onInitialize(const QVariantMap &data) = 0;
virtual void onStartup();
virtual void onShutdown();
virtual void onCleanup() = 0;
+ virtual void visitNode(QNode *node);
+
Q_DECLARE_PRIVATE(QAbstractAspect)
friend class QAspectManager;
};