aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@qt.io>2021-10-05 18:15:48 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2021-10-08 08:07:07 +0000
commit8770c8674d7ea46864a541e00fbf2df6d3256aee (patch)
treeec76782937d88635d1c80300f470b349e0342354
parentdf904decd040160ddd1a33b0f2597d094da0d8f2 (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.cpp44
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 &parallel : 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();