summaryrefslogtreecommitdiffstats
path: root/src/core/nodes
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-01-24 10:43:32 +0100
committerPaul Lemire <paul.lemire@kdab.com>2017-01-25 14:56:43 +0000
commit393ab950be4a622dc2616c061eeb4f2194991093 (patch)
treea8e83bb510c9cc58c1461eb2345f122925e09c34 /src/core/nodes
parent4f6bf6d53c50221977d3f6e2c04ced70d815e6ac (diff)
Allow to filter change events based on a track property
* QNode now has a PropertyTrackMode property * QScene contains a table of PropertyTrakcMode data * QPostman checks if a QNode is supposed to receive a change based on the information available in the QScene property track mode table * Unit tests updated and added for QPostman Change-Id: I3b88037a949020a917c81817f1451ef532065982 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/core/nodes')
-rw-r--r--src/core/nodes/qnode.cpp73
-rw-r--r--src/core/nodes/qnode.h16
-rw-r--r--src/core/nodes/qnode_p.h3
3 files changed, 90 insertions, 2 deletions
diff --git a/src/core/nodes/qnode.cpp b/src/core/nodes/qnode.cpp
index e4bb5d4a3..77d7c0a6b 100644
--- a/src/core/nodes/qnode.cpp
+++ b/src/core/nodes/qnode.cpp
@@ -73,6 +73,7 @@ QNodePrivate::QNodePrivate()
, m_blockNotifications(false)
, m_hasBackendNode(false)
, m_enabled(true)
+ , m_propertyTrackMode(QNode::DefaultTrackMode)
, m_propertyChangesSetup(false)
, m_signals(this)
{
@@ -402,7 +403,6 @@ void QNodePrivate::unsetSceneHelper(QNode *root)
m_scene->removeEntityForComponent(c->id(), entity->id());
}
}
-
if (m_scene != nullptr)
m_scene->removeObservable(root);
root->d_func()->setScene(nullptr);
@@ -495,8 +495,13 @@ void QNode::sceneChangeEvent(const QSceneChangePtr &change)
*/
void QNodePrivate::setScene(QScene *scene)
{
- if (m_scene != scene)
+ if (m_scene != scene) {
+ if (m_scene != nullptr)
+ m_scene->removePropertyTrackDataForNode(m_id);
m_scene = scene;
+ // set PropertyTrackData in the scene
+ updatePropertyTrackMode();
+ }
}
/*!
@@ -580,6 +585,16 @@ void QNodePrivate::insertTree(QNode *treeRoot, int depth)
treeRoot->setParent(q_func());
}
+void QNodePrivate::updatePropertyTrackMode()
+{
+ if (m_scene != nullptr) {
+ QScene::NodePropertyTrackData trackData;
+ trackData.updateMode = m_propertyTrackMode;
+ trackData.namedProperties = m_trackedProperties;
+ m_scene->setPropertyTrackDataForNode(m_id,trackData);
+ }
+}
+
/*!
\internal
*/
@@ -769,6 +784,34 @@ void QNode::setEnabled(bool isEnabled)
emit enabledChanged(isEnabled);
}
+void QNode::setPropertyTrackMode(QNode::PropertyTrackMode mode)
+{
+ Q_D(QNode);
+ if (d->m_propertyTrackMode == mode)
+ return;
+
+ d->m_propertyTrackMode = mode;
+ // The backend doesn't care about such notification
+ const bool blocked = blockNotifications(true);
+ emit propertyUpdateModeChanged(mode);
+ blockNotifications(blocked);
+ d->updatePropertyTrackMode();
+}
+
+void QNode::setTrackedProperties(const QStringList &trackedProperties)
+{
+ Q_D(QNode);
+ if (d->m_trackedProperties == trackedProperties)
+ return;
+
+ d->m_trackedProperties = trackedProperties;
+ // The backend doesn't care about such notification
+ const bool blocked = blockNotifications(true);
+ emit trackedPropertiesChanged(trackedProperties);
+ blockNotifications(blocked);
+ d->updatePropertyTrackMode();
+}
+
/*!
\property Qt3DCore::QNode::enabled
@@ -785,6 +828,32 @@ bool QNode::isEnabled() const
return d->m_enabled;
}
+/*!
+ \property Qt3DCore::QNode::propertyTrackMode
+
+ Holds the property track mode which determines whether a QNode should
+ be listening for property updates
+
+ By default it is set to QNode::DontTrackProperties
+*/
+QNode::PropertyTrackMode QNode::propertyTrackMode() const
+{
+ Q_D(const QNode);
+ return d->m_propertyTrackMode;
+}
+
+/*!
+ \property Qt3DCore::QNode::trackedProperties
+
+ Holds the names of the properties to be tracked when propertyTrackMode is
+ set to TrackNamedProperties.
+*/
+QStringList QNode::trackedProperties() const
+{
+ Q_D(const QNode);
+ return d->m_trackedProperties;
+}
+
QNodeCreatedChangeBasePtr QNode::createNodeCreationChange() const
{
// Uncomment this when implementing new frontend and backend types.
diff --git a/src/core/nodes/qnode.h b/src/core/nodes/qnode.h
index cadcc7d5c..75ea61cc7 100644
--- a/src/core/nodes/qnode.h
+++ b/src/core/nodes/qnode.h
@@ -69,7 +69,17 @@ class QT3DCORESHARED_EXPORT QNode : public QObject
Q_OBJECT
Q_PROPERTY(Qt3DCore::QNode *parent READ parentNode WRITE setParent NOTIFY parentChanged)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+ Q_PROPERTY(PropertyTrackMode propertyTrackMode READ propertyTrackMode WRITE setPropertyTrackMode NOTIFY propertyUpdateModeChanged)
+ Q_PROPERTY(QStringList trackedProperties READ trackedProperties WRITE setTrackedProperties NOTIFY trackedPropertiesChanged)
public:
+
+ enum PropertyTrackMode {
+ DefaultTrackMode,
+ TrackNamedPropertiesMode,
+ TrackAllPropertiesMode
+ };
+ Q_ENUM(PropertyTrackMode)
+
explicit QNode(QNode *parent = nullptr);
virtual ~QNode();
@@ -82,14 +92,20 @@ public:
QNodeVector childNodes() const;
bool isEnabled() const;
+ PropertyTrackMode propertyTrackMode() const;
+ QStringList trackedProperties() const;
public Q_SLOTS:
void setParent(QNode *parent);
void setEnabled(bool isEnabled);
+ void setPropertyTrackMode(PropertyTrackMode mode);
+ void setTrackedProperties(const QStringList &trackedProperties);
Q_SIGNALS:
void parentChanged(QObject *parent);
void enabledChanged(bool enabled);
+ void propertyUpdateModeChanged(PropertyTrackMode mode);
+ void trackedPropertiesChanged(const QStringList &trackedProperties);
void nodeDestroyed();
protected:
diff --git a/src/core/nodes/qnode_p.h b/src/core/nodes/qnode_p.h
index a90011128..5d6329e62 100644
--- a/src/core/nodes/qnode_p.h
+++ b/src/core/nodes/qnode_p.h
@@ -84,6 +84,7 @@ public:
void notifyObservers(const QSceneChangePtr &change) Q_DECL_OVERRIDE;
void insertTree(QNode *treeRoot, int depth = 0);
+ void updatePropertyTrackMode();
Q_DECLARE_PUBLIC(QNode)
@@ -97,6 +98,8 @@ public:
bool m_blockNotifications;
bool m_hasBackendNode;
bool m_enabled;
+ QNode::PropertyTrackMode m_propertyTrackMode;
+ QStringList m_trackedProperties;
static QNodePrivate *get(QNode *q);
static void nodePtrDeleter(QNode *q);