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 <thomas.hartmann@qt.io>
This commit is contained in:
Henning Gruendl
2020-06-15 17:37:58 +02:00
committed by Thomas Hartmann
parent 9a0acda2c9
commit b0a8c70662
3 changed files with 37 additions and 36 deletions

View File

@@ -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 {

View File

@@ -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<QmlFlowActionAreaNode> flowActionAreas() const;
QmlFlowViewNode flowView() const;
static ModelNode decisionNodeForTransition(const ModelNode &transition);
};
class QMLDESIGNERCORE_EXPORT QmlFlowViewNode : public QmlItemNode

View File

@@ -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());