From 1655f1f6225759d3538c1a08e4b074a7cb366a45 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 1 Jun 2023 13:01:19 +0200 Subject: [PATCH] QmlDesigner: Remove FlowTransition if to or from targets are removed Task-number: QDS-9766 Change-Id: I41c5d6769400772aa4b0d8b395b6a7ed79270cbd Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/include/model.h | 2 + .../qmldesigner/designercore/model/model.cpp | 20 +++++++ .../model/modelresourcemanagement.cpp | 54 +++++++++++++------ .../unittest/modelresourcemanagement-test.cpp | 22 ++++---- tests/unit/unittest/projectstoragemock.cpp | 1 + 5 files changed, 73 insertions(+), 26 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index e9a8ec3caa1..63126b4de06 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -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; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8b139363b15..8e3029f4c9c 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -2012,6 +2012,16 @@ NodeMetaInfo Model::flowViewFlowDecisionMetaInfo() const } } +NodeMetaInfo Model::flowViewFlowItemMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } 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(); + } else { + return metaInfo("QtQuick.Transition"); + } +} + NodeMetaInfo Model::qtQuickConnectionsMetaInfo() const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp index a40e47e9d6e..cf2152baff5 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp @@ -443,36 +443,62 @@ struct DependenciesSet NodesProperties targetsNodesProperties; }; -template 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 resolveTarget(const ModelNode &node) + static std::optional 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, diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp index 38cc5d8c797..620ae9a4a1d 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -204,6 +204,7 @@ struct TargetData { QmlDesigner::TypeName targetType; QmlDesigner::TypeName type; + QmlDesigner::PropertyName propertyName; // printer function for TargetData - don't remove friend std::ostream &operator<<(std::ostream &os, const TargetData &data) @@ -226,17 +227,20 @@ protected: ModelNode source2 = createNodeWithParent(parameters.type, rootNode.defaultNodeListProperty(), "source2"); - QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty("target"); - QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty("target"); + QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty(parameters.propertyName); + QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty( + parameters.propertyName); }; -INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, - ForTarget, - testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges"}, - TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup"}, - TargetData{"FlowView.FlowTransition", - "FlowView.FlowActionArea"}, - TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); +INSTANTIATE_TEST_SUITE_P( + ModelResourceManagement, + ForTarget, + testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges", "target"}, + TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup", "target"}, + TargetData{"FlowView.FlowTransition", "FlowView.FlowActionArea", "target"}, + TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation", "target"}, + TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "to"}, + TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "from"})); TEST_P(ForTarget, Remove) { diff --git a/tests/unit/unittest/projectstoragemock.cpp b/tests/unit/unittest/projectstoragemock.cpp index e939c8984e8..71d789d0d95 100644 --- a/tests/unit/unittest/projectstoragemock.cpp +++ b/tests/unit/unittest/projectstoragemock.cpp @@ -124,6 +124,7 @@ void ProjectStorageMock::setupQtQtuick() QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId}); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowItem", "data", {qtObjectId, itemId}); } void ProjectStorageMock::setupCommonTypeCache()