QmlDesigner: Remove FlowTransition if to or from targets are removed

Task-number: QDS-9766
Change-Id: I41c5d6769400772aa4b0d8b395b6a7ed79270cbd
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2023-06-01 13:01:19 +02:00
parent ef03466273
commit 1655f1f622
5 changed files with 73 additions and 26 deletions

View File

@@ -105,6 +105,7 @@ public:
NodeMetaInfo flowViewFlowActionAreaMetaInfo() const;
NodeMetaInfo flowViewFlowDecisionMetaInfo() const;
NodeMetaInfo flowViewFlowItemMetaInfo() const;
NodeMetaInfo flowViewFlowTransitionMetaInfo() const;
NodeMetaInfo flowViewFlowWildcardMetaInfo() const;
NodeMetaInfo fontMetaInfo() const;
@@ -127,6 +128,7 @@ public:
NodeMetaInfo qtQuickTextMetaInfo() const;
NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo() const;
NodeMetaInfo qtQuickTimelineTimelineMetaInfo() const;
NodeMetaInfo qtQuickTransistionMetaInfo() const;
NodeMetaInfo vector2dMetaInfo() const;
NodeMetaInfo vector3dMetaInfo() const;
NodeMetaInfo vector4dMetaInfo() const;

View File

@@ -2012,6 +2012,16 @@ NodeMetaInfo Model::flowViewFlowDecisionMetaInfo() const
}
}
NodeMetaInfo Model::flowViewFlowItemMetaInfo() const
{
if constexpr (useProjectStorage()) {
using namespace Storage::Info;
return createNodeMetaInfo<FlowView, FlowItem>();
} else {
return metaInfo("FlowView.FlowItem");
}
}
NodeMetaInfo Model::flowViewFlowWildcardMetaInfo() const
{
if constexpr (useProjectStorage()) {
@@ -2122,6 +2132,16 @@ NodeMetaInfo Model::qtQuickTimelineTimelineMetaInfo() const
}
}
NodeMetaInfo Model::qtQuickTransistionMetaInfo() const
{
if constexpr (useProjectStorage()) {
using namespace Storage::Info;
return createNodeMetaInfo<QtQuick, Transition>();
} else {
return metaInfo("QtQuick.Transition");
}
}
NodeMetaInfo Model::qtQuickConnectionsMetaInfo() const
{
if constexpr (useProjectStorage()) {

View File

@@ -443,36 +443,62 @@ struct DependenciesSet
NodesProperties targetsNodesProperties;
};
template<typename Predicate>
struct TargetFilter
{
TargetFilter(Predicate predicate, NodeDependencies &dependencies)
: predicate{std::move(predicate)}
TargetFilter(NodeDependencies &dependencies, Model *model)
: flowViewFlowActionAreaMetaInfo{model->flowViewFlowActionAreaMetaInfo()}
, flowViewFlowTransitionMetaInfo{model->flowViewFlowTransitionMetaInfo()}
, qtQuickPropertyChangesMetaInfo{model->qtQuickPropertyChangesMetaInfo()}
, qtQuickTimelineKeyframeGroupMetaInfo{model->qtQuickTimelineKeyframeGroupMetaInfo()}
, qtQuickPropertyAnimationMetaInfo{model->qtQuickPropertyAnimationMetaInfo()}
, dependencies{dependencies}
{}
static std::optional<ModelNode> resolveTarget(const ModelNode &node)
static std::optional<ModelNode> resolveBinding(const ModelNode &node,
const PropertyName &propertyName)
{
auto targetProperty = node.bindingProperty("target");
if (targetProperty.exists()) {
if (ModelNode targetNode = targetProperty.resolveToModelNode())
auto property = node.bindingProperty(propertyName);
if (property.exists()) {
if (ModelNode targetNode = property.resolveToModelNode())
return targetNode;
}
return {};
}
bool hasTargetProperty(const NodeMetaInfo &metaInfo) const
{
return metaInfo.isBasedOn(qtQuickPropertyChangesMetaInfo,
qtQuickTimelineKeyframeGroupMetaInfo,
flowViewFlowActionAreaMetaInfo,
qtQuickPropertyAnimationMetaInfo);
}
bool hasToOrFromProperty(const NodeMetaInfo &metaInfo)
{
return metaInfo.isBasedOn(flowViewFlowTransitionMetaInfo);
}
void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node)
{
if (predicate(metaInfo)) {
if (auto targetNode = resolveTarget(node))
if (hasTargetProperty(metaInfo)) {
if (auto targetNode = resolveBinding(node, "target"))
dependencies.push_back({std::move(*targetNode), node});
} else if (hasToOrFromProperty(metaInfo)) {
if (auto toNode = resolveBinding(node, "to"))
dependencies.push_back({std::move(*toNode), node});
if (auto fromNode = resolveBinding(node, "from"))
dependencies.push_back({std::move(*fromNode), node});
}
}
void finally() { std::sort(dependencies.begin(), dependencies.end()); }
Predicate predicate;
NodeMetaInfo flowViewFlowActionAreaMetaInfo;
NodeMetaInfo flowViewFlowTransitionMetaInfo;
NodeMetaInfo qtQuickPropertyChangesMetaInfo;
NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo;
NodeMetaInfo qtQuickPropertyAnimationMetaInfo;
NodeDependencies &dependencies;
};
@@ -597,13 +623,7 @@ DependenciesSet createDependenciesSet(Model *model)
auto qtQuickPropertyAnimationMetaInfo = model->qtQuickPropertyAnimationMetaInfo();
auto filters = std::make_tuple(
TargetFilter{[&](auto &&metaInfo) {
return metaInfo.isBasedOn(qtQuickPropertyChangesMetaInfo,
qtQuickTimelineKeyframeGroupMetaInfo,
flowViewFlowActionAreaMetaInfo,
qtQuickPropertyAnimationMetaInfo);
},
set.nodeDependencies},
TargetFilter{set.nodeDependencies, model},
TargetsFilter{[&](auto &&metaInfo) {
return metaInfo.isBasedOn(flowViewFlowDecisionMetaInfo,
flowViewFlowWildcardMetaInfo,