diff options
-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(); |