forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user