aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2020-11-12 11:54:26 +0200
committerKaj Grönholm <kaj.gronholm@qt.io>2020-11-12 14:22:53 +0200
commit9d19841b053d16157858cf1c48a0143933af2626 (patch)
tree7aecb1fdd19b094a397b9dbc425ebe9ad14547c0
parentb92d29c9e3d7a38a072be483e3fdd716271565c2 (diff)
Allow removing attractor particlesystem at runtime
Don't crash and make it work as expected. Task-number: QTBUG-37491 Change-Id: I0b94fdfa0a79dd43b762b03b24e3415762eecd95 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/particles/qquickparticleaffector.cpp15
-rw-r--r--src/particles/qquickparticleaffector_p.h3
-rw-r--r--src/particles/qquickparticlesystem.cpp3
3 files changed, 19 insertions, 2 deletions
diff --git a/src/particles/qquickparticleaffector.cpp b/src/particles/qquickparticleaffector.cpp
index 3e3346997e..9aae0db280 100644
--- a/src/particles/qquickparticleaffector.cpp
+++ b/src/particles/qquickparticleaffector.cpp
@@ -147,6 +147,9 @@ void QQuickParticleAffector::componentComplete()
}
bool QQuickParticleAffector::activeGroup(int g) {
+ if (!m_system)
+ return false;
+
if (m_updateIntSet){ //This can occur before group ids are properly assigned, but that resets the flag
m_groupIds.clear();
foreach (const QString &p, m_groups)
@@ -160,6 +163,9 @@ bool QQuickParticleAffector::shouldAffect(QQuickParticleData* d)
{
if (!d)
return false;
+ if (!m_system)
+ return false;
+
if (activeGroup(d->groupId)){
if ((m_onceOff && m_onceOffed.contains(qMakePair(d->groupId, d->index)))
|| !d->stillAlive(m_system))
@@ -178,6 +184,9 @@ bool QQuickParticleAffector::shouldAffect(QQuickParticleData* d)
void QQuickParticleAffector::postAffect(QQuickParticleData* d)
{
+ if (!m_system)
+ return;
+
m_system->needsReset << d;
if (m_onceOff)
m_onceOffed << qMakePair(d->groupId, d->index);
@@ -192,6 +201,9 @@ void QQuickParticleAffector::affectSystem(qreal dt)
{
if (!m_enabled)
return;
+ if (!m_system)
+ return;
+
//If not reimplemented, calls affectParticle per particle
//But only on particles in targeted system/area
updateOffsets();//### Needed if an ancestor is transformed.
@@ -244,6 +256,9 @@ void QQuickParticleAffector::updateOffsets()
bool QQuickParticleAffector::isColliding(QQuickParticleData *d) const
{
+ if (!m_system)
+ return false;
+
qreal myCurX = d->curX(m_system);
qreal myCurY = d->curY(m_system);
qreal myCurSize = d->curSize(m_system) / 2;
diff --git a/src/particles/qquickparticleaffector_p.h b/src/particles/qquickparticleaffector_p.h
index f5975708fa..4f60389e04 100644
--- a/src/particles/qquickparticleaffector_p.h
+++ b/src/particles/qquickparticleaffector_p.h
@@ -128,7 +128,8 @@ void setSystem(QQuickParticleSystem* arg)
{
if (m_system != arg) {
m_system = arg;
- m_system->registerParticleAffector(this);
+ if (m_system)
+ m_system->registerParticleAffector(this);
Q_EMIT systemChanged(arg);
}
}
diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp
index 9049892c83..386efed122 100644
--- a/src/particles/qquickparticlesystem.cpp
+++ b/src/particles/qquickparticlesystem.cpp
@@ -638,7 +638,8 @@ void QQuickParticleSystem::registerParticleAffector(QQuickParticleAffector* a)
{
if (m_debugMode)
qDebug() << "Registering Affector" << a << "to" << this;
- m_affectors << QPointer<QQuickParticleAffector>(a);
+ if (!m_affectors.contains(a))
+ m_affectors << QPointer<QQuickParticleAffector>(a);
}
void QQuickParticleSystem::registerParticleGroup(QQuickParticleGroup* g)