summaryrefslogtreecommitdiffstats
path: root/src/core/aspects/qabstractaspect.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-12-20 12:41:04 +0100
committerMike Krus <mike.krus@kdab.com>2020-02-11 06:08:41 +0000
commitb828609440a4771838c242b3ad9962ecd7a2fe99 (patch)
tree5da6bce0cda327c4cca96696bce512ec243cc1fd /src/core/aspects/qabstractaspect.cpp
parentb0eb152b82cdd9658154ff7d9ef9e764eccc1ebd (diff)
Remove deprecated classes and functions
Mostly old messaging API Change-Id: I17eb2206b2ede56d2f7d36375d5e711d6149019f Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core/aspects/qabstractaspect.cpp')
-rw-r--r--src/core/aspects/qabstractaspect.cpp238
1 files changed, 38 insertions, 200 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 824434ce6..3f569a4ed 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -45,16 +45,10 @@
#include <Qt3DCore/qcomponent.h>
#include <Qt3DCore/qentity.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
-#include <Qt3DCore/qpropertyvalueaddedchange.h>
-#include <Qt3DCore/qpropertyvalueremovedchange.h>
-#include <Qt3DCore/qcomponentaddedchange.h>
-#include <Qt3DCore/qcomponentremovedchange.h>
#include <Qt3DCore/private/corelogging_p.h>
#include <Qt3DCore/private/qaspectjobmanager_p.h>
#include <Qt3DCore/private/qaspectmanager_p.h>
-#include <Qt3DCore/private/qchangearbiter_p.h>
#include <Qt3DCore/private/qnodevisitor_p.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
@@ -180,14 +174,7 @@ QNodeId QAbstractAspect::rootEntityId() const Q_DECL_NOEXCEPT
void QAbstractAspect::registerBackendType(const QMetaObject &obj, const QBackendNodeMapperPtr &functor)
{
Q_D(QAbstractAspect);
- d->m_backendCreatorFunctors.insert(&obj, {functor, QAbstractAspectPrivate::DefaultMapper});
-}
-
-void QAbstractAspect::registerBackendType(const QMetaObject &obj, const QBackendNodeMapperPtr &functor, bool supportsSyncing)
-{
- Q_D(QAbstractAspect);
- const auto f = supportsSyncing ? QAbstractAspectPrivate::SupportsSyncing : QAbstractAspectPrivate::DefaultMapper;
- d->m_backendCreatorFunctors.insert(&obj, {functor, f});
+ d->m_backendCreatorFunctors.insert(&obj, functor);
}
void QAbstractAspect::unregisterBackendType(const QMetaObject &obj)
@@ -208,24 +195,23 @@ QVector<QAspectJobPtr> QAbstractAspect::jobsToExecute(qint64 time)
return QVector<QAspectJobPtr>();
}
-QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperForNode(const QMetaObject *metaObj) const
+QBackendNodeMapperPtr QAbstractAspectPrivate::mapperForNode(const QMetaObject *metaObj) const
{
Q_ASSERT(metaObj);
- BackendNodeMapperAndInfo info;
+ QBackendNodeMapperPtr mapper;
- while (metaObj != nullptr && info.first.isNull()) {
- info = m_backendCreatorFunctors.value(metaObj);
+ while (metaObj != nullptr && mapper.isNull()) {
+ mapper = m_backendCreatorFunctors.value(metaObj);
metaObj = metaObj->superClass();
}
- return info;
+ return mapper;
}
void QAbstractAspectPrivate::syncDirtyFrontEndNodes(const QVector<QNode *> &nodes)
{
for (auto node: qAsConst(nodes)) {
const QMetaObject *metaObj = QNodePrivate::get(node)->m_typeInfo;
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
- const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
+ const QBackendNodeMapperPtr backendNodeMapper = mapperForNode(metaObj);
if (!backendNodeMapper)
continue;
@@ -234,168 +220,53 @@ void QAbstractAspectPrivate::syncDirtyFrontEndNodes(const QVector<QNode *> &node
if (!backend)
continue;
- const bool supportsSyncing = backendNodeMapperInfo.second & SupportsSyncing;
- if (supportsSyncing)
- syncDirtyFrontEndNode(node, backend, false);
- else
- sendPropertyMessages(node, backend);
+ syncDirtyFrontEndNode(node, backend, false);
}
}
-void QAbstractAspectPrivate::syncDirtyFrontEndSubNodes(const QVector<NodeRelationshipChange> &nodes)
+void QAbstractAspectPrivate::syncDirtyEntityComponentNodes(const QVector<ComponentRelationshipChange> &changes)
{
- for (const auto &nodeChange: qAsConst(nodes)) {
- auto getBackend = [this](QNode *node) -> std::tuple<QBackendNode *, bool> {
- const QMetaObject *metaObj = QNodePrivate::get(node)->m_typeInfo;
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
- const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
-
- if (!backendNodeMapper)
- return {};
-
- QBackendNode *backend = backendNodeMapper->get(node->id());
- if (!backend)
- return {};
+ auto getBackend = [this] (QNode *node) -> QBackendNode* {
+ const QMetaObject *metaObj = QNodePrivate::get(node)->m_typeInfo;
+ const QBackendNodeMapperPtr backendNodeMapper = mapperForNode(metaObj);
- const bool supportsSyncing = backendNodeMapperInfo.second & SupportsSyncing;
+ if (!backendNodeMapper)
+ return nullptr;
- return std::tuple<QBackendNode *, bool>(backend, supportsSyncing);
- };
+ return backendNodeMapper->get(node->id());
+ };
- auto nodeInfo = getBackend(nodeChange.node);
- if (!std::get<0>(nodeInfo))
+ for (const auto &change: qAsConst(changes)) {
+ auto entityBackend = getBackend(change.node);
+ if (!entityBackend)
continue;
- auto subNodeInfo = getBackend(nodeChange.subNode);
- if (!std::get<0>(subNodeInfo))
+ auto componentBackend = getBackend(change.subNode);
+ if (!componentBackend)
continue;
- switch (nodeChange.change) {
- case PropertyValueAdded: {
- if (std::get<1>(nodeInfo))
- break; // do nothing as the node will be dirty anyway
-
- QPropertyValueAddedChange change(nodeChange.node->id());
- change.setPropertyName(nodeChange.property);
- change.setAddedValue(QVariant::fromValue(nodeChange.subNode->id()));
- QPropertyValueAddedChangePtr pChange(&change, [](QPropertyValueAddedChange *) { });
- std::get<0>(nodeInfo)->sceneChangeEvent(pChange);
- }
- break;
- case PropertyValueRemoved: {
- if (std::get<1>(nodeInfo))
- break; // do nothing as the node will be dirty anyway
-
- QPropertyValueRemovedChange change(nodeChange.node->id());
- change.setPropertyName(nodeChange.property);
- change.setRemovedValue(QVariant::fromValue(nodeChange.subNode->id()));
- QPropertyValueRemovedChangePtr pChange(&change, [](QPropertyValueRemovedChange *) { });
- std::get<0>(nodeInfo)->sceneChangeEvent(pChange);
- }
- break;
- case ComponentAdded: {
- // let the entity know it has a new component
- if (std::get<1>(nodeInfo)) {
- QBackendNodePrivate::get(std::get<0>(nodeInfo))->componentAdded(nodeChange.subNode);
- } else {
- QComponentAddedChange change(qobject_cast<Qt3DCore::QComponent *>(nodeChange.subNode), qobject_cast<Qt3DCore::QEntity *>(nodeChange.node));
- QComponentAddedChangePtr pChange(&change, [](QComponentAddedChange *) { });
- std::get<0>(nodeInfo)->sceneChangeEvent(pChange);
- }
-
- // let the component know it was added to an entity
- if (std::get<1>(subNodeInfo)) {
- QBackendNodePrivate::get(std::get<0>(subNodeInfo))->addedToEntity(nodeChange.node);
- } else {
- QComponentAddedChange change(qobject_cast<Qt3DCore::QComponent *>(nodeChange.subNode), qobject_cast<Qt3DCore::QEntity *>(nodeChange.node));
- QComponentAddedChangePtr pChange(&change, [](QComponentAddedChange *) { });
- std::get<0>(subNodeInfo)->sceneChangeEvent(pChange);
- }
- }
- break;
- case ComponentRemoved: {
- // let the entity know a component was removed
- if (std::get<1>(nodeInfo)) {
- QBackendNodePrivate::get(std::get<0>(nodeInfo))->componentRemoved(nodeChange.subNode);
- } else {
- QComponentRemovedChange change(qobject_cast<Qt3DCore::QComponent *>(nodeChange.subNode), qobject_cast<Qt3DCore::QEntity *>(nodeChange.node));
- QComponentRemovedChangePtr pChange(&change, [](QComponentRemovedChange *) { });
- std::get<0>(nodeInfo)->sceneChangeEvent(pChange);
- }
-
- // let the component know it was removed from an entity
- if (std::get<1>(subNodeInfo)) {
- QBackendNodePrivate::get(std::get<0>(subNodeInfo))->removedFromEntity(nodeChange.node);
- } else {
- QComponentRemovedChange change(qobject_cast<Qt3DCore::QEntity *>(nodeChange.node), qobject_cast<Qt3DCore::QComponent *>(nodeChange.subNode));
- QComponentRemovedChangePtr pChange(&change, [](QComponentRemovedChange *) { });
- std::get<0>(nodeInfo)->sceneChangeEvent(pChange);
- }
- }
- break;
- default:
+ switch (change.change) {
+ case ComponentRelationshipChange::Added:
+ QBackendNodePrivate::get(entityBackend)->componentAdded(change.subNode);
+ QBackendNodePrivate::get(componentBackend)->addedToEntity(change.node);
+ break;
+ case ComponentRelationshipChange::Removed:
+ QBackendNodePrivate::get(entityBackend)->componentRemoved(change.subNode);
+ QBackendNodePrivate::get(componentBackend)->removedFromEntity(change.node);
break;
}
}
}
-void QAbstractAspectPrivate::syncDirtyFrontEndNode(QNode *node, QBackendNode *backend, bool firstTime) const
-{
- Q_ASSERT(false); // overload in derived class
- if (!firstTime)
- sendPropertyMessages(node, backend);
-}
-
-void QAbstractAspectPrivate::sendPropertyMessages(QNode *node, QBackendNode *backend) const
+void QAbstractAspectPrivate::syncDirtyFrontEndNode(QNode *, QBackendNode *, bool) const
{
- const int offset = QNode::staticMetaObject.propertyOffset();
- const auto metaObj = node->metaObject();
- const int count = metaObj->propertyCount();
-
- const auto toBackendValue = [](const QVariant &data) -> QVariant
- {
- if (data.canConvert<QNode*>()) {
- QNode *node = data.value<QNode*>();
-
- // Ensure the node and all ancestors have issued their node creation changes.
- // We can end up here if a newly created node with a parent is immediately set
- // as a property on another node. In this case the deferred call to
- // _q_postConstructorInit() will not have happened yet as the event
- // loop will still be blocked. We need to do this for all ancestors,
- // since the subtree of this node otherwise can end up on the backend
- // with a reference to a non-existent parent.
- if (node)
- QNodePrivate::get(node)->_q_ensureBackendNodeCreated();
-
- const QNodeId id = node ? node->id() : QNodeId();
- return QVariant::fromValue(id);
- }
-
- return data;
- };
-
- QPropertyUpdatedChange change(node->id());
- QPropertyUpdatedChangePtr pchange(&change, [](QPropertyUpdatedChange *) { });
- for (int index = offset; index < count; index++) {
- const QMetaProperty pro = metaObj->property(index);
- change.setPropertyName(pro.name());
- change.setValue(toBackendValue(pro.read(node)));
- backend->sceneChangeEvent(pchange);
- }
-
- auto const dynamicProperties = node->dynamicPropertyNames();
- for (const QByteArray &name: dynamicProperties) {
- change.setPropertyName(name.data());
- change.setValue(toBackendValue(node->property(name.data())));
- backend->sceneChangeEvent(pchange);
- }
+ // this would usually be overloaded in derived aspect classes
}
QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &change) const
{
const QMetaObject *metaObj = change.metaObj;
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
- const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
+ const QBackendNodeMapperPtr backendNodeMapper = mapperForNode(metaObj);
if (!backendNodeMapper)
return nullptr;
@@ -405,23 +276,14 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &ch
return backend;
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);
- creationChange = QNodeCreatedChangeBasePtr(&changeObj, [](QNodeCreatedChangeBase *) {});
- backend = backendNodeMapper->create(creationChange);
- } else {
- creationChange = node->createNodeCreationChange();
- backend = backendNodeMapper->create(creationChange);
- }
+ QNodeId nodeId = qIdForNode(node);
+ backend = backendNodeMapper->create(nodeId);
if (!backend)
return nullptr;
// TODO: Find some place else to do all of this function from the arbiter
- backend->setPeerId(change.id);
+ backend->setPeerId(nodeId);
// 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
@@ -430,20 +292,7 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &ch
QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend);
backendPriv->setEnabled(node->isEnabled());
- // TO DO: Find a way to specify the changes to observe
- // 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" << 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());
- }
-
- if (supportsSyncing)
- syncDirtyFrontEndNode(node, backend, true);
- else
- backend->initializeFromPeer(creationChange);
+ syncDirtyFrontEndNode(node, backend, true);
return backend;
}
@@ -451,23 +300,12 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &ch
void QAbstractAspectPrivate::clearBackendNode(const NodeTreeChange &change) const
{
const QMetaObject *metaObj = change.metaObj;
- const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj);
- const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first;
+ const QBackendNodeMapperPtr backendNodeMapper = mapperForNode(metaObj);
if (!backendNodeMapper)
return;
- // 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);
- }
+ backendNodeMapper->destroy(change.id);
}
void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<NodeTreeChange> &nodesChanges)