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 flowViewFlowActionAreaMetaInfo() const;
NodeMetaInfo flowViewFlowDecisionMetaInfo() const; NodeMetaInfo flowViewFlowDecisionMetaInfo() const;
NodeMetaInfo flowViewFlowItemMetaInfo() const;
NodeMetaInfo flowViewFlowTransitionMetaInfo() const; NodeMetaInfo flowViewFlowTransitionMetaInfo() const;
NodeMetaInfo flowViewFlowWildcardMetaInfo() const; NodeMetaInfo flowViewFlowWildcardMetaInfo() const;
NodeMetaInfo fontMetaInfo() const; NodeMetaInfo fontMetaInfo() const;
@@ -127,6 +128,7 @@ public:
NodeMetaInfo qtQuickTextMetaInfo() const; NodeMetaInfo qtQuickTextMetaInfo() const;
NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo() const; NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo() const;
NodeMetaInfo qtQuickTimelineTimelineMetaInfo() const; NodeMetaInfo qtQuickTimelineTimelineMetaInfo() const;
NodeMetaInfo qtQuickTransistionMetaInfo() const;
NodeMetaInfo vector2dMetaInfo() const; NodeMetaInfo vector2dMetaInfo() const;
NodeMetaInfo vector3dMetaInfo() const; NodeMetaInfo vector3dMetaInfo() const;
NodeMetaInfo vector4dMetaInfo() 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 NodeMetaInfo Model::flowViewFlowWildcardMetaInfo() const
{ {
if constexpr (useProjectStorage()) { 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 NodeMetaInfo Model::qtQuickConnectionsMetaInfo() const
{ {
if constexpr (useProjectStorage()) { if constexpr (useProjectStorage()) {

View File

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

View File

@@ -204,6 +204,7 @@ struct TargetData
{ {
QmlDesigner::TypeName targetType; QmlDesigner::TypeName targetType;
QmlDesigner::TypeName type; QmlDesigner::TypeName type;
QmlDesigner::PropertyName propertyName;
// printer function for TargetData - don't remove // printer function for TargetData - don't remove
friend std::ostream &operator<<(std::ostream &os, const TargetData &data) friend std::ostream &operator<<(std::ostream &os, const TargetData &data)
@@ -226,17 +227,20 @@ protected:
ModelNode source2 = createNodeWithParent(parameters.type, ModelNode source2 = createNodeWithParent(parameters.type,
rootNode.defaultNodeListProperty(), rootNode.defaultNodeListProperty(),
"source2"); "source2");
QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty("target"); QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty(parameters.propertyName);
QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty("target"); QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty(
parameters.propertyName);
}; };
INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, INSTANTIATE_TEST_SUITE_P(
ModelResourceManagement,
ForTarget, ForTarget,
testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges"}, testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges", "target"},
TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup"}, TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup", "target"},
TargetData{"FlowView.FlowTransition", TargetData{"FlowView.FlowTransition", "FlowView.FlowActionArea", "target"},
"FlowView.FlowActionArea"}, TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation", "target"},
TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "to"},
TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "from"}));
TEST_P(ForTarget, Remove) TEST_P(ForTarget, Remove)
{ {

View File

@@ -124,6 +124,7 @@ void ProjectStorageMock::setupQtQtuick()
QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId});
QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId});
QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId});
QmlDesigner::createObject(*this, flowViewModuleId, "FlowItem", "data", {qtObjectId, itemId});
} }
void ProjectStorageMock::setupCommonTypeCache() void ProjectStorageMock::setupCommonTypeCache()