summaryrefslogtreecommitdiffstats
path: root/src/core/aspects/qabstractaspect.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-08-30 11:41:18 +0200
committerMike Krus <mike.krus@kdab.com>2019-09-16 10:39:23 +0200
commit6a9609f8956ccc528da8b7acee2d7a3d195b2b2d (patch)
treed12aef2a869a8572fb48163bc7db0def2c52abc5 /src/core/aspects/qabstractaspect.cpp
parentc89997143cd6e51916924b71c8b0bf8705480a67 (diff)
Use direct access to remove backend nodes
- Stop using messages - Remove QSceneObserverInterface - Ensure backend node creation/destruction is done at the right time Change-Id: I470825af344ab65bf05e93fc149b61d1b9eefc96 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core/aspects/qabstractaspect.cpp')
-rw-r--r--src/core/aspects/qabstractaspect.cpp89
1 files changed, 36 insertions, 53 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 3a6ffd211..866a0ce25 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -191,12 +191,6 @@ void QAbstractAspect::unregisterBackendType(const QMetaObject &obj)
d->m_backendCreatorFunctors.remove(&obj);
}
-void QAbstractAspectPrivate::sceneNodeRemoved(QSceneChangePtr &change)
-{
- QNodeDestroyedChangePtr destructionChange = qSharedPointerCast<QNodeDestroyedChange>(change);
- clearBackendNode(destructionChange);
-}
-
QVariant QAbstractAspect::executeCommand(const QStringList &args)
{
Q_UNUSED(args);
@@ -215,9 +209,9 @@ void QAbstractAspect::syncDirtyFrontEndNodes(const QVector<QNode *> &nodes)
d->syncDirtyFrontEndNodes(nodes);
}
-QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperForNode(QNode *n) const
+QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperForNode(const QMetaObject *metaObj) const
{
- const QMetaObject *metaObj = n->metaObject();
+ Q_ASSERT(metaObj);
BackendNodeMapperAndInfo info;
while (metaObj != nullptr && info.first.isNull()) {
@@ -230,7 +224,8 @@ QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperF
void QAbstractAspectPrivate::syncDirtyFrontEndNodes(const QVector<QNode *> &nodes)
{
for (auto node: qAsConst(nodes)) {
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(node);
+ const QMetaObject *metaObj = QNodePrivate::get(node)->m_typeInfo;
+ const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
if (!backendNodeMapper)
@@ -300,35 +295,37 @@ void QAbstractAspectPrivate::sendPropertyMessages(QNode *node, QBackendNode *bac
}
}
-QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const
+QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &change) const
{
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(node);
+ const QMetaObject *metaObj = change.metaObj;
+ const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
if (!backendNodeMapper)
return nullptr;
- QBackendNode *backend = backendNodeMapper->get(node->id());
+ QBackendNode *backend = backendNodeMapper->get(change.id);
if (backend != nullptr)
return backend;
- QNodeCreatedChangeBasePtr change;
+ QNode *node = change.node;
+ QNodeCreatedChangeBasePtr creationChange;
const bool supportsSyncing = backendNodeMapperInfo.second & SupportsSyncing;
if (supportsSyncing) {
// All objects modified to use syncing should only use the id in the creation functor
QNodeCreatedChangeBase changeObj(node);
- change = QNodeCreatedChangeBasePtr(&changeObj, [](QNodeCreatedChangeBase *) {});
- backend = backendNodeMapper->create(change);
+ creationChange = QNodeCreatedChangeBasePtr(&changeObj, [](QNodeCreatedChangeBase *) {});
+ backend = backendNodeMapper->create(creationChange);
} else {
- change = node->createNodeCreationChange();
- backend = backendNodeMapper->create(change);
+ creationChange = node->createNodeCreationChange();
+ backend = backendNodeMapper->create(creationChange);
}
if (!backend)
return nullptr;
// TODO: Find some place else to do all of this function from the arbiter
- backend->setPeerId(node->id());
+ backend->setPeerId(change.id);
// Backend could be null if the user decides that his functor should only
// perform some action when encountering a given type of item but doesn't need to
@@ -341,7 +338,7 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const
// Register backendNode with QChangeArbiter
if (m_arbiter != nullptr) { // Unit tests may not have the arbiter registered
qCDebug(Nodes) << q_func()->objectName() << "Creating backend node for node id"
- << node->id() << "of type" << node->metaObject()->className();
+ << node->id() << "of type" << QNodePrivate::get(node)->m_typeInfo->className();
m_arbiter->registerObserver(backendPriv, backend->peerId(), AllChanges);
if (backend->mode() == QBackendNode::ReadWrite)
m_arbiter->scene()->addObservable(backendPriv, backend->peerId());
@@ -350,44 +347,34 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const
if (supportsSyncing)
syncDirtyFrontEndNode(node, backend, true);
else
- backend->initializeFromPeer(change);
+ backend->initializeFromPeer(creationChange);
return backend;
}
-void QAbstractAspectPrivate::clearBackendNode(const QNodeDestroyedChangePtr &change) const
+void QAbstractAspectPrivate::clearBackendNode(const NodeTreeChange &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
- const auto subTree = change->subtreeIdsAndTypes();
- for (const auto &idAndType : subTree) {
- const QMetaObject *metaObj = idAndType.type;
- QBackendNodeMapperPtr backendNodeMapper;
-
- // Find backend node mapper for this type
- while (metaObj != nullptr && backendNodeMapper.isNull()) {
- backendNodeMapper = m_backendCreatorFunctors.value(metaObj).first;
- metaObj = metaObj->superClass();
- }
+ const QMetaObject *metaObj = change.metaObj;
+ const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
+ const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
- if (!backendNodeMapper)
- continue;
+ if (!backendNodeMapper)
+ return;
- // Request the mapper to destroy the corresponding backend node
- QBackendNode *backend = backendNodeMapper->get(idAndType.id);
- if (backend) {
- qCDebug(Nodes) << q_func()->objectName() << "Deleting backend node for node id"
- << idAndType.id << "of type" << idAndType.type->className();
- 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);
- }
+ // Request the mapper to destroy the corresponding backend node
+ QBackendNode *backend = backendNodeMapper->get(change.id);
+ if (backend) {
+ qCDebug(Nodes) << "Deleting backend node for node id"
+ << change.id << "of type" << metaObj->className();
+ 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(change.id);
}
}
-void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNode *> &nodes)
+void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<NodeTreeChange> &nodesChanges)
{
qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject;
if (rootObject == m_root)
@@ -396,14 +383,10 @@ void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QV
m_root = rootObject;
m_rootId = rootObject->id();
- createNodes(nodes);
+ for (const NodeTreeChange &change : nodesChanges)
+ createBackendNode(change);
}
-void QAbstractAspectPrivate::createNodes(const QVector<QNode *> &nodes)
-{
- for (const auto node : nodes)
- createBackendNode(node);
-}
QServiceLocator *QAbstractAspectPrivate::services() const
{