diff options
author | Thomas Hartmann <Thomas.Hartmann@qt.io> | 2021-10-05 18:15:48 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2021-10-08 08:07:07 +0000 |
commit | 8770c8674d7ea46864a541e00fbf2df6d3256aee (patch) | |
tree | ec76782937d88635d1c80300f470b349e0342354 | |
parent | df904decd040160ddd1a33b0f2597d094da0d8f2 (diff) |
QmlDesigner: Delete animations if target is deleted
Task-number: QDS-5221
Change-Id: I98d1a370bf73ef298d3f309d0129b85e2147de6a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 72dad6afc6..55305c72d1 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<ModelNode> 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(); |