From 034e672509447ad99585b1c72323b8a019c91a4b Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Dec 2017 11:31:01 +0100 Subject: [PATCH] QmlDesigner: Add support for timeline items Change-Id: Ie7e05c78c2d817da9dd91c345f1949daa640c6bc Reviewed-by: Tim Jenssen --- .../include/qmltimelinekeyframes.h | 4 ++ .../designercore/include/qmltimelinemutator.h | 2 + .../model/qmltimelinekeyframes.cpp | 38 ++++++++++++++++++- .../designercore/model/qmltimelinemutator.cpp | 5 +++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h index 076b2d80995..32d53a5b004 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h @@ -70,6 +70,10 @@ public: void moveAllFrames(qreal offset); void scaleAllFrames(qreal factor); + int getSupposedTargetIndex(qreal newFrame) const; + + int indexOfFrame(const ModelNode &frame) const; + void slideFrame(int sourceIndex, int targetIndex); }; } //QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinemutator.h b/src/plugins/qmldesigner/designercore/include/qmltimelinemutator.h index 291381fece6..8cddecba803 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinemutator.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinemutator.h @@ -54,6 +54,8 @@ public: qreal currentFrame() const; qreal duration() const; + bool isEnabled() const; + qreal minActualFrame(const ModelNode &target) const; qreal maxActualFrame(const ModelNode &target) const; diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframes.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframes.cpp index 0e49e1f27aa..8770e78e306 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframes.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframes.cpp @@ -90,6 +90,35 @@ void QmlTimelineFrames::setPropertyName(const PropertyName &propertyName) modelNode().variantProperty("property").setValue(QString::fromUtf8(propertyName)); } +int QmlTimelineFrames::getSupposedTargetIndex(qreal newFrame) const +{ + const NodeListProperty nodeListProperty = modelNode().defaultNodeListProperty(); + int i = 0; + for (auto node : nodeListProperty.toModelNodeList()) { + if (node.hasVariantProperty("frame")) { + const qreal currentFrame = node.variantProperty("frame").value().toReal(); + if (!qFuzzyCompare(currentFrame, newFrame)) { //Ignore the frame itself + if (currentFrame > newFrame) + return i; + ++i; + } + } + } + + return nodeListProperty.count(); +} + +int QmlTimelineFrames::indexOfFrame(const ModelNode &frame) const +{ + return modelNode().defaultNodeListProperty().indexOf(frame); +} + +void QmlTimelineFrames::slideFrame(int sourceIndex, int targetIndex) +{ + if (targetIndex != sourceIndex) + modelNode().defaultNodeListProperty().slide(sourceIndex, targetIndex); +} + void QmlTimelineFrames::setValue(const QVariant &value, qreal currentFrame) { @@ -104,7 +133,14 @@ void QmlTimelineFrames::setValue(const QVariant &value, qreal currentFrame) {PropertyName("value"), value}}; ModelNode frame = modelNode().view()->createModelNode("QtQuick.Timeline.Keyframe", 1, 0, propertyPairList); - modelNode().defaultNodeListProperty().reparentHere(frame); + NodeListProperty nodeListProperty = modelNode().defaultNodeListProperty(); + + const int sourceIndex = nodeListProperty.count(); + const int targetIndex = getSupposedTargetIndex(currentFrame); + + nodeListProperty.reparentHere(frame); + + slideFrame(sourceIndex, targetIndex); } QVariant QmlTimelineFrames::value(qreal frame) const diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinemutator.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinemutator.cpp index 07fc0004d2b..82660513699 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinemutator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinemutator.cpp @@ -130,6 +130,11 @@ qreal QmlTimelineMutator::duration() const return endFrame() - startFrame(); } +bool QmlTimelineMutator::isEnabled() const +{ + return QmlObjectNode(modelNode()).modelValue("enabled").toBool(); +} + qreal QmlTimelineMutator::minActualFrame(const ModelNode &target) const { qreal min = std::numeric_limits::max();