diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-04-10 09:28:59 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-04-12 12:45:17 +0000 |
commit | 4d2aec2bc26db1d680268a0ee62d465df2fee13d (patch) | |
tree | 3bc8e19a5c225f544a96df75eea7ca23a6efd36c | |
parent | e8a263f615ed18669b3ed85aa25a36b34ee1508a (diff) |
Add no cloning version of QAbstractAspectPrivate::clearBackendNode()
Change-Id: If2d290c15f8d7ffaed40083ecc6a5daf5686d274
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/core/aspects/qabstractaspect.cpp | 32 | ||||
-rw-r--r-- | src/core/aspects/qabstractaspect_p.h | 3 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp index 5b27fe4b0..b5712a33a 100644 --- a/src/core/aspects/qabstractaspect.cpp +++ b/src/core/aspects/qabstractaspect.cpp @@ -243,6 +243,38 @@ void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const } } +void QAbstractAspectPrivate::clearBackendNodeNoClone(const QNodeDestroyedChangePtr &change) const +{ + // Each QNodeDestroyedChange may contain info about a whole sub-tree of nodes that + // are being destroyed. Iterate over them and process each in turn + for (const auto &idAndType : change->subtreeIdsAndTypes()) { + const QMetaObject *metaObj = idAndType.type; + QBackendNodeMapperPtr backendNodeMapper; + + // Find backend node mapper for this type + while (metaObj != Q_NULLPTR && backendNodeMapper.isNull()) { + backendNodeMapper = m_backendCreatorFunctors.value(metaObj); + metaObj = metaObj->superClass(); + } + + if (!backendNodeMapper) { + qWarning() << "Failed to find backend node mapper for node id" + << idAndType.id << "of type" << idAndType.type->className(); + continue; + } + + // Request the mapper to destroy the corresponding backend node + QBackendNode *backend = backendNodeMapper->get(idAndType.id); + if (backend) { + QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend); + m_arbiter->unregisterObserver(backendPriv, backend->peerId()); + if (backend->mode() == QBackendNode::ReadWrite) + m_arbiter->scene()->removeObservable(backendPriv, backend->peerId()); + backendNodeMapper->destroy(idAndType.id); + } + } +} + void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNodeCreatedChangeBasePtr> &changes) { qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject; diff --git a/src/core/aspects/qabstractaspect_p.h b/src/core/aspects/qabstractaspect_p.h index 9f67ea917..c8f395b52 100644 --- a/src/core/aspects/qabstractaspect_p.h +++ b/src/core/aspects/qabstractaspect_p.h @@ -55,6 +55,7 @@ #include <private/qaspectjobproviderinterface_p.h> #include <private/qbackendnode_p.h> #include <private/qbackendnodefactory_p.h> +#include <private/qnodedestroyedchange_p.h> #include <private/qsceneobserverinterface_p.h> #include <private/qt3dcore_global_p.h> #include <Qt3DCore/qabstractaspect.h> @@ -92,6 +93,8 @@ public: QBackendNode *createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const Q_DECL_OVERRIDE; void clearBackendNode(QNode *frontend) const; + // TODO: Rename this to clearBackendNode (or deleteBackendNode) when new system is fully in place + void clearBackendNodeNoClone(const QNodeDestroyedChangePtr &change) const; void sceneNodeAdded(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; void sceneNodeRemoved(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; |