From 016fb66c96961bfe32a2a2cbf7fe8d408b8dd65a Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 7 Sep 2022 12:13:53 +0200 Subject: [PATCH] QmlDesigner: Cleanup QmlTimelineKeyframeGroup Many checks are not anymore need so we can just remove the code and make it clean what we want. Use the filtered algorithm to remove some loops. We add Utils::filteredCast to algorithm.h to return a different result container and let it be cast in std::copy_if. Change-Id: I114c17cd2d5a69c9ebbfbd804805c4d2fa0599e1 Reviewed-by: Thomas Hartmann Reviewed-by: Eike Ziller Reviewed-by: --- src/libs/utils/algorithm.h | 11 +++++ .../include/qmltimelinekeyframegroup.h | 1 + .../model/qmltimelinekeyframegroup.cpp | 49 ++++++++----------- 3 files changed, 33 insertions(+), 28 deletions(-) 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)