diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-03-13 18:47:59 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-03-22 10:45:28 +0000 |
commit | b9e4053715ee12137a13bfbeef99f0a7c5635913 (patch) | |
tree | 0b97b474c9c7c28df664849c75f829947011ec5c /src/core/aspects/qabstractaspect.cpp | |
parent | 525b7bcf045c22117fb2eed49c48fdbfb445d26d (diff) |
Hook up some machinery ready for testing the no cloning approach
Task-number: QTBUG-51835
Change-Id: I4520bf38acc9b8a990d3f3bce3d96f2014c5637b
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Diffstat (limited to 'src/core/aspects/qabstractaspect.cpp')
-rw-r--r-- | src/core/aspects/qabstractaspect.cpp | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp index 20a393738..19ec5a1dd 100644 --- a/src/core/aspects/qabstractaspect.cpp +++ b/src/core/aspects/qabstractaspect.cpp @@ -181,6 +181,44 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *frontend) const return Q_NULLPTR; } +QBackendNode *QAbstractAspectPrivate::createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const +{ + const QMetaObject *metaObj = change->metaObject(); + QBackendNodeMapperPtr backendNodeMapper; + while (metaObj != Q_NULLPTR && backendNodeMapper.isNull()) { + backendNodeMapper = m_backendCreatorFunctors.value(metaObj); + metaObj = metaObj->superClass(); + } + + if (!backendNodeMapper) + return nullptr; + + QBackendNode *backend = backendNodeMapper->get(change->subjectId()); + if (backend != Q_NULLPTR) + return backend; + backend = backendNodeMapper->create(change); + + // TODO: Find some place else to do all of this function from the arbiter + if (backend) + backend->initializeFromPeer(change); + + // 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 + // return a QBackendNode pointer. + if (!backend) + return nullptr; + + QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend); + // TO DO: Find a way to specify the changes to observe + // Register backendNode with QChangeArbiter + if (m_arbiter != Q_NULLPTR) { // Unit tests may not have the arbiter registered + m_arbiter->registerObserver(backendPriv, backend->peerId(), AllChanges); + if (backend->mode() == QBackendNode::ReadWrite) + m_arbiter->scene()->addObservable(backendPriv, backend->peerId()); + } + return backend; +} + void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const { const QMetaObject *metaObj = frontend->metaObject(); @@ -202,7 +240,7 @@ void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const } } -void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject) +void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNodeCreatedChangeBasePtr> &changes) { qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject; if (rootObject == m_root) @@ -211,8 +249,15 @@ void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject) m_root = rootObject; m_rootId = rootObject->id(); - QNodeVisitor visitor; - visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode); + // Use old method for now, unless user explicitly requests new method + const auto useNewMethod = qEnvironmentVariableIsSet("QT3D_NO_CLONE"); + if (!useNewMethod) { + QNodeVisitor visitor; + visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode); + } else { + for (const auto &change : changes) + createBackendNodeNoClone(change); + } } QServiceLocator *QAbstractAspectPrivate::services() const |