summaryrefslogtreecommitdiffstats
path: root/src/runtime/dragon/dragonmapper_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/dragon/dragonmapper_p.h')
-rw-r--r--src/runtime/dragon/dragonmapper_p.h40
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;