From 8f974cd1c533e20684df80bcee8c06a94ee7b868 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 6 Oct 2021 12:56:00 +0200 Subject: [PATCH] QmlDesigner: Implement new functions in QmlObjectNode and QmlTimelineKeyframeGroup * QmlObjectNode::allInvalidStateOperations * QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups These functions make it easy to find dangling/invalid PropertyChanges and KeyFrameGroups. Change-Id: I201a6561a51aba53405e8a8fc92821c467fecb1b Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot --- .../designercore/include/qmlobjectnode.h | 5 ++-- .../designercore/include/qmlstate.h | 1 + .../include/qmltimelinekeyframegroup.h | 3 +++ .../designercore/model/qmlobjectnode.cpp | 10 ++++++++ .../designercore/model/qmlstate.cpp | 7 ++++++ .../model/qmltimelinekeyframegroup.cpp | 23 +++++++++++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index 59f99bbe398..7b1cfbe86e1 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -128,14 +128,13 @@ public: virtual bool isBlocked(const PropertyName &propName) const; friend auto qHash(const QmlObjectNode &node) { return qHash(node.modelNode()); } + QList allDefinedStates() const; + QList allInvalidStateOperations() const; protected: NodeInstance nodeInstance() const; QmlObjectNode nodeForInstance(const NodeInstance &instance) const; QmlItemNode itemForInstance(const NodeInstance &instance) const; - -protected: - QList allDefinedStates() const; }; QMLDESIGNERCORE_EXPORT QList toModelNodeList(const QList &fxObjectNodeList); diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h index bd0aad854ba..ce9a8bf3f74 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlstate.h +++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h @@ -50,6 +50,7 @@ public: QList stateOperations(const ModelNode &node) const; QList propertyChanges() const; QList stateOperations() const; + QList allInvalidStateOperations() const; bool hasPropertyChanges(const ModelNode &node) const; diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h index a20eeae55eb..6aee5ea0d58 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h @@ -72,6 +72,7 @@ public: static bool isValidKeyframe(const ModelNode &node); static bool checkKeyframesType(const ModelNode &node); static QmlTimelineKeyframeGroup keyframeGroupForKeyframe(const ModelNode &node); + static QList allInvalidTimelineKeyframeGroups(AbstractView *view); void moveAllKeyframes(qreal offset); void scaleAllKeyframes(qreal factor); @@ -84,6 +85,8 @@ public: void toogleRecording(bool b) const; QmlTimeline timeline() const; + + bool isDangling() const; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 25f792e9088..72dad6afc68 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -523,6 +523,16 @@ QList QmlObjectNode::allDefinedStates() const return returnList; } +QList QmlObjectNode::allInvalidStateOperations() const +{ + QList result; + + const auto allStates = allDefinedStates(); + for (const auto &state : allStates) + result.append(state.allInvalidStateOperations()); + return result; +} + /*! Removes a variant property of the object specified by \a name from the diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index ea15ba1d819..26fff118d2a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -34,6 +34,7 @@ #include "qmlitemnode.h" #include "annotation.h" +#include #include namespace QmlDesigner { @@ -136,6 +137,12 @@ QList QmlModelState::stateOperations() const return returnList; } +QList QmlModelState::allInvalidStateOperations() const +{ + return Utils::filtered(stateOperations(), [](const QmlModelStateOperation &operation) { + return !operation.target().isValid(); + }); +} /*! Adds a change set for \a node to this state, but only if it does not diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp index ad0855ad955..85eb51de448 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp @@ -153,6 +153,13 @@ QmlTimeline QmlTimelineKeyframeGroup::timeline() const return {}; } +bool QmlTimelineKeyframeGroup::isDangling() const +{ + QTC_ASSERT(isValid(), return false); + + return !target().isValid() || keyframes().isEmpty(); +} + void QmlTimelineKeyframeGroup::setValue(const QVariant &value, qreal currentFrame) { QTC_ASSERT(isValid(), return ); @@ -294,6 +301,22 @@ QmlTimelineKeyframeGroup QmlTimelineKeyframeGroup::keyframeGroupForKeyframe(cons return QmlTimelineKeyframeGroup(); } +QList QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups(AbstractView *view) +{ + QList ret; + + QTC_ASSERT(view, return ret); + QTC_ASSERT(view->model(), return ret); + QTC_ASSERT(view->rootModelNode().isValid(), return ret); + + const auto groups = view->rootModelNode().subModelNodesOfType("QtQuick.Timeline.KeyframeGroup"); + for (const QmlTimelineKeyframeGroup &group : groups) { + if (group.isDangling()) + ret.append(group); + } + return ret; +} + void QmlTimelineKeyframeGroup::moveAllKeyframes(qreal offset) { for (const ModelNode &childNode : modelNode().defaultNodeListProperty().toModelNodeList()) {