diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-04-09 16:50:19 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-04-21 11:00:11 +0000 |
commit | 88a76df3d94742eb05734afeb81bc1bd6f8aaace (patch) | |
tree | 6e52d00558a38f37698fd469db76a944d7695e15 /src/plugins | |
parent | 543efebc536c601bf9768c604b8cea356b25cead (diff) | |
download | qt-creator-88a76df3d94742eb05734afeb81bc1bd6f8aaace.tar.gz |
QmlDesigner: Finish FlowDecision support
Change-Id: Ic4e10fa442ea684890cfb79285760bc38991b494
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/qmldesigner/designercore/include/qmlitemnode.h | 2 | ||||
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp | 47 |
2 files changed, 46 insertions, 3 deletions
diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index e3d01fa03e..48e563358d 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -142,6 +142,7 @@ public: void destroyTargets(); ModelNode targetTransition() const; QmlFlowViewNode flowView() const; + ModelNode findSourceForDecisionNode() const; }; class QMLDESIGNERCORE_EXPORT QmlFlowActionAreaNode : public QmlItemNode @@ -178,6 +179,7 @@ public: const QList<ModelNode> transitions() const; const QList<ModelNode> wildcards() const; const QList<ModelNode> decicions() const; + QList<ModelNode> transitionsForTarget(const ModelNode &modelNode); }; diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index d9379d7f06..3f7b22e59f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -704,6 +704,17 @@ const QList<ModelNode> QmlFlowViewNode::decicions() const return {}; } +QList<ModelNode> QmlFlowViewNode::transitionsForTarget(const ModelNode &modelNode) +{ + QList<ModelNode> list; + for (const ModelNode &transition : transitions()) { + if (transition.hasBindingProperty("to") + && transition.bindingProperty("to").resolveToModelNode() == modelNode) + list.append(transition); + } + return list; +} + bool QmlFlowTargetNode::isValid() const { return QmlItemNode(modelNode()).isFlowItem() @@ -723,12 +734,21 @@ void QmlFlowTargetNode::assignTargetItem(const QmlFlowTargetNode &node) modelNode().bindingProperty("target").setExpression(transition.validId()); } else if (isFlowDecision()) { destroyTargets(); + ModelNode sourceNode = modelNode(); + + if (!QmlVisualNode::isFlowDecision(sourceNode)) + sourceNode = findSourceForDecisionNode(); + + if (sourceNode.isValid()) { + ModelNode transition = flowView().addTransition(sourceNode, + node); + modelNode().bindingProperty("targets").addModelNodeToArray(transition); + } } } void QmlFlowTargetNode::destroyTargets() { - QTC_ASSERT(isValid(), return); if (targetTransition().isValid()) { @@ -737,8 +757,9 @@ void QmlFlowTargetNode::destroyTargets() } if (hasBindingProperty("targets")) { - for (ModelNode &node : modelNode().bindingProperty("targets").resolveToModelNodeList()) - QmlItemNode(node).destroy(); + for (ModelNode &node : modelNode().bindingProperty("targets").resolveToModelNodeList()) { + QmlObjectNode(node).destroy(); + } modelNode().removeProperty("targets"); } @@ -757,4 +778,24 @@ QmlFlowViewNode QmlFlowTargetNode::flowView() const return view()->rootModelNode(); } +ModelNode QmlFlowTargetNode::findSourceForDecisionNode() const +{ + if (!isFlowDecision()) + return {}; + + for (const ModelNode transition : flowView().transitionsForTarget(modelNode())) { + if (transition.hasBindingProperty("from")) { + const ModelNode source = transition.bindingProperty("from").resolveToModelNode(); + if (source.isValid()) { + if (QmlVisualNode::isFlowDecision(source)) + return QmlFlowTargetNode(source).findSourceForDecisionNode(); + else if (QmlItemNode(source).isFlowItem()) + return source; + } + } + } + + return {}; +} + } //QmlDesigner |