From b0a8c7066226193a56c6c08dd1caf99367fcd39d Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 15 Jun 2020 17:37:58 +0200 Subject: [PATCH] QmlDesigner: Fix FlowDecision transition Fix the transition for FlowDecision so it will also connect to QmlFlowItemNode directly without the need of a QmlFlowActionAreaNode. Task-number: QDS-2280 Change-Id: I61a5ab234068bcbc0c28ae43c720d7fc22e941b6 Reviewed-by: Thomas Hartmann --- .../components/formeditor/formeditoritem.cpp | 18 +++---- .../designercore/include/qmlitemnode.h | 3 +- .../designercore/model/qmlitemnode.cpp | 52 +++++++++---------- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 227a82530ed..3fc654ce861 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -798,17 +798,17 @@ public: if (f.isValid()) { for (const QmlFlowActionAreaNode &area : f.flowActionAreas()) { ModelNode target = area.targetTransition(); - if (target == node.modelNode()) { + if (target == node.modelNode()) areaNode = area; - } else { - const ModelNode decisionNode = area.decisionNodeForTransition(node.modelNode()); - if (decisionNode.isValid()) { - from.clear(); - from.append(decisionNode); - areaNode = ModelNode(); - } - } } + + const ModelNode decisionNode = QmlFlowItemNode::decisionNodeForTransition(node.modelNode()); + if (decisionNode.isValid()) { + from.clear(); + from.append(decisionNode); + areaNode = ModelNode(); + } + if (f.modelNode().hasAuxiliaryData("joinConnection")) joinConnection = f.modelNode().auxiliaryData("joinConnection").toBool(); } else { diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index d779cc15bf3..f37bae869e6 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -157,7 +157,6 @@ public: void assignTargetFlowItem(const QmlFlowTargetNode &flowItem); QmlFlowItemNode flowItemParent() const; void destroyTarget(); - ModelNode decisionNodeForTransition(const ModelNode &transition) const; }; class QMLDESIGNERCORE_EXPORT QmlFlowItemNode : public QmlItemNode @@ -168,6 +167,8 @@ public: static bool isValidQmlFlowItemNode(const ModelNode &modelNode); QList flowActionAreas() const; QmlFlowViewNode flowView() const; + + static ModelNode decisionNodeForTransition(const ModelNode &transition); }; class QMLDESIGNERCORE_EXPORT QmlFlowViewNode : public QmlItemNode diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index de500197c18..89617f2bc4b 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -559,6 +559,32 @@ QmlFlowViewNode QmlFlowItemNode::flowView() const return QmlFlowViewNode({}); } +ModelNode QmlFlowItemNode::decisionNodeForTransition(const ModelNode &transition) +{ + ModelNode target = transition; + + if (target.isValid() && target.hasMetaInfo() && QmlVisualNode::isFlowTransition(target)) { + + ModelNode finalTarget = target.bindingProperty("to").resolveToModelNode(); + + if (finalTarget.isValid() && finalTarget.hasMetaInfo() && QmlVisualNode::isFlowDecision(finalTarget)) { + if (finalTarget.hasBindingProperty("targets") + && finalTarget.bindingProperty("targets").resolveToModelNodeList().contains(transition)) + return finalTarget; + } + QmlFlowViewNode flowView(transition.view()->rootModelNode()); + if (flowView.isValid()) { + for (const ModelNode target : flowView.decicions()) { + if (target.hasBindingProperty("targets") + && target.bindingProperty("targets").resolveToModelNodeList().contains(transition)) + return target; + } + } + } + + return {}; +} + bool QmlFlowActionAreaNode::isValid() const { return isValidQmlFlowActionAreaNode(modelNode()); @@ -615,32 +641,6 @@ void QmlFlowActionAreaNode::destroyTarget() } } -ModelNode QmlFlowActionAreaNode::decisionNodeForTransition(const ModelNode &transition) const -{ - ModelNode target = targetTransition(); - - if (target.isValid() && target.hasMetaInfo() && QmlVisualNode::isFlowTransition(target)) { - - ModelNode finalTarget = target.bindingProperty("to").resolveToModelNode(); - - if (finalTarget.isValid() && finalTarget.hasMetaInfo() && QmlVisualNode::isFlowDecision(finalTarget)) { - if (finalTarget.hasBindingProperty("targets") - && finalTarget.bindingProperty("targets").resolveToModelNodeList().contains(transition)) - return finalTarget; - } - QmlFlowViewNode flowView(view()->rootModelNode()); - if (flowView.isValid()) { - for (const ModelNode target : flowView.decicions()) { - if (target.hasBindingProperty("targets") - && target.bindingProperty("targets").resolveToModelNodeList().contains(transition)) - return target; - } - } - } - - return {}; -} - bool QmlFlowViewNode::isValid() const { return isValidQmlFlowViewNode(modelNode());