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 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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user