diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index dd914103ee9..713be758286 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -890,6 +890,17 @@ C filtered(const C &container, R (S::*predicate)() const) return out; } +////////////////// +// filteredCast +///////////////// +template +Q_REQUIRED_RESULT R filteredCast(const C &container, F predicate) +{ + R out; + std::copy_if(std::begin(container), std::end(container), inserter(out), predicate); + return out; +} + ////////////////// // partition ///////////////// diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h index fb772eefaf4..f995f0247ef 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h @@ -65,6 +65,7 @@ public: QmlTimeline timeline() const; + static bool isDangling(const ModelNode &node); bool isDangling() const; }; diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp index 063553fceb3..0194baa0a41 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -42,10 +43,7 @@ void QmlTimelineKeyframeGroup::destroy() ModelNode QmlTimelineKeyframeGroup::target() const { - if (modelNode().property("target").isBindingProperty()) - return modelNode().bindingProperty("target").resolveToModelNode(); - - return {}; + return modelNode().bindingProperty("target").resolveToModelNode(); } void QmlTimelineKeyframeGroup::setTarget(const ModelNode &target) @@ -123,17 +121,17 @@ QmlTimeline QmlTimelineKeyframeGroup::timeline() const { QTC_CHECK(isValid()); - if (modelNode().hasParentProperty()) - return modelNode().parentProperty().parentModelNode(); + return modelNode().parentProperty().parentModelNode(); +} - return {}; +bool QmlTimelineKeyframeGroup::isDangling(const ModelNode &node) +{ + QmlTimelineKeyframeGroup group{node}; + return group.isDangling(); } bool QmlTimelineKeyframeGroup::isDangling() const { - if (!isValid()) - return false; - return !target().isValid() || keyframes().isEmpty(); } @@ -247,14 +245,9 @@ QList QmlTimelineKeyframeGroup::keyframes() const QList QmlTimelineKeyframeGroup::keyframePositions() const { - QList returnValues; - for (const ModelNode &childNode : modelNode().defaultNodeListProperty().toModelNodeList()) { - QVariant value = childNode.variantProperty("frame").value(); - if (value.isValid()) - returnValues.append(childNode); - } - - return returnValues; + return Utils::filtered(modelNode().defaultNodeListProperty().toModelNodeList(), [](auto &&node) { + return node.variantProperty("frame").value().isValid(); + }); } bool QmlTimelineKeyframeGroup::isValidKeyframe(const ModelNode &node) @@ -278,21 +271,21 @@ QmlTimelineKeyframeGroup QmlTimelineKeyframeGroup::keyframeGroupForKeyframe(cons return QmlTimelineKeyframeGroup(); } -QList QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups(AbstractView *view) +QList QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups( + AbstractView *view) { - QList ret; + QTC_CHECK(view); + QTC_CHECK(view->model()); - QTC_ASSERT(view, return ret); - QTC_ASSERT(view->model(), return ret); - QTC_ASSERT(view->rootModelNode().isValid(), return ret); + if (!view || !view->model()) + return {}; const auto groups = view->rootModelNode().subModelNodesOfType( view->model()->qtQuickTimelineKeyframeGroupMetaInfo()); - for (const QmlTimelineKeyframeGroup group : groups) { - if (group.isDangling()) - ret.append(group); - } - return ret; + + return Utils::filteredCast>(groups, [](auto &&group) { + return isDangling(group); + }); } void QmlTimelineKeyframeGroup::moveAllKeyframes(qreal offset)