diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-01-24 10:43:32 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2017-01-25 14:56:43 +0000 |
commit | 393ab950be4a622dc2616c061eeb4f2194991093 (patch) | |
tree | a8e83bb510c9cc58c1461eb2345f122925e09c34 /src/core/nodes | |
parent | 4f6bf6d53c50221977d3f6e2c04ced70d815e6ac (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.cpp | 73 | ||||
-rw-r--r-- | src/core/nodes/qnode.h | 16 | ||||
-rw-r--r-- | src/core/nodes/qnode_p.h | 3 |
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); |