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 /src/core/aspects/qabstractaspect.cpp | |
parent | e8a263f615ed18669b3ed85aa25a36b34ee1508a (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.cpp | 32 |
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; |