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();