summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2020-04-09 16:50:19 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2020-04-21 11:00:11 +0000
commit88a76df3d94742eb05734afeb81bc1bd6f8aaace (patch)
tree6e52d00558a38f37698fd469db76a944d7695e15
parent543efebc536c601bf9768c604b8cea356b25cead (diff)
downloadqt-creator-88a76df3d94742eb05734afeb81bc1bd6f8aaace.tar.gz
QmlDesigner: Finish FlowDecision support
Change-Id: Ic4e10fa442ea684890cfb79285760bc38991b494 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlitemnode.h2
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp47
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