From 9d19841b053d16157858cf1c48a0143933af2626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= Date: Thu, 12 Nov 2020 11:54:26 +0200 Subject: Allow removing attractor particlesystem at runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't crash and make it work as expected. Task-number: QTBUG-37491 Change-Id: I0b94fdfa0a79dd43b762b03b24e3415762eecd95 Reviewed-by: Tomi Korpipää Reviewed-by: Laszlo Agocs --- src/particles/qquickparticleaffector.cpp | 15 +++++++++++++++ src/particles/qquickparticleaffector_p.h | 3 ++- src/particles/qquickparticlesystem.cpp | 3 ++- 3 files changed, 19 insertions(+), 2 deletions(-) (limited to 'src') 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(a); + if (!m_affectors.contains(a)) + m_affectors << QPointer(a); } void QQuickParticleSystem::registerParticleGroup(QQuickParticleGroup* g) -- cgit v1.2.3