diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2019-04-29 16:46:46 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2019-04-30 15:37:43 +0000 |
commit | 3314e90cca40b7cbef68f80ea2db2eeb4aeccaee (patch) | |
tree | b288f8f0de53fc59f0f89ceca52e1109bf3b3c9a | |
parent | 80bed9cd22f92673d6945941bfac0c312bc7b3ae (diff) |
Handle vector types properly
The user type for a 'dot' properly will be
the user type of the vector property and conversion will fail.
To fix this we adjust the user property to double.
Also the user property is cached and some warnings were added.
Change-Id: Ic3eb05c5b712eaf2fff272b145ffd47100411e2a
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r-- | src/imports/timeline/qquickkeyframe.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/imports/timeline/qquickkeyframe.cpp b/src/imports/timeline/qquickkeyframe.cpp index e6aeeeb..9ec71b1 100644 --- a/src/imports/timeline/qquickkeyframe.cpp +++ b/src/imports/timeline/qquickkeyframe.cpp @@ -31,6 +31,7 @@ #include "qquicktimeline_p.h" +#include <Qtcore/qdebug.h> #include <QtCore/QVariantAnimation> #include <QtCore/qmath.h> #include <QtGui/qpainter.h> @@ -56,6 +57,7 @@ public: QObject *target; QString propertyName; bool componentComplete; + int userType = -1; protected: void setupKeyframes(); @@ -227,7 +229,7 @@ QVariant QQuickKeyframeGroup::evaluate(qreal frame) const for (auto keyFrame : qAsConst(d->sortedKeyframes)) { if (qFuzzyCompare(frame, keyFrame->frame()) || frame < keyFrame->frame()) - return keyFrame->evaluate(lastFrame, frame, QQmlProperty(target(), property()).property().userType()); + return keyFrame->evaluate(lastFrame, frame, d->userType); lastFrame = keyFrame; } @@ -239,15 +241,25 @@ void QQuickKeyframeGroup::setProperty(qreal frame) if (target()) { QQmlProperty qmlProperty(target(), property()); - qmlProperty.write(evaluate(frame)); + if (!qmlProperty.write(evaluate(frame))) + qWarning() << "Cannot set property" << property(); } } void QQuickKeyframeGroup::init() { Q_D(QQuickKeyframeGroup); - if (target()) + if (target()) { d->originalValue = QQmlProperty::read(target(), property()); + d->userType = QQmlProperty(target(), property()).property().userType(); + if (property().contains(QLatin1Char('.'))) { + if (d->userType == QMetaType::QVector2D + || d->userType == QMetaType::QVector3D + || d->userType == QMetaType::QVector4D + || d->userType == QMetaType::QQuaternion) + d->userType = QMetaType::Double; + } + } } void QQuickKeyframeGroup::resetDefaultValue() @@ -350,7 +362,7 @@ QVariant QQuickKeyframe::evaluate(QQuickKeyframe *pre, qreal frametime, int user if (preValue.isValid() && convertedValue.isValid()) return interpolator(preValue.constData(), convertedValue.constData(), progress); - qWarning() << "invalid keyframe target"; + qWarning() << "invalid keyframe target" << preValue << convertedValue << userType; return QVariant(); } |