diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2017-12-05 11:31:01 +0100 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2017-12-05 13:14:04 +0000 |
commit | 034e672509447ad99585b1c72323b8a019c91a4b (patch) | |
tree | f4847c7603c932ed739af9cfbefc86e608c3c222 | |
parent | 2c93654e58b8c9c125e9ab08176acd8cd9009dd8 (diff) | |
download | qt-creator-034e672509447ad99585b1c72323b8a019c91a4b.tar.gz |
QmlDesigner: Add support for timeline items
Change-Id: Ie7e05c78c2d817da9dd91c345f1949daa640c6bc
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
4 files changed, 48 insertions, 1 deletions
diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframes.h index 076b2d8099..32d53a5b00 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 291381fece..8cddecba80 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 0e49e1f27a..8770e78e30 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 07fc0004d2..8266051369 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<double>::max(); |