diff options
Diffstat (limited to 'src/runtime/dragon/dragonmapper_p.h')
-rw-r--r-- | src/runtime/dragon/dragonmapper_p.h | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/runtime/dragon/dragonmapper_p.h b/src/runtime/dragon/dragonmapper_p.h index 130c60c..a688249 100644 --- a/src/runtime/dragon/dragonmapper_p.h +++ b/src/runtime/dragon/dragonmapper_p.h @@ -44,6 +44,13 @@ #include <private/dragonbackendnode_p.h> #include <private/dragonvaluecontainer_p.h> +#include <private/dragonnodetree_p.h> + +#include <Qt3DCore/qpropertynodeaddedchange.h> +#include <Qt3DCore/qpropertynoderemovedchange.h> +#include <Qt3DCore/qpropertyupdatedchange.h> + +#include <Qt3DCore/qpropertyupdatedchange.h> QT_BEGIN_NAMESPACE @@ -63,13 +70,15 @@ template <class Backend, class BackendTarget=Backend> class NodeFunctor : public Qt3DCore::QBackendNodeMapper { public: - NodeFunctor() + NodeFunctor(NodeTree *nodeTree) : m_localNodes(new ValueContainer<Backend>()) , m_nodes(m_localNodes.get()) + , m_nodeTree(nodeTree) {} - NodeFunctor(ValueContainer<Backend> *nodes) + NodeFunctor(NodeTree *nodeTree, ValueContainer<Backend> *nodes) : m_nodes(nodes) + , m_nodeTree(nodeTree) {} // TODO constructors, one takes nothing, creates nodes - other takes existing list @@ -82,6 +91,8 @@ public: void destroy(Qt3DCore::QNodeId id) const final { + m_nodeTree->removeNode(id); + auto &nodes = *m_nodes; // TODO consider use modified to show there's a copy nodes.remove(id); @@ -90,20 +101,42 @@ public: void initializeFromPeer(Qt3DCore::QNodeId id, const Qt3DCore::QNodeCreatedChangeBasePtr &change) const { + m_nodeTree->setParent(id, change->parentId()); + auto &nodes = *m_nodes; // Using a std::move here because we are assigning to the same node. nodes[id] = std::move(nodes[id]).modified([&change](Backend *node){ node->initializeFromPeer(change); + node->setEnabled(change->isNodeEnabled()); }); } void sceneChangeEvent(Qt3DCore::QNodeId id, const Qt3DCore::QSceneChangePtr &e) const { + switch (e->type()) { + case Qt3DCore::PropertyUpdated: { + Qt3DCore::QPropertyUpdatedChangePtr change = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(e); + if (change->propertyName() == QByteArrayLiteral("parent")) { + m_nodeTree->setParent(id, change->value().value<Qt3DCore::QNodeId>()); + } + break; + } + default: + break; + } + auto &nodes = *m_nodes; // Using a std::move here because we are assigning to the same node. nodes[id] = std::move(nodes[id]).modified([&e](Backend *element){ + if (e->type() == Qt3DCore::PropertyUpdated) { + Qt3DCore::QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(e); + if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { + element->setEnabled(propertyChange->value().toBool()); + element->markDirty(); + } + } element->sceneChangeEvent(e); }); @@ -139,6 +172,7 @@ private: // TODO consider storing ValueContainer<BackendNode> (need to verify polymorphism) mutable QScopedPointer<ValueContainer<Backend>> m_localNodes; mutable ValueContainer<Backend> *m_nodes; + mutable NodeTree *m_nodeTree = nullptr; }; template <typename T, typename U> @@ -170,6 +204,8 @@ private: template<class Backend, class BackendTarget> Qt3DCore::QBackendNode *NodeFunctor<Backend, BackendTarget>::create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const { + m_nodeTree->addNode(change->subjectId()); + auto peerId = change->subjectId(); auto *wrapper = new MapperWrapper<Backend, BackendTarget>(this); m_wrappers[peerId] = wrapper; |