summaryrefslogtreecommitdiff
path: root/src/declarative/util/qmlanimation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/util/qmlanimation.cpp')
-rw-r--r--src/declarative/util/qmlanimation.cpp2369
1 files changed, 0 insertions, 2369 deletions
diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp
deleted file mode 100644
index cd1458cdfb..0000000000
--- a/src/declarative/util/qmlanimation.cpp
+++ /dev/null
@@ -1,2369 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmlanimation_p.h"
-#include "qmlanimation_p_p.h"
-
-#include "qmlbehavior_p.h"
-#include "qmlstateoperations_p.h"
-
-#include <qmlpropertyvaluesource.h>
-#include <qml.h>
-#include <qmlinfo.h>
-#include <qmlexpression.h>
-#include <qmlstringconverters_p.h>
-#include <qmlglobal_p.h>
-
-#include <qvariant.h>
-#include <qcolor.h>
-#include <qfile.h>
-#include <QParallelAnimationGroup>
-#include <QSequentialAnimationGroup>
-#include <QtCore/qset.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qsize.h>
-
-#include <private/qvariantanimation_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmlclass Animation QmlAbstractAnimation
- \since 4.7
- \brief The Animation element is the base of all QML animations.
-
- The Animation element cannot be used directly in a QML file. It exists
- to provide a set of common properties and methods, available across all the
- other animation types that inherit from it. Attempting to use the Animation
- element directly will result in an error.
-*/
-
-/*!
- \class QmlAbstractAnimation
- \internal
-*/
-
-QmlAbstractAnimation::QmlAbstractAnimation(QObject *parent)
-: QObject(*(new QmlAbstractAnimationPrivate), parent)
-{
-}
-
-QmlAbstractAnimation::~QmlAbstractAnimation()
-{
-}
-
-QmlAbstractAnimation::QmlAbstractAnimation(QmlAbstractAnimationPrivate &dd, QObject *parent)
-: QObject(dd, parent)
-{
-}
-
-/*!
- \qmlproperty bool Animation::running
- This property holds whether the animation is currently running.
-
- The \c running property can be set to declaratively control whether or not
- an animation is running. The following example will animate a rectangle
- whenever the \l MouseArea is pressed.
-
- \code
- Rectangle {
- width: 100; height: 100
- x: NumberAnimation {
- running: myMouse.pressed
- from: 0; to: 100
- }
- MouseArea { id: myMouse }
- }
- \endcode
-
- Likewise, the \c running property can be read to determine if the animation
- is running. In the following example the text element will indicate whether
- or not the animation is running.
-
- \code
- NumberAnimation { id: myAnimation }
- Text { text: myAnimation.running ? "Animation is running" : "Animation is not running" }
- \endcode
-
- Animations can also be started and stopped imperatively from JavaScript
- using the \c start() and \c stop() methods.
-
- By default, animations are not running. Though, when the animations are assigned to properties,
- as property value sources, they are set to running by default.
-*/
-bool QmlAbstractAnimation::isRunning() const
-{
- Q_D(const QmlAbstractAnimation);
- return d->running;
-}
-
-//commence is called to start an animation when it is used as a
-//simple animation, and not as part of a transition
-void QmlAbstractAnimationPrivate::commence()
-{
- Q_Q(QmlAbstractAnimation);
-
- QmlStateActions actions;
- QmlMetaProperties properties;
- q->transition(actions, properties, QmlAbstractAnimation::Forward);
-
- q->qtAnimation()->start();
- if (q->qtAnimation()->state() != QAbstractAnimation::Running) {
- running = false;
- emit q->completed();
- }
-}
-
-QmlMetaProperty QmlAbstractAnimationPrivate::createProperty(QObject *obj, const QString &str, QObject *infoObj)
-{
- QmlMetaProperty prop = QmlMetaProperty::createProperty(obj, str, qmlContext(infoObj));
- if (!prop.isValid()) {
- qmlInfo(infoObj) << QmlAbstractAnimation::tr("Cannot animate non-existent property \"%1\"").arg(str);
- return QmlMetaProperty();
- } else if (!prop.isWritable()) {
- qmlInfo(infoObj) << QmlAbstractAnimation::tr("Cannot animate read-only property \"%1\"").arg(str);
- return QmlMetaProperty();
- }
- return prop;
-}
-
-void QmlAbstractAnimation::setRunning(bool r)
-{
- Q_D(QmlAbstractAnimation);
- if (!d->componentComplete) {
- d->running = r;
- if (r == false)
- d->avoidPropertyValueSourceStart = true;
- return;
- }
-
- if (d->running == r)
- return;
-
- if (d->group || d->disableUserControl) {
- qWarning("QmlAbstractAnimation: setRunning() cannot be used on non-root animation nodes");
- return;
- }
-
- d->running = r;
- if (d->running) {
- if (d->alwaysRunToEnd && d->repeat
- && qtAnimation()->state() == QAbstractAnimation::Running) {
- qtAnimation()->setLoopCount(-1);
- }
-
- if (!d->connectedTimeLine) {
- QObject::connect(qtAnimation(), SIGNAL(finished()),
- this, SLOT(timelineComplete()));
- d->connectedTimeLine = true;
- }
- d->commence();
- emit started();
- } else {
- if (d->alwaysRunToEnd) {
- if (d->repeat)
- qtAnimation()->setLoopCount(qtAnimation()->currentLoop()+1);
- } else
- qtAnimation()->stop();
-
- emit completed();
- }
-
- emit runningChanged(d->running);
-}
-
-/*!
- \qmlproperty bool Animation::paused
- This property holds whether the animation is currently paused.
-
- The \c paused property can be set to declaratively control whether or not
- an animation is paused.
-
- Animations can also be paused and resumed imperatively from JavaScript
- using the \c pause() and \c resume() methods.
-
- By default, animations are not paused.
-*/
-bool QmlAbstractAnimation::isPaused() const
-{
- Q_D(const QmlAbstractAnimation);
- return d->paused;
-}
-
-void QmlAbstractAnimation::setPaused(bool p)
-{
- Q_D(QmlAbstractAnimation);
- if (d->paused == p)
- return;
-
- if (d->group || d->disableUserControl) {
- qWarning("QmlAbstractAnimation: setPaused() cannot be used on non-root animation nodes");
- return;
- }
-
- d->paused = p;
- if (d->paused)
- qtAnimation()->pause();
- else
- qtAnimation()->resume();
-
- emit pausedChanged(d->paused);
-}
-
-void QmlAbstractAnimation::classBegin()
-{
- Q_D(QmlAbstractAnimation);
- d->componentComplete = false;
-}
-
-void QmlAbstractAnimation::componentComplete()
-{
- Q_D(QmlAbstractAnimation);
- d->componentComplete = true;
- if (d->running) {
- d->running = false;
- setRunning(true);
- }
-}
-
-/*!
- \qmlproperty bool Animation::alwaysRunToEnd
- This property holds whether the animation should run to completion when it is stopped.
-
- If this true the animation will complete its current iteration when it
- is stopped - either by setting the \c running property to false, or by
- calling the \c stop() method. The \c complete() method is not effected
- by this value.
-
- This behavior is most useful when the \c repeat property is set, as the
- animation will finish playing normally but not restart.
-
- By default, the alwaysRunToEnd property is not set.
-*/
-bool QmlAbstractAnimation::alwaysRunToEnd() const
-{
- Q_D(const QmlAbstractAnimation);
- return d->alwaysRunToEnd;
-}
-
-void QmlAbstractAnimation::setAlwaysRunToEnd(bool f)
-{
- Q_D(QmlAbstractAnimation);
- if (d->alwaysRunToEnd == f)
- return;
-
- d->alwaysRunToEnd = f;
- emit alwaysRunToEndChanged(f);
-}
-
-/*!
- \qmlproperty bool Animation::repeat
- This property holds whether the animation should repeat.
-
- If set, the animation will continuously repeat until it is explicitly
- stopped - either by setting the \c running property to false, or by calling
- the \c stop() method.
-
- In the following example, the rectangle will spin indefinately.
-
- \code
- Rectangle {
- rotation: NumberAnimation { running: true; repeat: true; from: 0 to: 360 }
- }
- \endcode
-*/
-bool QmlAbstractAnimation::repeat() const
-{
- Q_D(const QmlAbstractAnimation);
- return d->repeat;
-}
-
-void QmlAbstractAnimation::setRepeat(bool r)
-{
- Q_D(QmlAbstractAnimation);
- if (r == d->repeat)
- return;
-
- d->repeat = r;
- int lc = r ? -1 : 1;
- qtAnimation()->setLoopCount(lc);
- emit repeatChanged(r);
-}
-
-int QmlAbstractAnimation::currentTime()
-{
- return qtAnimation()->currentLoopTime();
-}
-
-void QmlAbstractAnimation::setCurrentTime(int time)
-{
- qtAnimation()->setCurrentTime(time);
-}
-
-QmlAnimationGroup *QmlAbstractAnimation::group() const
-{
- Q_D(const QmlAbstractAnimation);
- return d->group;
-}
-
-void QmlAbstractAnimation::setGroup(QmlAnimationGroup *g)
-{
- Q_D(QmlAbstractAnimation);
- if (d->group == g)
- return;
- if (d->group)
- static_cast<QmlAnimationGroupPrivate *>(d->group->d_func())->animations.removeAll(this);
-
- d->group = g;
-
- if (d->group && !static_cast<QmlAnimationGroupPrivate *>(d->group->d_func())->animations.contains(this))
- static_cast<QmlAnimationGroupPrivate *>(d->group->d_func())->animations.append(this);
-
- if (d->group)
- ((QAnimationGroup*)d->group->qtAnimation())->addAnimation(qtAnimation());
-
- //if (g) //if removed from a group, then the group should no longer be the parent
- setParent(g);
-}
-
-/*!
- \qmlmethod Animation::start()
- \brief Starts the animation.
-
- If the animation is already running, calling this method has no effect. The
- \c running property will be true following a call to \c start().
-*/
-void QmlAbstractAnimation::start()
-{
- setRunning(true);
-}
-
-/*!
- \qmlmethod Animation::pause()
- \brief Pauses the animation.
-
- If the animation is already paused, calling this method has no effect. The
- \c paused property will be true following a call to \c pause().
-*/
-void QmlAbstractAnimation::pause()
-{
- setPaused(true);
-}
-
-/*!
- \qmlmethod Animation::resume()
- \brief Resumes a paused animation.
-
- If the animation is not paused, calling this method has no effect. The
- \c paused property will be false following a call to \c resume().
-*/
-void QmlAbstractAnimation::resume()
-{
- setPaused(false);
-}
-
-/*!
- \qmlmethod Animation::stop()
- \brief Stops the animation.
-
- If the animation is not running, calling this method has no effect. The
- \c running property will be false following a call to \c stop().
-
- Normally \c stop() stops the animation immediately, and the animation has
- no further influence on property values. In this example animation
- \code
- Rectangle {
- x: NumberAnimation { from: 0; to: 100; duration: 500 }
- }
- \endcode
- was stopped at time 250ms, the \c x property will have a value of 50.
-
- However, if the \c alwaysRunToEnd property is set, the animation will
- continue running until it completes and then stop. The \c running property
- will still become false immediately.
-*/
-void QmlAbstractAnimation::stop()
-{
- setRunning(false);
-}
-
-/*!
- \qmlmethod Animation::restart()
- \brief Restarts the animation.
-
- This is a convenience method, and is equivalent to calling \c stop() and
- then \c start().
-*/
-void QmlAbstractAnimation::restart()
-{
- stop();
- start();
-}
-
-/*!
- \qmlmethod Animation::complete()
- \brief Stops the animation, jumping to the final property values.
-
- If the animation is not running, calling this method has no effect. The
- \c running property will be false following a call to \c complete().
-
- Unlike \c stop(), \c complete() immediately fast-forwards the animation to
- its end. In the following example,
- \code
- Rectangle {
- x: NumberAnimation { from: 0; to: 100; duration: 500 }
- }
- \endcode
- calling \c stop() at time 250ms will result in the \c x property having
- a value of 50, while calling \c complete() will set the \c x property to
- 100, exactly as though the animation had played the whole way through.
-*/
-void QmlAbstractAnimation::complete()
-{
- if (isRunning()) {
- qtAnimation()->setCurrentTime(qtAnimation()->duration());
- }
-}
-
-void QmlAbstractAnimation::setTarget(const QmlMetaProperty &p)
-{
- Q_D(QmlAbstractAnimation);
- d->defaultProperty = p;
-
- if (!d->avoidPropertyValueSourceStart)
- setRunning(true);
-}
-
-/*
- we rely on setTarget only being called when used as a value source
- so this function allows us to do the same thing as setTarget without
- that assumption
-*/
-void QmlAbstractAnimation::setDefaultTarget(const QmlMetaProperty &p)
-{
- Q_D(QmlAbstractAnimation);
- d->defaultProperty = p;
-}
-
-/*
- don't allow start/stop/pause/resume to be manually invoked,
- because something else (like a Behavior) already has control
- over the animation.
-*/
-void QmlAbstractAnimation::setDisableUserControl()
-{
- Q_D(QmlAbstractAnimation);
- d->disableUserControl = true;
-}
-
-void QmlAbstractAnimation::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_UNUSED(actions);
- Q_UNUSED(modified);
- Q_UNUSED(direction);
-}
-
-void QmlAbstractAnimation::timelineComplete()
-{
- Q_D(QmlAbstractAnimation);
- setRunning(false);
- if (d->alwaysRunToEnd && d->repeat) {
- qtAnimation()->setLoopCount(-1);
- }
-}
-
-/*!
- \qmlclass PauseAnimation QmlPauseAnimation
- \since 4.7
- \inherits Animation
- \brief The PauseAnimation element provides a pause for an animation.
-
- When used in a SequentialAnimation, PauseAnimation is a step when
- nothing happens, for a specified duration.
-
- A 500ms animation sequence, with a 100ms pause between two animations:
- \code
- SequentialAnimation {
- NumberAnimation { ... duration: 200 }
- PauseAnimation { duration: 100 }
- NumberAnimation { ... duration: 200 }
- }
- \endcode
-*/
-/*!
- \internal
- \class QmlPauseAnimation
-*/
-
-
-QmlPauseAnimation::QmlPauseAnimation(QObject *parent)
-: QmlAbstractAnimation(*(new QmlPauseAnimationPrivate), parent)
-{
- Q_D(QmlPauseAnimation);
- d->init();
-}
-
-QmlPauseAnimation::~QmlPauseAnimation()
-{
-}
-
-void QmlPauseAnimationPrivate::init()
-{
- Q_Q(QmlPauseAnimation);
- pa = new QPauseAnimation;
- QmlGraphics_setParent_noEvent(pa, q);
-}
-
-/*!
- \qmlproperty int PauseAnimation::duration
- This property holds the duration of the pause in milliseconds
-
- The default value is 250.
-*/
-int QmlPauseAnimation::duration() const
-{
- Q_D(const QmlPauseAnimation);
- return d->pa->duration();
-}
-
-void QmlPauseAnimation::setDuration(int duration)
-{
- if (duration < 0) {
- qmlInfo(this) << tr("Cannot set a duration of < 0");
- return;
- }
-
- Q_D(QmlPauseAnimation);
- if (d->pa->duration() == duration)
- return;
- d->pa->setDuration(duration);
- emit durationChanged(duration);
-}
-
-QAbstractAnimation *QmlPauseAnimation::qtAnimation()
-{
- Q_D(QmlPauseAnimation);
- return d->pa;
-}
-
-/*!
- \qmlclass ColorAnimation QmlColorAnimation
- \since 4.7
- \inherits PropertyAnimation
- \brief The ColorAnimation element allows you to animate color changes.
-
- \code
- ColorAnimation { from: "white"; to: "#c0c0c0"; duration: 100 }
- \endcode
-
- When used in a transition, ColorAnimation will by default animate
- all properties of type color that are changing. If a property or properties
- are explicitly set for the animation, then those will be used instead.
-*/
-/*!
- \internal
- \class QmlColorAnimation
-*/
-
-QmlColorAnimation::QmlColorAnimation(QObject *parent)
-: QmlPropertyAnimation(parent)
-{
- Q_D(QmlPropertyAnimation);
- d->interpolatorType = QMetaType::QColor;
- d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
- d->defaultToInterpolatorType = true;
-}
-
-QmlColorAnimation::~QmlColorAnimation()
-{
-}
-
-/*!
- \qmlproperty color ColorAnimation::from
- This property holds the starting color.
-*/
-QColor QmlColorAnimation::from() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->from.value<QColor>();
-}
-
-void QmlColorAnimation::setFrom(const QColor &f)
-{
- QmlPropertyAnimation::setFrom(f);
-}
-
-/*!
- \qmlproperty color ColorAnimation::to
- This property holds the ending color.
-*/
-QColor QmlColorAnimation::to() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->to.value<QColor>();
-}
-
-void QmlColorAnimation::setTo(const QColor &t)
-{
- QmlPropertyAnimation::setTo(t);
-}
-
-
-
-/*!
- \qmlclass ScriptAction QmlScriptAction
- \since 4.7
- \inherits Animation
- \brief The ScriptAction element allows scripts to be run during an animation.
-
-*/
-/*!
- \internal
- \class QmlScriptAction
-*/
-QmlScriptAction::QmlScriptAction(QObject *parent)
- :QmlAbstractAnimation(*(new QmlScriptActionPrivate), parent)
-{
- Q_D(QmlScriptAction);
- d->init();
-}
-
-QmlScriptAction::~QmlScriptAction()
-{
-}
-
-void QmlScriptActionPrivate::init()
-{
- Q_Q(QmlScriptAction);
- rsa = new QActionAnimation(&proxy);
- QmlGraphics_setParent_noEvent(rsa, q);
-}
-
-/*!
- \qmlproperty script ScriptAction::script
- This property holds the script to run.
-*/
-QmlScriptString QmlScriptAction::script() const
-{
- Q_D(const QmlScriptAction);
- return d->script;
-}
-
-void QmlScriptAction::setScript(const QmlScriptString &script)
-{
- Q_D(QmlScriptAction);
- d->script = script;
-}
-
-/*!
- \qmlproperty QString ScriptAction::stateChangeScriptName
- This property holds the the name of the StateChangeScript to run.
-
- This property is only valid when ScriptAction is used as part of a transition.
- If both script and stateChangeScriptName are set, stateChangeScriptName will be used.
-*/
-QString QmlScriptAction::stateChangeScriptName() const
-{
- Q_D(const QmlScriptAction);
- return d->name;
-}
-
-void QmlScriptAction::setStateChangeScriptName(const QString &name)
-{
- Q_D(QmlScriptAction);
- d->name = name;
-}
-
-void QmlScriptActionPrivate::execute()
-{
- QmlScriptString scriptStr = hasRunScriptScript ? runScriptScript : script;
-
- const QString &str = scriptStr.script();
- if (!str.isEmpty()) {
- QmlExpression expr(scriptStr.context(), str, scriptStr.scopeObject());
- expr.value();
- }
-}
-
-void QmlScriptAction::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlScriptAction);
- Q_UNUSED(modified);
- Q_UNUSED(direction);
-
- d->hasRunScriptScript = false;
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
-
- if (action.event && action.event->typeName() == QLatin1String("StateChangeScript")
- && static_cast<QmlStateChangeScript*>(action.event)->name() == d->name) {
- //### how should we handle reverse direction?
- d->runScriptScript = static_cast<QmlStateChangeScript*>(action.event)->script();
- d->hasRunScriptScript = true;
- action.actionDone = true;
- break; //assumes names are unique
- }
- }
-}
-
-QAbstractAnimation *QmlScriptAction::qtAnimation()
-{
- Q_D(QmlScriptAction);
- return d->rsa;
-}
-
-
-
-/*!
- \qmlclass PropertyAction QmlPropertyAction
- \since 4.7
- \inherits Animation
- \brief The PropertyAction element allows immediate property changes during animation.
-
- Explicitly set \c theimage.smooth=true during a transition:
- \code
- PropertyAction { target: theimage; property: "smooth"; value: true }
- \endcode
-
- Set \c thewebview.url to the value set for the destination state:
- \code
- PropertyAction { target: thewebview; property: "url" }
- \endcode
-
- The PropertyAction is immediate -
- the target property is not animated to the selected value in any way.
-*/
-/*!
- \internal
- \class QmlPropertyAction
-*/
-QmlPropertyAction::QmlPropertyAction(QObject *parent)
-: QmlAbstractAnimation(*(new QmlPropertyActionPrivate), parent)
-{
- Q_D(QmlPropertyAction);
- d->init();
-}
-
-QmlPropertyAction::~QmlPropertyAction()
-{
-}
-
-void QmlPropertyActionPrivate::init()
-{
- Q_Q(QmlPropertyAction);
- spa = new QActionAnimation;
- QmlGraphics_setParent_noEvent(spa, q);
-}
-
-/*!
- \qmlproperty Object PropertyAction::target
- This property holds an explicit target object to animate.
-
- The exact effect of the \c target property depends on how the animation
- is being used. Refer to the \l animation documentation for details.
-*/
-
-QObject *QmlPropertyAction::target() const
-{
- Q_D(const QmlPropertyAction);
- return d->target;
-}
-
-void QmlPropertyAction::setTarget(QObject *o)
-{
- Q_D(QmlPropertyAction);
- if (d->target == o)
- return;
- d->target = o;
- emit targetChanged(d->target, d->propertyName);
-}
-
-QString QmlPropertyAction::property() const
-{
- Q_D(const QmlPropertyAction);
- return d->propertyName;
-}
-
-void QmlPropertyAction::setProperty(const QString &n)
-{
- Q_D(QmlPropertyAction);
- if (d->propertyName == n)
- return;
- d->propertyName = n;
- emit targetChanged(d->target, d->propertyName);
-}
-
-/*!
- \qmlproperty string PropertyAction::property
- \qmlproperty string PropertyAction::properties
- \qmlproperty Object PropertyAction::target
- \qmlproperty list<Object> PropertyAction::targets
-
- These properties are used as a set to determine which properties should be
- affected by this action.
-
- The details of how these properties are interpreted in different situations
- is covered in the \l{PropertyAnimation::properties}{corresponding} PropertyAnimation
- documentation.
-
- \sa exclude
-*/
-QString QmlPropertyAction::properties() const
-{
- Q_D(const QmlPropertyAction);
- return d->properties;
-}
-
-void QmlPropertyAction::setProperties(const QString &p)
-{
- Q_D(QmlPropertyAction);
- if (d->properties == p)
- return;
- d->properties = p;
- emit propertiesChanged(p);
-}
-
-QmlListProperty<QObject> QmlPropertyAction::targets()
-{
- Q_D(QmlPropertyAction);
- return QmlListProperty<QObject>(this, d->targets);
-}
-
-/*!
- \qmlproperty list<Object> PropertyAction::exclude
- This property holds the objects not to be affected by this animation.
- \sa targets
-*/
-QmlListProperty<QObject> QmlPropertyAction::exclude()
-{
- Q_D(QmlPropertyAction);
- return QmlListProperty<QObject>(this, d->exclude);
-}
-
-/*!
- \qmlproperty any PropertyAction::value
- This property holds the value to be set on the property.
- If not set, then the value defined for the end state of the transition.
-*/
-QVariant QmlPropertyAction::value() const
-{
- Q_D(const QmlPropertyAction);
- return d->value;
-}
-
-void QmlPropertyAction::setValue(const QVariant &v)
-{
- Q_D(QmlPropertyAction);
- if (d->value.isNull || d->value != v) {
- d->value = v;
- emit valueChanged(v);
- }
-}
-
-QAbstractAnimation *QmlPropertyAction::qtAnimation()
-{
- Q_D(QmlPropertyAction);
- return d->spa;
-}
-
-void QmlPropertyAction::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlPropertyAction);
- Q_UNUSED(direction);
-
- struct QmlSetPropertyAnimationAction : public QAbstractAnimationAction
- {
- QmlStateActions actions;
- virtual void doAction()
- {
- for (int ii = 0; ii < actions.count(); ++ii) {
- const QmlAction &action = actions.at(ii);
- action.property.write(action.toValue, QmlMetaProperty::BypassInterceptor | QmlMetaProperty::DontRemoveBinding);
- }
- }
- };
-
- QStringList props = d->properties.isEmpty() ? QStringList() : d->properties.split(QLatin1Char(','));
- for (int ii = 0; ii < props.count(); ++ii)
- props[ii] = props.at(ii).trimmed();
- if (!d->propertyName.isEmpty())
- props << d->propertyName;
-
- QList<QObject*> targets = d->targets;
- if (d->target)
- targets.append(d->target);
-
- bool hasSelectors = !props.isEmpty() || !targets.isEmpty() || !d->exclude.isEmpty();
-
- if (d->defaultProperty.isValid() && !hasSelectors) {
- props << d->defaultProperty.name();
- targets << d->defaultProperty.object();
- }
-
- QmlSetPropertyAnimationAction *data = new QmlSetPropertyAnimationAction;
-
- bool hasExplicit = false;
- //an explicit animation has been specified
- if (d->value.isValid()) {
- for (int i = 0; i < props.count(); ++i) {
- for (int j = 0; j < targets.count(); ++j) {
- QmlAction myAction;
- myAction.property = d->createProperty(targets.at(j), props.at(i), this);
- if (myAction.property.isValid()) {
- myAction.toValue = d->value;
- QmlPropertyAnimationPrivate::convertVariant(myAction.toValue, myAction.property.propertyType());
- data->actions << myAction;
- hasExplicit = true;
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
- if (action.property.object() == myAction.property.object() &&
- myAction.property.name() == action.property.name()) {
- modified << action.property;
- break; //### any chance there could be multiples?
- }
- }
- }
- }
- }
- }
-
- if (!hasExplicit)
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
-
- QObject *obj = action.property.object();
- QString propertyName = action.property.name();
- QObject *sObj = action.specifiedObject;
- QString sPropertyName = action.specifiedProperty;
- bool same = (obj == sObj);
-
- if ((targets.isEmpty() || targets.contains(obj) || (!same && targets.contains(sObj))) &&
- (!d->exclude.contains(obj)) && (same || (!d->exclude.contains(sObj))) &&
- (props.contains(propertyName) || (!same && props.contains(sPropertyName)))) {
- QmlAction myAction = action;
-
- if (d->value.isValid())
- myAction.toValue = d->value;
- QmlPropertyAnimationPrivate::convertVariant(myAction.toValue, myAction.property.propertyType());
-
- modified << action.property;
- data->actions << myAction;
- action.fromValue = myAction.toValue;
- }
- }
-
- if (data->actions.count()) {
- d->spa->setAnimAction(data, QAbstractAnimation::DeleteWhenStopped);
- } else {
- delete data;
- }
-}
-
-
-
-/*!
- \qmlclass ParentAction QmlParentAction
- \since 4.7
- \inherits Animation
- \brief The ParentAction element allows parent changes during animation.
-
- ParentAction provides a way to specify at what point in a Transition a ParentChange should
- occur.
- \qml
- State {
- ParentChange {
- target: myItem
- parent: newParent
- }
- }
- Transition {
- SequentialAnimation {
- PropertyAnimation { ... }
- ParentAction {} //reparent myItem now
- PropertyAnimation { ... }
- }
- }
- \endqml
-
- It also provides a way to explicitly reparent an item during an animation.
- \qml
- SequentialAnimation {
- ParentAction { target: myItem; parent: newParent }
- PropertyAnimation {}
- }
- \endqml
-
- The ParentAction is immediate - it is not animated in any way.
-*/
-
-QmlParentAction::QmlParentAction(QObject *parent)
-: QmlAbstractAnimation(*(new QmlParentActionPrivate), parent)
-{
- Q_D(QmlParentAction);
- d->init();
-}
-
-QmlParentAction::~QmlParentAction()
-{
-}
-
-void QmlParentActionPrivate::init()
-{
- Q_Q(QmlParentAction);
- cpa = new QActionAnimation;
- QmlGraphics_setParent_noEvent(cpa, q);
-}
-
-/*!
- \qmlproperty Item ParentAction::target
-
- This property holds a target item to reparent.
-
- In the following example, \c myItem will be reparented by the ParentAction, while
- \c myOtherItem will not.
- \qml
- State {
- ParentChange {
- target: myItem
- parent: newParent
- }
- ParentChange {
- target: myOtherItem
- parent: otherNewParent
- }
- }
- Transition {
- SequentialAnimation {
- PropertyAnimation { ... }
- ParentAction { target: myItem }
- PropertyAnimation { ... }
- }
- }
- \endqml
-
- */
-QmlGraphicsItem *QmlParentAction::object() const
-{
- Q_D(const QmlParentAction);
- return d->pcTarget;
-}
-
-void QmlParentAction::setObject(QmlGraphicsItem *target)
-{
- Q_D(QmlParentAction);
- d->pcTarget = target;
-}
-
-/*!
- \qmlproperty Item ParentAction::parent
-
- The item to reparent to (i.e. the new parent).
- */
-QmlGraphicsItem *QmlParentAction::parent() const
-{
- Q_D(const QmlParentAction);
- return d->pcParent;
-}
-
-void QmlParentAction::setParent(QmlGraphicsItem *parent)
-{
- Q_D(QmlParentAction);
- d->pcParent = parent;
-}
-
-void QmlParentActionPrivate::doAction()
-{
- QmlParentChange pc;
- pc.setObject(pcTarget);
- pc.setParent(pcParent);
- pc.execute();
-}
-
-QAbstractAnimation *QmlParentAction::qtAnimation()
-{
- Q_D(QmlParentAction);
- return d->cpa;
-}
-
-void QmlParentAction::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlParentAction);
- Q_UNUSED(modified);
- Q_UNUSED(direction);
-
- struct QmlParentActionData : public QAbstractAnimationAction
- {
- QmlParentActionData(): pc(0) {}
- ~QmlParentActionData() { delete pc; }
-
- QmlStateActions actions;
- bool reverse;
- QmlParentChange *pc;
- virtual void doAction()
- {
- for (int ii = 0; ii < actions.count(); ++ii) {
- const QmlAction &action = actions.at(ii);
- if (reverse)
- action.event->reverse();
- else
- action.event->execute();
- }
- }
- };
-
- QmlParentActionData *data = new QmlParentActionData;
-
- //### need to correctly handle modified/done
-
- bool hasExplicit = false;
- if (d->pcTarget && d->pcParent) {
- data->reverse = false;
- QmlAction myAction;
- QmlParentChange *pc = new QmlParentChange;
- pc->setObject(d->pcTarget);
- pc->setParent(d->pcParent);
- myAction.event = pc;
- data->pc = pc;
- data->actions << myAction;
- hasExplicit = true;
- }
-
- if (!hasExplicit)
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
-
- if (action.event && action.event->typeName() == QLatin1String("ParentChange")
- && (!d->pcTarget || static_cast<QmlParentChange*>(action.event)->object() == d->pcTarget)) {
- QmlAction myAction = action;
- data->reverse = action.reverseEvent;
- //### this logic differs from PropertyAnimation
- // (probably a result of modified vs. done)
- if (d->pcParent) {
- //### should we disallow this case?
- QmlParentChange *pc = new QmlParentChange;
- pc->setObject(d->pcTarget);
- pc->setParent(static_cast<QmlParentChange*>(action.event)->parent());
- myAction.event = pc;
- data->pc = pc;
- data->actions << myAction;
- break; //only match one
- } else {
- action.actionDone = true;
- data->actions << myAction;
- }
- }
- }
-
- if (data->actions.count()) {
- d->cpa->setAnimAction(data, QAbstractAnimation::DeleteWhenStopped);
- } else {
- delete data;
- }
-}
-
-
-
-/*!
- \qmlclass NumberAnimation QmlNumberAnimation
- \since 4.7
- \inherits PropertyAnimation
- \brief The NumberAnimation element allows you to animate changes in properties of type qreal.
-
- Animate a set of properties over 200ms, from their values in the start state to
- their values in the end state of the transition:
- \code
- NumberAnimation { properties: "x,y,scale"; duration: 200 }
- \endcode
-*/
-
-/*!
- \internal
- \class QmlNumberAnimation
-*/
-
-QmlNumberAnimation::QmlNumberAnimation(QObject *parent)
-: QmlPropertyAnimation(parent)
-{
- Q_D(QmlPropertyAnimation);
- d->interpolatorType = QMetaType::QReal;
- d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
-}
-
-QmlNumberAnimation::~QmlNumberAnimation()
-{
-}
-
-/*!
- \qmlproperty real NumberAnimation::from
- This property holds the starting value.
- If not set, then the value defined in the start state of the transition.
-*/
-qreal QmlNumberAnimation::from() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->from.toReal();
-}
-
-void QmlNumberAnimation::setFrom(qreal f)
-{
- QmlPropertyAnimation::setFrom(f);
-}
-
-/*!
- \qmlproperty real NumberAnimation::to
- This property holds the ending value.
- If not set, then the value defined in the end state of the transition or Behavior.
-*/
-qreal QmlNumberAnimation::to() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->to.toReal();
-}
-
-void QmlNumberAnimation::setTo(qreal t)
-{
- QmlPropertyAnimation::setTo(t);
-}
-
-
-
-/*!
- \qmlclass Vector3dAnimation QmlVector3dAnimation
- \since 4.7
- \inherits PropertyAnimation
- \brief The Vector3dAnimation element allows you to animate changes in properties of type QVector3d.
-*/
-
-/*!
- \internal
- \class QmlVector3dAnimation
-*/
-
-QmlVector3dAnimation::QmlVector3dAnimation(QObject *parent)
-: QmlPropertyAnimation(parent)
-{
- Q_D(QmlPropertyAnimation);
- d->interpolatorType = QMetaType::QVector3D;
- d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
- d->defaultToInterpolatorType = true;
-}
-
-QmlVector3dAnimation::~QmlVector3dAnimation()
-{
-}
-
-/*!
- \qmlproperty real Vector3dAnimation::from
- This property holds the starting value.
- If not set, then the value defined in the start state of the transition.
-*/
-QVector3D QmlVector3dAnimation::from() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->from.value<QVector3D>();
-}
-
-void QmlVector3dAnimation::setFrom(QVector3D f)
-{
- QmlPropertyAnimation::setFrom(f);
-}
-
-/*!
- \qmlproperty real Vector3dAnimation::to
- This property holds the ending value.
- If not set, then the value defined in the end state of the transition or Behavior.
-*/
-QVector3D QmlVector3dAnimation::to() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->to.value<QVector3D>();
-}
-
-void QmlVector3dAnimation::setTo(QVector3D t)
-{
- QmlPropertyAnimation::setTo(t);
-}
-
-
-
-/*!
- \qmlclass RotationAnimation QmlRotationAnimation
- \inherits PropertyAnimation
- \brief The RotationAnimation element allows you to animate rotations.
-
- RotationAnimation is a specialized PropertyAnimation that gives control
- over the direction of rotation.
-
- The RotationAnimation in the following example ensures that we always take
- the shortest rotation path when switching between our states.
- \qml
- states: {
- State { name: "180"; PropertyChanges { target: myItem; rotation: 180 } }
- State { name: "-180"; PropertyChanges { target: myItem; rotation: -180 } }
- State { name: "180"; PropertyChanges { target: myItem; rotation: 270 } }
- }
- transition: Transition {
- RotationAnimation { direction: RotationAnimation.Shortest }
- }
- \endqml
-
- By default, when used in a transition RotationAnimation will rotate all
- properties named "rotation" or "angle". You can override this by providing
- your own properties via \c properties or \c property.
-*/
-
-/*!
- \internal
- \class QmlRotationAnimation
-*/
-
-QVariant _q_interpolateShortestRotation(qreal &f, qreal &t, qreal progress)
-{
- qreal newt = t;
- qreal diff = t-f;
- while(diff > 180.0){
- newt -= 360.0;
- diff -= 360.0;
- }
- while(diff < -180.0){
- newt += 360.0;
- diff += 360.0;
- }
- return QVariant(f + (newt - f) * progress);
-}
-
-QVariant _q_interpolateClockwiseRotation(qreal &f, qreal &t, qreal progress)
-{
- qreal newt = t;
- qreal diff = t-f;
- while(diff < 0.0){
- newt += 360.0;
- diff += 360.0;
- }
- return QVariant(f + (newt - f) * progress);
-}
-
-QVariant _q_interpolateCounterclockwiseRotation(qreal &f, qreal &t, qreal progress)
-{
- qreal newt = t;
- qreal diff = t-f;
- while(diff > 0.0){
- newt -= 360.0;
- diff -= 360.0;
- }
- return QVariant(f + (newt - f) * progress);
-}
-
-QmlRotationAnimation::QmlRotationAnimation(QObject *parent)
-: QmlPropertyAnimation(*(new QmlRotationAnimationPrivate), parent)
-{
- Q_D(QmlRotationAnimation);
- d->interpolatorType = QMetaType::QReal;
- d->interpolator = reinterpret_cast<QVariantAnimation::Interpolator>(&_q_interpolateShortestRotation);
- d->defaultProperties = QLatin1String("rotation,angle");
-}
-
-QmlRotationAnimation::~QmlRotationAnimation()
-{
-}
-
-/*!
- \qmlproperty real RotationAnimation::from
- This property holds the starting value.
- If not set, then the value defined in the start state of the transition.
-*/
-qreal QmlRotationAnimation::from() const
-{
- Q_D(const QmlRotationAnimation);
- return d->from.toReal();
-}
-
-void QmlRotationAnimation::setFrom(qreal f)
-{
- QmlPropertyAnimation::setFrom(f);
-}
-
-/*!
- \qmlproperty real RotationAnimation::to
- This property holds the ending value.
- If not set, then the value defined in the end state of the transition or Behavior.
-*/
-qreal QmlRotationAnimation::to() const
-{
- Q_D(const QmlRotationAnimation);
- return d->to.toReal();
-}
-
-void QmlRotationAnimation::setTo(qreal t)
-{
- QmlPropertyAnimation::setTo(t);
-}
-
-/*!
- \qmlproperty enum RotationAnimation::direction
- The direction in which to rotate.
- Possible values are Numerical, Clockwise, Counterclockwise,
- or Shortest.
-
- \table
- \row
- \o Numerical
- \o Rotate by linearly interpolating between the two numbers.
- A rotation from 10 to 350 will rotate 340 degrees clockwise.
- \row
- \o Clockwise
- \o Rotate clockwise between the two values
- \row
- \o Counterclockwise
- \o Rotate counterclockwise between the two values
- \row
- \o Shortest
- \o Rotate in the direction that produces the shortest animation path.
- A rotation from 10 to 350 will rotate 20 degrees counterclockwise.
- \endtable
-
- The default direction is Shortest.
-*/
-QmlRotationAnimation::RotationDirection QmlRotationAnimation::direction() const
-{
- Q_D(const QmlRotationAnimation);
- return d->direction;
-}
-
-void QmlRotationAnimation::setDirection(QmlRotationAnimation::RotationDirection direction)
-{
- Q_D(QmlRotationAnimation);
- if (d->direction == direction)
- return;
-
- d->direction = direction;
- switch(d->direction) {
- case Clockwise:
- d->interpolator = reinterpret_cast<QVariantAnimation::Interpolator>(&_q_interpolateClockwiseRotation);
- break;
- case Counterclockwise:
- d->interpolator = reinterpret_cast<QVariantAnimation::Interpolator>(&_q_interpolateCounterclockwiseRotation);
- break;
- case Shortest:
- d->interpolator = reinterpret_cast<QVariantAnimation::Interpolator>(&_q_interpolateShortestRotation);
- break;
- default:
- d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
- break;
- }
-
- emit directionChanged();
-}
-
-
-
-QmlAnimationGroup::QmlAnimationGroup(QObject *parent)
-: QmlAbstractAnimation(*(new QmlAnimationGroupPrivate), parent)
-{
-}
-
-void QmlAnimationGroupPrivate::append_animation(QmlListProperty<QmlAbstractAnimation> *list, QmlAbstractAnimation *a)
-{
- QmlAnimationGroup *q = qobject_cast<QmlAnimationGroup *>(list->object);
- if (q) {
- q->d_func()->animations.append(a);
- a->setGroup(q);
- }
-}
-
-void QmlAnimationGroupPrivate::clear_animation(QmlListProperty<QmlAbstractAnimation> *list)
-{
- QmlAnimationGroup *q = qobject_cast<QmlAnimationGroup *>(list->object);
- if (q) {
- for (int i = 0; i < q->d_func()->animations.count(); ++i)
- q->d_func()->animations.at(i)->setGroup(0);
- q->d_func()->animations.clear();
- }
-}
-
-QmlAnimationGroup::~QmlAnimationGroup()
-{
-}
-
-QmlListProperty<QmlAbstractAnimation> QmlAnimationGroup::animations()
-{
- Q_D(QmlAnimationGroup);
- QmlListProperty<QmlAbstractAnimation> list(this, d->animations);
- list.append = &QmlAnimationGroupPrivate::append_animation;
- list.clear = &QmlAnimationGroupPrivate::clear_animation;
- return list;
-}
-
-/*!
- \qmlclass SequentialAnimation QmlSequentialAnimation
- \since 4.7
- \inherits Animation
- \brief The SequentialAnimation element allows you to run animations sequentially.
-
- Animations controlled in SequentialAnimation will be run one after the other.
-
- The following example chains two numeric animations together. The \c MyItem
- object will animate from its current x position to 100, and then back to 0.
-
- \code
- SequentialAnimation {
- NumberAnimation { target: MyItem; property: "x"; to: 100 }
- NumberAnimation { target: MyItem; property: "x"; to: 0 }
- }
- \endcode
-
- \sa ParallelAnimation
-*/
-
-QmlSequentialAnimation::QmlSequentialAnimation(QObject *parent) :
- QmlAnimationGroup(parent)
-{
- Q_D(QmlAnimationGroup);
- d->ag = new QSequentialAnimationGroup(this);
-}
-
-QmlSequentialAnimation::~QmlSequentialAnimation()
-{
-}
-
-QAbstractAnimation *QmlSequentialAnimation::qtAnimation()
-{
- Q_D(QmlAnimationGroup);
- return d->ag;
-}
-
-void QmlSequentialAnimation::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlAnimationGroup);
-
- int inc = 1;
- int from = 0;
- if (direction == Backward) {
- inc = -1;
- from = d->animations.count() - 1;
- }
-
- bool valid = d->defaultProperty.isValid();
- for (int ii = from; ii < d->animations.count() && ii >= 0; ii += inc) {
- if (valid)
- d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
- d->animations.at(ii)->transition(actions, modified, direction);
- }
-}
-
-
-
-/*!
- \qmlclass ParallelAnimation QmlParallelAnimation
- \since 4.7
- \inherits Animation
- \brief The ParallelAnimation element allows you to run animations in parallel.
-
- Animations contained in ParallelAnimation will be run at the same time.
-
- The following animation demonstrates animating the \c MyItem item
- to (100,100) by animating the x and y properties in parallel.
-
- \code
- ParallelAnimation {
- NumberAnimation { target: MyItem; property: "x"; to: 100 }
- NumberAnimation { target: MyItem; property: "y"; to: 100 }
- }
- \endcode
-
- \sa SequentialAnimation
-*/
-/*!
- \internal
- \class QmlParallelAnimation
-*/
-
-QmlParallelAnimation::QmlParallelAnimation(QObject *parent) :
- QmlAnimationGroup(parent)
-{
- Q_D(QmlAnimationGroup);
- d->ag = new QParallelAnimationGroup(this);
-}
-
-QmlParallelAnimation::~QmlParallelAnimation()
-{
-}
-
-QAbstractAnimation *QmlParallelAnimation::qtAnimation()
-{
- Q_D(QmlAnimationGroup);
- return d->ag;
-}
-
-void QmlParallelAnimation::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlAnimationGroup);
- bool valid = d->defaultProperty.isValid();
- for (int ii = 0; ii < d->animations.count(); ++ii) {
- if (valid)
- d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
- d->animations.at(ii)->transition(actions, modified, direction);
- }
-}
-
-
-
-//convert a variant from string type to another animatable type
-void QmlPropertyAnimationPrivate::convertVariant(QVariant &variant, int type)
-{
- if (variant.userType() != QVariant::String) {
- variant.convert((QVariant::Type)type);
- return;
- }
-
- switch (type) {
- case QVariant::Rect: {
- variant.setValue(QmlStringConverters::rectFFromString(variant.toString()).toRect());
- break;
- }
- case QVariant::RectF: {
- variant.setValue(QmlStringConverters::rectFFromString(variant.toString()));
- break;
- }
- case QVariant::Point: {
- variant.setValue(QmlStringConverters::pointFFromString(variant.toString()).toPoint());
- break;
- }
- case QVariant::PointF: {
- variant.setValue(QmlStringConverters::pointFFromString(variant.toString()));
- break;
- }
- case QVariant::Size: {
- variant.setValue(QmlStringConverters::sizeFFromString(variant.toString()).toSize());
- break;
- }
- case QVariant::SizeF: {
- variant.setValue(QmlStringConverters::sizeFFromString(variant.toString()));
- break;
- }
- case QVariant::Color: {
- variant.setValue(QmlStringConverters::colorFromString(variant.toString()));
- break;
- }
- case QVariant::Vector3D: {
- variant.setValue(QmlStringConverters::vector3DFromString(variant.toString()));
- break;
- }
- default:
- if ((uint)type >= QVariant::UserType) {
- QmlMetaType::StringConverter converter = QmlMetaType::customStringConverter(type);
- if (converter)
- variant = converter(variant.toString());
- } else
- variant.convert((QVariant::Type)type);
- break;
- }
-}
-
-/*!
- \qmlclass PropertyAnimation QmlPropertyAnimation
- \since 4.7
- \inherits Animation
- \brief The PropertyAnimation element allows you to animate property changes.
-
- PropertyAnimation provides a way to animate changes to a property's value. It can
- be used in many different situations:
- \list
- \o In a Transition
-
- Animate any objects that have changed their x or y properties in the target state using
- an InOutQuad easing curve:
- \qml
- Transition { PropertyAnimation { properties: "x,y"; easing: "InOutQuad" } }
- \endqml
- \o In a Behavior
-
- Animate all changes to a rectangle's x property.
- \qml
- Rectangle {
- x: Behavior { PropertyAnimation {} }
- }
- \endqml
- \o As a property value source
-
- Repeatedly animate the rectangle's x property.
- \qml
- Rectangle {
- x: SequentialAnimation {
- repeat: true
- PropertyAnimation { to: 50 }
- PropertyAnimation { to: 0 }
- }
- }
- \endqml
- \o In a signal handler
-
- Fade out \c theObject when clicked:
- \qml
- MouseArea {
- anchors.fill: theObject
- onClicked: PropertyAnimation { target: theObject; property: "opacity"; to: 0 }
- }
- \endqml
- \o Standalone
-
- Animate \c theObject's size property over 200ms, from its current size to 20-by-20:
- \qml
- PropertyAnimation { target: theObject; property: "size"; to: "20x20"; duration: 200 }
- \endqml
- \endlist
-
- Depending on how the animation is used, the set of properties normally used will be
- different. For more information see the individual property documentation, as well
- as the \l{QML Animation} introduction.
-*/
-
-QmlPropertyAnimation::QmlPropertyAnimation(QObject *parent)
-: QmlAbstractAnimation(*(new QmlPropertyAnimationPrivate), parent)
-{
- Q_D(QmlPropertyAnimation);
- d->init();
-}
-
-QmlPropertyAnimation::QmlPropertyAnimation(QmlPropertyAnimationPrivate &dd, QObject *parent)
-: QmlAbstractAnimation(dd, parent)
-{
- Q_D(QmlPropertyAnimation);
- d->init();
-}
-
-QmlPropertyAnimation::~QmlPropertyAnimation()
-{
-}
-
-void QmlPropertyAnimationPrivate::init()
-{
- Q_Q(QmlPropertyAnimation);
- va = new QmlTimeLineValueAnimator;
- QmlGraphics_setParent_noEvent(va, q);
-}
-
-/*!
- \qmlproperty int PropertyAnimation::duration
- This property holds the duration of the transition, in milliseconds.
-
- The default value is 250.
-*/
-int QmlPropertyAnimation::duration() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->va->duration();
-}
-
-void QmlPropertyAnimation::setDuration(int duration)
-{
- if (duration < 0) {
- qmlInfo(this) << tr("Cannot set a duration of < 0");
- return;
- }
-
- Q_D(QmlPropertyAnimation);
- if (d->va->duration() == duration)
- return;
- d->va->setDuration(duration);
- emit durationChanged(duration);
-}
-
-/*!
- \qmlproperty real PropertyAnimation::from
- This property holds the starting value.
- If not set, then the value defined in the start state of the transition.
-*/
-QVariant QmlPropertyAnimation::from() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->from;
-}
-
-void QmlPropertyAnimation::setFrom(const QVariant &f)
-{
- Q_D(QmlPropertyAnimation);
- if (d->fromIsDefined && f == d->from)
- return;
- d->from = f;
- d->fromIsDefined = f.isValid();
- emit fromChanged(f);
-}
-
-/*!
- \qmlproperty real PropertyAnimation::to
- This property holds the ending value.
- If not set, then the value defined in the end state of the transition or Behavior.
-*/
-QVariant QmlPropertyAnimation::to() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->to;
-}
-
-void QmlPropertyAnimation::setTo(const QVariant &t)
-{
- Q_D(QmlPropertyAnimation);
- if (d->toIsDefined && t == d->to)
- return;
- d->to = t;
- d->toIsDefined = t.isValid();
- emit toChanged(t);
-}
-
-/*!
- \qmlproperty QEasingCurve PropertyAnimation::easing
- \brief the easing curve used for the transition.
-
- Available values are:
-
- \table
- \row
- \o \c Linear
- \o Easing curve for a linear (t) function: velocity is constant.
- \o \inlineimage qeasingcurve-linear.png
- \row
- \o \c InQuad
- \o Easing curve for a quadratic (t^2) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inquad.png
- \row
- \o \c OutQuad
- \o Easing curve for a quadratic (t^2) function: decelerating to zero velocity.
- \o \inlineimage qeasingcurve-outquad.png
- \row
- \o \c InOutQuad
- \o Easing curve for a quadratic (t^2) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutquad.png
- \row
- \o \c OutInQuad
- \o Easing curve for a quadratic (t^2) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinquad.png
- \row
- \o \c InCubic
- \o Easing curve for a cubic (t^3) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-incubic.png
- \row
- \o \c OutCubic
- \o Easing curve for a cubic (t^3) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outcubic.png
- \row
- \o \c InOutCubic
- \o Easing curve for a cubic (t^3) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutcubic.png
- \row
- \o \c OutInCubic
- \o Easing curve for a cubic (t^3) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outincubic.png
- \row
- \o \c InQuart
- \o Easing curve for a quartic (t^4) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inquart.png
- \row
- \o \c OutQuart
- \o Easing curve for a cubic (t^4) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outquart.png
- \row
- \o \c InOutQuart
- \o Easing curve for a cubic (t^4) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutquart.png
- \row
- \o \c OutInQuart
- \o Easing curve for a cubic (t^4) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinquart.png
- \row
- \o \c InQuint
- \o Easing curve for a quintic (t^5) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inquint.png
- \row
- \o \c OutQuint
- \o Easing curve for a cubic (t^5) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outquint.png
- \row
- \o \c InOutQuint
- \o Easing curve for a cubic (t^5) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutquint.png
- \row
- \o \c OutInQuint
- \o Easing curve for a cubic (t^5) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinquint.png
- \row
- \o \c InSine
- \o Easing curve for a sinusoidal (sin(t)) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-insine.png
- \row
- \o \c OutSine
- \o Easing curve for a sinusoidal (sin(t)) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outsine.png
- \row
- \o \c InOutSine
- \o Easing curve for a sinusoidal (sin(t)) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutsine.png
- \row
- \o \c OutInSine
- \o Easing curve for a sinusoidal (sin(t)) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinsine.png
- \row
- \o \c InExpo
- \o Easing curve for an exponential (2^t) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inexpo.png
- \row
- \o \c OutExpo
- \o Easing curve for an exponential (2^t) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outexpo.png
- \row
- \o \c InOutExpo
- \o Easing curve for an exponential (2^t) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutexpo.png
- \row
- \o \c OutInExpo
- \o Easing curve for an exponential (2^t) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinexpo.png
- \row
- \o \c InCirc
- \o Easing curve for a circular (sqrt(1-t^2)) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-incirc.png
- \row
- \o \c OutCirc
- \o Easing curve for a circular (sqrt(1-t^2)) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outcirc.png
- \row
- \o \c InOutCirc
- \o Easing curve for a circular (sqrt(1-t^2)) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutcirc.png
- \row
- \o \c OutInCirc
- \o Easing curve for a circular (sqrt(1-t^2)) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outincirc.png
- \row
- \o \c InElastic
- \o Easing curve for an elastic (exponentially decaying sine wave) function: accelerating from zero velocity.
- \br The peak amplitude can be set with the \e amplitude parameter, and the period of decay by the \e period parameter.
- \o \inlineimage qeasingcurve-inelastic.png
- \row
- \o \c OutElastic
- \o Easing curve for an elastic (exponentially decaying sine wave) function: decelerating from zero velocity.
- \br The peak amplitude can be set with the \e amplitude parameter, and the period of decay by the \e period parameter.
- \o \inlineimage qeasingcurve-outelastic.png
- \row
- \o \c InOutElastic
- \o Easing curve for an elastic (exponentially decaying sine wave) function: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutelastic.png
- \row
- \o \c OutInElastic
- \o Easing curve for an elastic (exponentially decaying sine wave) function: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinelastic.png
- \row
- \o \c InBack
- \o Easing curve for a back (overshooting cubic function: (s+1)*t^3 - s*t^2) easing in: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inback.png
- \row
- \o \c OutBack
- \o Easing curve for a back (overshooting cubic function: (s+1)*t^3 - s*t^2) easing out: decelerating to zero velocity.
- \o \inlineimage qeasingcurve-outback.png
- \row
- \o \c InOutBack
- \o Easing curve for a back (overshooting cubic function: (s+1)*t^3 - s*t^2) easing in/out: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutback.png
- \row
- \o \c OutInBack
- \o Easing curve for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinback.png
- \row
- \o \c InBounce
- \o Easing curve for a bounce (exponentially decaying parabolic bounce) function: accelerating from zero velocity.
- \o \inlineimage qeasingcurve-inbounce.png
- \row
- \o \c OutBounce
- \o Easing curve for a bounce (exponentially decaying parabolic bounce) function: decelerating from zero velocity.
- \o \inlineimage qeasingcurve-outbounce.png
- \row
- \o \c InOutBounce
- \o Easing curve for a bounce (exponentially decaying parabolic bounce) function easing in/out: acceleration until halfway, then deceleration.
- \o \inlineimage qeasingcurve-inoutbounce.png
- \row
- \o \c OutInBounce
- \o Easing curve for a bounce (exponentially decaying parabolic bounce) function easing out/in: deceleration until halfway, then acceleration.
- \o \inlineimage qeasingcurve-outinbounce.png
- \endtable
-
-*/
-QEasingCurve QmlPropertyAnimation::easing() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->easing;
-}
-
-void QmlPropertyAnimation::setEasing(const QEasingCurve &e)
-{
- Q_D(QmlPropertyAnimation);
- if (d->easing == e)
- return;
-
- d->easing = e;
- d->va->setEasingCurve(d->easing);
- emit easingChanged(e);
-}
-
-QObject *QmlPropertyAnimation::target() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->target;
-}
-
-void QmlPropertyAnimation::setTarget(QObject *o)
-{
- Q_D(QmlPropertyAnimation);
- if (d->target == o)
- return;
- d->target = o;
- emit targetChanged(d->target, d->propertyName);
-}
-
-QString QmlPropertyAnimation::property() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->propertyName;
-}
-
-void QmlPropertyAnimation::setProperty(const QString &n)
-{
- Q_D(QmlPropertyAnimation);
- if (d->propertyName == n)
- return;
- d->propertyName = n;
- emit targetChanged(d->target, d->propertyName);
-}
-
-QString QmlPropertyAnimation::properties() const
-{
- Q_D(const QmlPropertyAnimation);
- return d->properties;
-}
-
-void QmlPropertyAnimation::setProperties(const QString &prop)
-{
- Q_D(QmlPropertyAnimation);
- if (d->properties == prop)
- return;
-
- d->properties = prop;
- emit propertiesChanged(prop);
-}
-
-/*!
- \qmlproperty string PropertyAnimation::property
- \qmlproperty string PropertyAnimation::properties
- \qmlproperty Object PropertyAnimation::target
- \qmlproperty list<Object> PropertyAnimation::targets
-
- These properties are used as a set to determine which properties should be animated.
- The singular and plural forms are functionally identical, e.g.
- \qml
- NumberAnimation { target: theItem; property: "x"; to: 500 }
- \endqml
- has the same meaning as
- \qml
- NumberAnimation { targets: theItem; properties: "x"; to: 500 }
- \endqml
- The singular forms are slightly optimized, so if you do have only a single target/property
- to animate you should try to use them.
-
- In many cases these properties do not need to be explicitly specified -- they can be
- inferred from the animation framework.
- \table 80%
- \row
- \o Value Source / Behavior
- \o When an animation is used as a value source or in a Behavior, the default target and property
- name to be animated can both be inferred.
- \qml
- Rectangle {
- id: theRect
- width: 100; height: 100
- color: Qt.rgba(0,0,1)
- x: NumberAnimation { to: 500; repeat: true } //animate theRect's x property
- y: Behavior { NumberAnimation {} } //animate theRect's y property
- }
- \endqml
- \row
- \o Transition
- \o When used in a transition, a property animation is assumed to match \e all targets
- but \e no properties. In practice, that means you need to specify at least the properties
- in order for the animation to do anything.
- \qml
- Rectangle {
- id: theRect
- width: 100; height: 100
- color: Qt.rgba(0,0,1)
- Item { id: uselessItem }
- states: State {
- name: "state1"
- PropertyChanges { target: theRect; x: 200; y: 200; z: 4 }
- PropertyChanges { target: uselessItem; x: 10; y: 10; z: 2 }
- }
- transitions: Transition {
- //animate both theRect's and uselessItem's x and y to their final values
- NumberAnimation { properties: "x,y" }
-
- //animate theRect's z to its final value
- NumberAnimation { target: theRect; property: "z" }
- }
- }
- \endqml
- \row
- \o Standalone
- \o When an animation is used standalone, both the target and property need to be
- explicitly specified.
- \qml
- Rectangle {
- id: theRect
- width: 100; height: 100
- color: Qt.rgba(0,0,1)
- //need to explicitly specify target and property
- NumberAnimation { id: theAnim; target: theRect; property: "x" to: 500 }
- MouseArea {
- anchors.fill: parent
- onClicked: theAnim.start()
- }
- }
- \endqml
- \endtable
-
- As seen in the above example, properties is specified as a comma-separated string of property names to animate.
-
- \sa exclude
-*/
-QmlListProperty<QObject> QmlPropertyAnimation::targets()
-{
- Q_D(QmlPropertyAnimation);
- return QmlListProperty<QObject>(this, d->targets);
-}
-
-/*!
- \qmlproperty list<Object> PropertyAnimation::exclude
- This property holds the items not to be affected by this animation.
- \sa targets
-*/
-QmlListProperty<QObject> QmlPropertyAnimation::exclude()
-{
- Q_D(QmlPropertyAnimation);
- return QmlListProperty<QObject>(this, d->exclude);
-}
-
-QAbstractAnimation *QmlPropertyAnimation::qtAnimation()
-{
- Q_D(QmlPropertyAnimation);
- return d->va;
-}
-
-struct PropertyUpdater : public QmlTimeLineValue
-{
- QmlStateActions actions;
- int interpolatorType; //for Number/ColorAnimation
- int prevInterpolatorType; //for generic
- QVariantAnimation::Interpolator interpolator;
- bool reverse;
- bool fromSourced;
- bool fromDefined;
- bool *wasDeleted;
- PropertyUpdater() : wasDeleted(0) {}
- ~PropertyUpdater() { if (wasDeleted) *wasDeleted = true; }
- void setValue(qreal v)
- {
- bool deleted = false;
- wasDeleted = &deleted;
- if (reverse) //QVariantAnimation sends us 1->0 when reversed, but we are expecting 0->1
- v = 1 - v;
- QmlTimeLineValue::setValue(v);
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
-
- if (v == 1.)
- action.property.write(action.toValue, QmlMetaProperty::BypassInterceptor | QmlMetaProperty::DontRemoveBinding);
- else {
- if (!fromSourced && !fromDefined) {
- action.fromValue = action.property.read();
- if (interpolatorType)
- QmlPropertyAnimationPrivate::convertVariant(action.fromValue, interpolatorType);
- }
- if (!interpolatorType) {
- int propType = action.property.propertyType();
- if (!prevInterpolatorType || prevInterpolatorType != propType) {
- prevInterpolatorType = propType;
- interpolator = QVariantAnimationPrivate::getInterpolator(prevInterpolatorType);
- }
- }
- if (interpolator)
- action.property.write(interpolator(action.fromValue.constData(), action.toValue.constData(), v), QmlMetaProperty::BypassInterceptor | QmlMetaProperty::DontRemoveBinding);
- }
- if (deleted)
- return;
- }
- wasDeleted = 0;
- fromSourced = true;
- }
-};
-
-void QmlPropertyAnimation::transition(QmlStateActions &actions,
- QmlMetaProperties &modified,
- TransitionDirection direction)
-{
- Q_D(QmlPropertyAnimation);
-
- QStringList props = d->properties.isEmpty() ? QStringList() : d->properties.split(QLatin1Char(','));
- for (int ii = 0; ii < props.count(); ++ii)
- props[ii] = props.at(ii).trimmed();
- if (!d->propertyName.isEmpty())
- props << d->propertyName;
-
- QList<QObject*> targets = d->targets;
- if (d->target)
- targets.append(d->target);
-
- bool hasSelectors = !props.isEmpty() || !targets.isEmpty() || !d->exclude.isEmpty();
- bool useType = (props.isEmpty() && d->defaultToInterpolatorType) ? true : false;
-
- if (d->defaultProperty.isValid() && !hasSelectors) {
- props << d->defaultProperty.name();
- targets << d->defaultProperty.object();
- }
-
- if (props.isEmpty() && !d->defaultProperties.isEmpty()) {
- props << d->defaultProperties.split(QLatin1Char(','));
- }
-
- PropertyUpdater *data = new PropertyUpdater;
- data->interpolatorType = d->interpolatorType;
- data->interpolator = d->interpolator;
- data->reverse = direction == Backward ? true : false;
- data->fromSourced = false;
- data->fromDefined = d->fromIsDefined;
-
- bool hasExplicit = false;
- //an explicit animation has been specified
- if (d->toIsDefined) {
- for (int i = 0; i < props.count(); ++i) {
- for (int j = 0; j < targets.count(); ++j) {
- QmlAction myAction;
- myAction.property = d->createProperty(targets.at(j), props.at(i), this);
- if (myAction.property.isValid()) {
- if (d->fromIsDefined) {
- myAction.fromValue = d->from;
- d->convertVariant(myAction.fromValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType());
- }
- myAction.toValue = d->to;
- d->convertVariant(myAction.toValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType());
- data->actions << myAction;
- hasExplicit = true;
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
- if (action.property.object() == myAction.property.object() &&
- myAction.property.name() == action.property.name()) {
- modified << action.property;
- break; //### any chance there could be multiples?
- }
- }
- }
- }
- }
- }
-
- if (!hasExplicit)
- for (int ii = 0; ii < actions.count(); ++ii) {
- QmlAction &action = actions[ii];
-
- QObject *obj = action.property.object();
- QString propertyName = action.property.name();
- QObject *sObj = action.specifiedObject;
- QString sPropertyName = action.specifiedProperty;
- bool same = (obj == sObj);
-
- if ((targets.isEmpty() || targets.contains(obj) || (!same && targets.contains(sObj))) &&
- (!d->exclude.contains(obj)) && (same || (!d->exclude.contains(sObj))) &&
- (props.contains(propertyName) || (!same && props.contains(sPropertyName))
- || (useType && action.property.propertyType() == d->interpolatorType))) {
- QmlAction myAction = action;
-
- if (d->fromIsDefined)
- myAction.fromValue = d->from;
- else
- myAction.fromValue = QVariant();
- if (d->toIsDefined)
- myAction.toValue = d->to;
-
- d->convertVariant(myAction.fromValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType());
- d->convertVariant(myAction.toValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType());
-
- modified << action.property;
-
- data->actions << myAction;
- action.fromValue = myAction.toValue;
- }
- }
-
- if (data->actions.count()) {
- if (!d->rangeIsSet) {
- d->va->setStartValue(qreal(0));
- d->va->setEndValue(qreal(1));
- d->rangeIsSet = true;
- }
- d->va->setAnimValue(data, QAbstractAnimation::DeleteWhenStopped);
- d->va->setFromSourcedValue(&data->fromSourced);
- } else {
- delete data;
- }
-}
-
-
-
-QT_END_NAMESPACE