summaryrefslogtreecommitdiffstats
path: root/src/core/aspects/qabstractaspect.cpp
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-03-13 18:47:59 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-03-22 10:45:28 +0000
commitb9e4053715ee12137a13bfbeef99f0a7c5635913 (patch)
tree0b97b474c9c7c28df664849c75f829947011ec5c /src/core/aspects/qabstractaspect.cpp
parent525b7bcf045c22117fb2eed49c48fdbfb445d26d (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.cpp51
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