aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp63
1 files changed, 60 insertions, 3 deletions
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 663adcf3e1..3491aa85a0 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -533,9 +533,66 @@ void Qt5InformationNodeInstanceServer::handleParticleSystemSelected(QQuick3DPart
}
});
- const auto anim = animations();
- for (auto a : anim)
- a->restart();
+ if (m_targetParticleSystem) {
+ auto checkAncestor = [](QObject *checkObj, QObject *ancestor) -> bool {
+ QObject *parent = checkObj->parent();
+ while (parent) {
+ if (parent == ancestor)
+ return true;
+ parent = parent->parent();
+ }
+ return false;
+ };
+ auto isAnimContainer = [](QObject *o) -> bool {
+ return ServerNodeInstance::isSubclassOf(o, "QQuickParallelAnimation")
+ || ServerNodeInstance::isSubclassOf(o, "QQuickSequentialAnimation");
+ };
+
+ const QVector<QQuickAbstractAnimation *> anims = animations();
+ QSet<QQuickAbstractAnimation *> containers;
+ for (auto a : anims) {
+ // Stop all animations by default. We only want to run animations related to currently
+ // active particle system and nothing else.
+ a->stop();
+
+ // Timeline animations are controlled by timeline controls, so exclude those
+ if (ServerNodeInstance::isSubclassOf(a, "QQuickTimelineAnimation"))
+ continue;
+
+ if (ServerNodeInstance::isSubclassOf(a, "QQuickPropertyAnimation")
+ || ServerNodeInstance::isSubclassOf(a, "QQuickPropertyAction")) {
+ QObject *target = a->property("target").value<QObject *>();
+ if (target != m_targetParticleSystem
+ && !checkAncestor(target, m_targetParticleSystem)
+ && !checkAncestor(m_targetParticleSystem, target)) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+
+ QObject *animParent = a->parent();
+ bool isContained = isAnimContainer(animParent);
+ if (isContained) {
+ // We only want to start the toplevel container animations
+ while (isContained) {
+ if (isAnimContainer(animParent->parent())) {
+ animParent = animParent->parent();
+ isContained = true;
+ } else {
+ containers.insert(qobject_cast<QQuickAbstractAnimation *>(animParent));
+ isContained = false;
+ }
+ }
+ } else {
+ a->restart();
+ }
+ }
+
+ // Activate necessary container animations
+ for (auto container : std::as_const(containers))
+ container->restart();
+ }
}
static QString baseProperty(const QString &property)