aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2019-04-29 16:46:46 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2019-04-30 15:37:43 +0000
commit3314e90cca40b7cbef68f80ea2db2eeb4aeccaee (patch)
treeb288f8f0de53fc59f0f89ceca52e1109bf3b3c9a
parent80bed9cd22f92673d6945941bfac0c312bc7b3ae (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.cpp20
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();
}