aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles/qquickitemparticle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/particles/qquickitemparticle.cpp')
-rw-r--r--src/particles/qquickitemparticle.cpp59
1 files changed, 55 insertions, 4 deletions
diff --git a/src/particles/qquickitemparticle.cpp b/src/particles/qquickitemparticle.cpp
index cd48095b18..f6d352d478 100644
--- a/src/particles/qquickitemparticle.cpp
+++ b/src/particles/qquickitemparticle.cpp
@@ -94,7 +94,11 @@ QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) :
{
setFlag(QQuickItem::ItemHasContents);
clock = new Clock(this);
- clock->start();
+ connect(this, &QQuickItemParticle::systemChanged, this, &QQuickItemParticle::reconnectSystem);
+ connect(this, &QQuickItemParticle::parentChanged, this, &QQuickItemParticle::reconnectParent);
+ connect(this, &QQuickItemParticle::enabledChanged, this, &QQuickItemParticle::updateClock);
+ reconnectSystem(m_system);
+ reconnectParent(parent);
}
QQuickItemParticle::~QQuickItemParticle()
@@ -230,9 +234,10 @@ QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d)
if (m_pleaseReset)
m_pleaseReset = false;
- prepareNextFrame();
-
- update();//Get called again
+ if (clockShouldUpdate()) {
+ prepareNextFrame();
+ update(); //Get called again
+ }
if (n)
n->markDirty(QSGNode::DirtyMaterial);
return QQuickItem::updatePaintNode(n,d);
@@ -285,6 +290,52 @@ QQuickItemParticleAttached *QQuickItemParticle::qmlAttachedProperties(QObject *o
return new QQuickItemParticleAttached(object);
}
+bool QQuickItemParticle::clockShouldUpdate() const
+{
+ QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent());
+ return (m_system && m_system->isRunning() && !m_system->isPaused() && m_system->isEnabled()
+ && ((parentItem && parentItem->isEnabled()) || !parentItem) && isEnabled());
+}
+
+void QQuickItemParticle::reconnectParent(QQuickItem *parentItem)
+{
+ updateClock();
+ disconnect(m_parentEnabledStateConnection);
+ if (parentItem) {
+ m_parentEnabledStateConnection = connect(parentItem, &QQuickParticleSystem::enabledChanged,
+ this, &QQuickItemParticle::updateClock);
+ }
+}
+
+void QQuickItemParticle::reconnectSystem(QQuickParticleSystem *system)
+{
+ updateClock();
+ disconnect(m_systemRunStateConnection);
+ disconnect(m_systemPauseStateConnection);
+ disconnect(m_systemEnabledStateConnection);
+ if (system) {
+ m_systemRunStateConnection = connect(m_system, &QQuickParticleSystem::runningChanged, this, [this](){
+ QQuickItemParticle::updateClock();
+ });
+ m_systemPauseStateConnection = connect(m_system, &QQuickParticleSystem::pausedChanged, this, [this](){
+ QQuickItemParticle::updateClock();
+ });
+ m_systemEnabledStateConnection = connect(m_system, &QQuickParticleSystem::enabledChanged, this,
+ &QQuickItemParticle::updateClock);
+ }
+}
+
+void QQuickItemParticle::updateClock()
+{
+ if (clockShouldUpdate()) {
+ if (!clock->isRunning())
+ clock->start();
+ } else {
+ if (clock->isRunning())
+ clock->pause();
+ }
+}
+
QT_END_NAMESPACE
#include "moc_qquickitemparticle_p.cpp"