summaryrefslogtreecommitdiffstats
path: root/src/core/aspects/qabstractaspect.cpp
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-04-10 09:28:59 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-04-12 12:45:17 +0000
commit4d2aec2bc26db1d680268a0ee62d465df2fee13d (patch)
tree3bc8e19a5c225f544a96df75eea7ca23a6efd36c /src/core/aspects/qabstractaspect.cpp
parente8a263f615ed18669b3ed85aa25a36b34ee1508a (diff)
Add no cloning version of QAbstractAspectPrivate::clearBackendNode()
Change-Id: If2d290c15f8d7ffaed40083ecc6a5daf5686d274 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core/aspects/qabstractaspect.cpp')
-rw-r--r--src/core/aspects/qabstractaspect.cpp32
1 files changed, 32 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;