From 8770c8674d7ea46864a541e00fbf2df6d3256aee Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 18:15:48 +0200 Subject: [PATCH] QmlDesigner: Delete animations if target is deleted Task-number: QDS-5221 Change-Id: I98d1a370bf73ef298d3f309d0129b85e2147de6a Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../designercore/model/qmlobjectnode.cpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 72dad6afc68..55305c72d17 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -338,6 +338,48 @@ static void removeStateOperationsForChildren(const QmlObjectNode &node) } } +static void removeAnimationsFromAnimation(const ModelNode &animation) +{ + QTC_ASSERT(animation.isValid(), return); + + const QList propertyAnimations = animation.subModelNodesOfType( + "QtQuick.PropertyAnimation"); + + for (const ModelNode &child : propertyAnimations) { + if (!child.hasBindingProperty("target")) { + ModelNode nonConst = animation; + nonConst.destroy(); + return; + } + } +} + +static void removeAnimationsFromTransition(const ModelNode &transition, const QmlObjectNode &node) +{ + QTC_ASSERT(node.isValid(), return); + QTC_ASSERT(transition.isValid(), return); + + const auto children = transition.directSubModelNodes(); + for (const ModelNode ¶llel : children) + removeAnimationsFromAnimation(parallel); +} + +static void removeDanglingAnimationsFromTransitions(const QmlObjectNode &node) +{ + QTC_ASSERT(node.isValid(), return); + + auto root = node.view()->rootModelNode(); + + if (root.isValid() && root.hasProperty("transitions")) { + NodeAbstractProperty transitions = root.nodeAbstractProperty("transitions"); + if (transitions.isValid()) { + const auto transitionNodes = transitions.directSubNodes(); + for (const auto &transition : transitionNodes) + removeAnimationsFromTransition(transition, node); + } + } +} + static void removeAliasExports(const QmlObjectNode &node) { @@ -416,6 +458,8 @@ void QmlObjectNode::destroy() removeStateOperationsForChildren(modelNode()); deleteAllReferencesToNodeAndChildren(modelNode()); + removeDanglingAnimationsFromTransitions(modelNode()); + QmlFlowViewNode root(view()->rootModelNode()); modelNode().destroy();