diff options
Diffstat (limited to 'src/qtquick1/util/qdeclarativeanimation.cpp')
-rw-r--r-- | src/qtquick1/util/qdeclarativeanimation.cpp | 2969 |
1 files changed, 0 insertions, 2969 deletions
diff --git a/src/qtquick1/util/qdeclarativeanimation.cpp b/src/qtquick1/util/qdeclarativeanimation.cpp deleted file mode 100644 index 46ac6be94c..0000000000 --- a/src/qtquick1/util/qdeclarativeanimation.cpp +++ /dev/null @@ -1,2969 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "QtQuick1/private/qdeclarativeanimation_p.h" -#include "QtQuick1/private/qdeclarativeanimation_p_p.h" - -#include "QtQuick1/private/qdeclarativebehavior_p.h" -#include "QtQuick1/private/qdeclarativestateoperations_p.h" -#include "QtDeclarative/private/qdeclarativecontext_p.h" - -#include <QtDeclarative/qdeclarativepropertyvaluesource.h> -#include <QtDeclarative/qdeclarative.h> -#include <QtDeclarative/qdeclarativeinfo.h> -#include <QtDeclarative/qdeclarativeexpression.h> -#include <QtDeclarative/private/qdeclarativestringconverters_p.h> -#include <QtDeclarative/private/qdeclarativeglobal_p.h> -#include <QtDeclarative/private/qdeclarativemetatype_p.h> -#include <QtDeclarative/private/qdeclarativevaluetype_p.h> -#include <QtDeclarative/private/qdeclarativeproperty_p.h> -#include <QtDeclarative/private/qdeclarativeengine_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 <QtCore/qmath.h> - -#include <private/qvariantanimation_p.h> - -QT_BEGIN_NAMESPACE - - - -/*! - \qmlclass Animation QDeclarative1AbstractAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \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. -*/ - -QDeclarative1AbstractAnimation::QDeclarative1AbstractAnimation(QObject *parent) -: QObject(*(new QDeclarative1AbstractAnimationPrivate), parent) -{ -} - -QDeclarative1AbstractAnimation::~QDeclarative1AbstractAnimation() -{ -} - -QDeclarative1AbstractAnimation::QDeclarative1AbstractAnimation(QDeclarative1AbstractAnimationPrivate &dd, QObject *parent) -: QObject(dd, parent) -{ -} - -/*! - \qmlproperty bool QtQuick1::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 - NumberAnimation on x { - 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 using the \e on syntax, they are set to running by default. -*/ -bool QDeclarative1AbstractAnimation::isRunning() const -{ - Q_D(const QDeclarative1AbstractAnimation); - return d->running; -} - -// the behavior calls this function -void QDeclarative1AbstractAnimation::notifyRunningChanged(bool running) -{ - Q_D(QDeclarative1AbstractAnimation); - if (d->disableUserControl && d->running != running) { - d->running = running; - emit runningChanged(running); - } -} - -//commence is called to start an animation when it is used as a -//simple animation, and not as part of a transition -void QDeclarative1AbstractAnimationPrivate::commence() -{ - Q_Q(QDeclarative1AbstractAnimation); - - QDeclarative1StateActions actions; - QDeclarativeProperties properties; - q->transition(actions, properties, QDeclarative1AbstractAnimation::Forward); - - q->qtAnimation()->start(); - if (q->qtAnimation()->state() == QAbstractAnimation::Stopped) { - running = false; - emit q->completed(); - } -} - -QDeclarativeProperty QDeclarative1AbstractAnimationPrivate::createProperty(QObject *obj, const QString &str, QObject *infoObj) -{ - QDeclarativeProperty prop(obj, str, qmlContext(infoObj)); - if (!prop.isValid()) { - qmlInfo(infoObj) << QDeclarative1AbstractAnimation::tr("Cannot animate non-existent property \"%1\"").arg(str); - return QDeclarativeProperty(); - } else if (!prop.isWritable()) { - qmlInfo(infoObj) << QDeclarative1AbstractAnimation::tr("Cannot animate read-only property \"%1\"").arg(str); - return QDeclarativeProperty(); - } - return prop; -} - -void QDeclarative1AbstractAnimation::setRunning(bool r) -{ - Q_D(QDeclarative1AbstractAnimation); - if (!d->componentComplete) { - d->running = r; - if (r == false) - d->avoidPropertyValueSourceStart = true; - else if (!d->registered) { - d->registered = true; - QDeclarativeEnginePrivate *engPriv = QDeclarativeEnginePrivate::get(qmlEngine(this)); - engPriv->registerFinalizeCallback(this, this->metaObject()->indexOfSlot("componentFinalized()")); - } - return; - } - - if (d->running == r) - return; - - if (d->group || d->disableUserControl) { - qmlInfo(this) << "setRunning() cannot be used on non-root animation nodes."; - return; - } - - d->running = r; - if (d->running) { - bool supressStart = false; - if (d->alwaysRunToEnd && d->loopCount != 1 - && qtAnimation()->state() == QAbstractAnimation::Running) { - //we've restarted before the final loop finished; restore proper loop count - if (d->loopCount == -1) - qtAnimation()->setLoopCount(d->loopCount); - else - qtAnimation()->setLoopCount(qtAnimation()->currentLoop() + d->loopCount); - supressStart = true; //we want the animation to continue, rather than restart - } - - if (!d->connectedTimeLine) { - QObject::connect(qtAnimation(), SIGNAL(finished()), - this, SLOT(timelineComplete())); - d->connectedTimeLine = true; - } - if (!supressStart) - d->commence(); - emit started(); - } else { - if (d->alwaysRunToEnd) { - if (d->loopCount != 1) - qtAnimation()->setLoopCount(qtAnimation()->currentLoop()+1); //finish the current loop - } else - qtAnimation()->stop(); - - emit completed(); - } - - emit runningChanged(d->running); -} - -/*! - \qmlproperty bool QtQuick1::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 QDeclarative1AbstractAnimation::isPaused() const -{ - Q_D(const QDeclarative1AbstractAnimation); - return d->paused; -} - -void QDeclarative1AbstractAnimation::setPaused(bool p) -{ - Q_D(QDeclarative1AbstractAnimation); - if (d->paused == p) - return; - - if (d->group || d->disableUserControl) { - qmlInfo(this) << "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 QDeclarative1AbstractAnimation::classBegin() -{ - Q_D(QDeclarative1AbstractAnimation); - d->componentComplete = false; -} - -void QDeclarative1AbstractAnimation::componentComplete() -{ - Q_D(QDeclarative1AbstractAnimation); - d->componentComplete = true; -} - -void QDeclarative1AbstractAnimation::componentFinalized() -{ - Q_D(QDeclarative1AbstractAnimation); - if (d->running) { - d->running = false; - setRunning(true); - } -} - -/*! - \qmlproperty bool QtQuick1::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. - - \note alwaysRunToEnd has no effect on animations in a Transition. -*/ -bool QDeclarative1AbstractAnimation::alwaysRunToEnd() const -{ - Q_D(const QDeclarative1AbstractAnimation); - return d->alwaysRunToEnd; -} - -void QDeclarative1AbstractAnimation::setAlwaysRunToEnd(bool f) -{ - Q_D(QDeclarative1AbstractAnimation); - if (d->alwaysRunToEnd == f) - return; - - d->alwaysRunToEnd = f; - emit alwaysRunToEndChanged(f); -} - -/*! - \qmlproperty int QtQuick1::Animation::loops - This property holds the number of times the animation should play. - - By default, \c loops is 1: the animation will play through once and then stop. - - If set to Animation.Infinite, 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 indefinitely. - - \code - Rectangle { - width: 100; height: 100; color: "green" - RotationAnimation on rotation { - loops: Animation.Infinite - from: 0 - to: 360 - } - } - \endcode -*/ -int QDeclarative1AbstractAnimation::loops() const -{ - Q_D(const QDeclarative1AbstractAnimation); - return d->loopCount; -} - -void QDeclarative1AbstractAnimation::setLoops(int loops) -{ - Q_D(QDeclarative1AbstractAnimation); - if (loops < 0) - loops = -1; - - if (loops == d->loopCount) - return; - - d->loopCount = loops; - qtAnimation()->setLoopCount(loops); - emit loopCountChanged(loops); -} - - -int QDeclarative1AbstractAnimation::currentTime() -{ - return qtAnimation()->currentLoopTime(); -} - -void QDeclarative1AbstractAnimation::setCurrentTime(int time) -{ - qtAnimation()->setCurrentTime(time); -} - -QDeclarative1AnimationGroup *QDeclarative1AbstractAnimation::group() const -{ - Q_D(const QDeclarative1AbstractAnimation); - return d->group; -} - -void QDeclarative1AbstractAnimation::setGroup(QDeclarative1AnimationGroup *g) -{ - Q_D(QDeclarative1AbstractAnimation); - if (d->group == g) - return; - if (d->group) - static_cast<QDeclarative1AnimationGroupPrivate *>(d->group->d_func())->animations.removeAll(this); - - d->group = g; - - if (d->group && !static_cast<QDeclarative1AnimationGroupPrivate *>(d->group->d_func())->animations.contains(this)) - static_cast<QDeclarative1AnimationGroupPrivate *>(d->group->d_func())->animations.append(this); - - //if (g) //if removed from a group, then the group should no longer be the parent - setParent(g); -} - -/*! - \qmlmethod QtQuick1::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 QDeclarative1AbstractAnimation::start() -{ - setRunning(true); -} - -/*! - \qmlmethod QtQuick1::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 QDeclarative1AbstractAnimation::pause() -{ - setPaused(true); -} - -/*! - \qmlmethod QtQuick1::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 QDeclarative1AbstractAnimation::resume() -{ - setPaused(false); -} - -/*! - \qmlmethod QtQuick1::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 { - NumberAnimation on x { 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 QDeclarative1AbstractAnimation::stop() -{ - setRunning(false); -} - -/*! - \qmlmethod QtQuick1::Animation::restart() - \brief Restarts the animation. - - This is a convenience method, and is equivalent to calling \c stop() and - then \c start(). -*/ -void QDeclarative1AbstractAnimation::restart() -{ - stop(); - start(); -} - -/*! - \qmlmethod QtQuick1::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 { - NumberAnimation on x { 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 QDeclarative1AbstractAnimation::complete() -{ - if (isRunning()) { - qtAnimation()->setCurrentTime(qtAnimation()->duration()); - } -} - -void QDeclarative1AbstractAnimation::setTarget(const QDeclarativeProperty &p) -{ - Q_D(QDeclarative1AbstractAnimation); - 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 QDeclarative1AbstractAnimation::setDefaultTarget(const QDeclarativeProperty &p) -{ - Q_D(QDeclarative1AbstractAnimation); - 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 QDeclarative1AbstractAnimation::setDisableUserControl() -{ - Q_D(QDeclarative1AbstractAnimation); - d->disableUserControl = true; -} - -void QDeclarative1AbstractAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_UNUSED(actions); - Q_UNUSED(modified); - Q_UNUSED(direction); -} - -void QDeclarative1AbstractAnimation::timelineComplete() -{ - Q_D(QDeclarative1AbstractAnimation); - setRunning(false); - if (d->alwaysRunToEnd && d->loopCount != 1) { - //restore the proper loopCount for the next run - qtAnimation()->setLoopCount(d->loopCount); - } -} - -/*! - \qmlclass PauseAnimation QDeclarative1PauseAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \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 - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1PauseAnimation::QDeclarative1PauseAnimation(QObject *parent) -: QDeclarative1AbstractAnimation(*(new QDeclarative1PauseAnimationPrivate), parent) -{ - Q_D(QDeclarative1PauseAnimation); - d->init(); -} - -QDeclarative1PauseAnimation::~QDeclarative1PauseAnimation() -{ -} - -void QDeclarative1PauseAnimationPrivate::init() -{ - Q_Q(QDeclarative1PauseAnimation); - pa = new QPauseAnimation; - QDeclarative_setParent_noEvent(pa, q); -} - -/*! - \qmlproperty int QtQuick1::PauseAnimation::duration - This property holds the duration of the pause in milliseconds - - The default value is 250. -*/ -int QDeclarative1PauseAnimation::duration() const -{ - Q_D(const QDeclarative1PauseAnimation); - return d->pa->duration(); -} - -void QDeclarative1PauseAnimation::setDuration(int duration) -{ - if (duration < 0) { - qmlInfo(this) << tr("Cannot set a duration of < 0"); - return; - } - - Q_D(QDeclarative1PauseAnimation); - if (d->pa->duration() == duration) - return; - d->pa->setDuration(duration); - emit durationChanged(duration); -} - -QAbstractAnimation *QDeclarative1PauseAnimation::qtAnimation() -{ - Q_D(QDeclarative1PauseAnimation); - return d->pa; -} - -/*! - \qmlclass ColorAnimation QDeclarative1ColorAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits PropertyAnimation - \brief The ColorAnimation element animates changes in color values. - - ColorAnimation is a specialized PropertyAnimation that defines an - animation to be applied when a color value changes. - - Here is a ColorAnimation applied to the \c color property of a \l Rectangle - as a property value source. It animates the \c color property's value from - its current value to a value of "red", over 1000 milliseconds: - - \snippet doc/src/snippets/qtquick1/coloranimation.qml 0 - - Like any other animation element, a ColorAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - For convenience, when a ColorAnimation is used in a \l Transition, it will - animate any \c color properties that have been modified during the state - change. If a \l{PropertyAnimation::}{property} or - \l{PropertyAnimation::}{properties} are explicitly set for the animation, - then those are used instead. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1ColorAnimation::QDeclarative1ColorAnimation(QObject *parent) -: QDeclarative1PropertyAnimation(parent) -{ - Q_D(QDeclarative1PropertyAnimation); - d->interpolatorType = QMetaType::QColor; - d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); - d->defaultToInterpolatorType = true; -} - -QDeclarative1ColorAnimation::~QDeclarative1ColorAnimation() -{ -} - -/*! - \qmlproperty color QtQuick1::ColorAnimation::from - This property holds the color value at which the animation should begin. - - For example, the following animation is not applied until a color value - has reached "#c0c0c0": - - \qml - Item { - states: [ - // States are defined here... - ] - - transition: Transition { - NumberAnimation { from: "#c0c0c0"; duration: 2000 } - } - } - \endqml - - If the ColorAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the starting state of the - \l Transition, or the current value of the property at the moment the - \l Behavior is triggered. - - \sa {QML Animation and Transitions} -*/ -QColor QDeclarative1ColorAnimation::from() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->from.value<QColor>(); -} - -void QDeclarative1ColorAnimation::setFrom(const QColor &f) -{ - QDeclarative1PropertyAnimation::setFrom(f); -} - -/*! - \qmlproperty color QtQuick1::ColorAnimation::to - - This property holds the color value at which the animation should end. - - If the ColorAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. - - \sa {QML Animation and Transitions} -*/ -QColor QDeclarative1ColorAnimation::to() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->to.value<QColor>(); -} - -void QDeclarative1ColorAnimation::setTo(const QColor &t) -{ - QDeclarative1PropertyAnimation::setTo(t); -} - - - -/*! - \qmlclass ScriptAction QDeclarative1ScriptAction - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The ScriptAction element allows scripts to be run during an animation. - - ScriptAction can be used to run a script at a specific point in an animation. - - \qml - SequentialAnimation { - NumberAnimation { - // ... - } - ScriptAction { script: doSomething(); } - NumberAnimation { - // ... - } - } - \endqml - - When used as part of a Transition, you can also target a specific - StateChangeScript to run using the \c scriptName property. - - \snippet doc/src/snippets/qtquick1/states/statechangescript.qml state and transition - - \sa StateChangeScript -*/ -QDeclarative1ScriptAction::QDeclarative1ScriptAction(QObject *parent) - :QDeclarative1AbstractAnimation(*(new QDeclarative1ScriptActionPrivate), parent) -{ - Q_D(QDeclarative1ScriptAction); - d->init(); -} - -QDeclarative1ScriptAction::~QDeclarative1ScriptAction() -{ -} - -void QDeclarative1ScriptActionPrivate::init() -{ - Q_Q(QDeclarative1ScriptAction); - rsa = new QActionAnimation_1(&proxy); - QDeclarative_setParent_noEvent(rsa, q); -} - -/*! - \qmlproperty script QtQuick1::ScriptAction::script - This property holds the script to run. -*/ -QDeclarativeScriptString QDeclarative1ScriptAction::script() const -{ - Q_D(const QDeclarative1ScriptAction); - return d->script; -} - -void QDeclarative1ScriptAction::setScript(const QDeclarativeScriptString &script) -{ - Q_D(QDeclarative1ScriptAction); - d->script = script; -} - -/*! - \qmlproperty string QtQuick1::ScriptAction::scriptName - 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 scriptName are set, scriptName will be used. - - \note When using scriptName in a reversible transition, the script will only - be run when the transition is being run forwards. -*/ -QString QDeclarative1ScriptAction::stateChangeScriptName() const -{ - Q_D(const QDeclarative1ScriptAction); - return d->name; -} - -void QDeclarative1ScriptAction::setStateChangeScriptName(const QString &name) -{ - Q_D(QDeclarative1ScriptAction); - d->name = name; -} - -void QDeclarative1ScriptActionPrivate::execute() -{ - Q_Q(QDeclarative1ScriptAction); - if (hasRunScriptScript && reversing) - return; - - QDeclarativeScriptString scriptStr = hasRunScriptScript ? runScriptScript : script; - - const QString &str = scriptStr.script(); - if (!str.isEmpty()) { - QDeclarativeExpression expr(scriptStr.context(), scriptStr.scopeObject(), str); - QDeclarativeData *ddata = QDeclarativeData::get(q); - if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expr.setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); - expr.evaluate(); - if (expr.hasError()) - qmlInfo(q) << expr.error(); - } -} - -void QDeclarative1ScriptAction::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1ScriptAction); - Q_UNUSED(modified); - - d->hasRunScriptScript = false; - d->reversing = (direction == Backward); - for (int ii = 0; ii < actions.count(); ++ii) { - QDeclarative1Action &action = actions[ii]; - - if (action.event && action.event->typeName() == QLatin1String("StateChangeScript") - && static_cast<QDeclarative1StateChangeScript*>(action.event)->name() == d->name) { - d->runScriptScript = static_cast<QDeclarative1StateChangeScript*>(action.event)->script(); - d->hasRunScriptScript = true; - action.actionDone = true; - break; //only match one (names should be unique) - } - } -} - -QAbstractAnimation *QDeclarative1ScriptAction::qtAnimation() -{ - Q_D(QDeclarative1ScriptAction); - return d->rsa; -} - - - -/*! - \qmlclass PropertyAction QDeclarative1PropertyAction - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The PropertyAction element allows immediate property changes during animation. - - PropertyAction is used to specify an immediate property change during an - animation. The property change is not animated. - - It is useful for setting non-animated property values during an animation. - - For example, here is a SequentialAnimation that sets the image's - \l {Image::}{smooth} property to \c true, animates the width of the image, - then sets \l {Image::}{smooth} back to \c false: - - \snippet doc/src/snippets/qtquick1/propertyaction.qml standalone - - PropertyAction is also useful for setting the exact point at which a property - change should occur during a \l Transition. For example, if PropertyChanges - was used in a \l State to rotate an item around a particular - \l {Item::}{transformOrigin}, it might be implemented like this: - - \snippet doc/src/snippets/qtquick1/propertyaction.qml transition - - However, with this code, the \c transformOrigin is not set until \e after - the animation, as a \l State is taken to define the values at the \e end of - a transition. The animation would rotate at the default \c transformOrigin, - then jump to \c Item.BottomRight. To fix this, insert a PropertyAction - before the RotationAnimation begins: - - \snippet doc/src/snippets/qtquick1/propertyaction-sequential.qml sequential - - This immediately sets the \c transformOrigin property to the value defined - in the end state of the \l Transition (i.e. the value defined in the - PropertyAction object) so that the rotation animation begins with the - correct transform origin. - - \sa {QML Animation and Transitions}, QtDeclarative -*/ -QDeclarative1PropertyAction::QDeclarative1PropertyAction(QObject *parent) -: QDeclarative1AbstractAnimation(*(new QDeclarative1PropertyActionPrivate), parent) -{ - Q_D(QDeclarative1PropertyAction); - d->init(); -} - -QDeclarative1PropertyAction::~QDeclarative1PropertyAction() -{ -} - -void QDeclarative1PropertyActionPrivate::init() -{ - Q_Q(QDeclarative1PropertyAction); - spa = new QActionAnimation_1; - QDeclarative_setParent_noEvent(spa, q); -} - -QObject *QDeclarative1PropertyAction::target() const -{ - Q_D(const QDeclarative1PropertyAction); - return d->target; -} - -void QDeclarative1PropertyAction::setTarget(QObject *o) -{ - Q_D(QDeclarative1PropertyAction); - if (d->target == o) - return; - d->target = o; - emit targetChanged(); -} - -QString QDeclarative1PropertyAction::property() const -{ - Q_D(const QDeclarative1PropertyAction); - return d->propertyName; -} - -void QDeclarative1PropertyAction::setProperty(const QString &n) -{ - Q_D(QDeclarative1PropertyAction); - if (d->propertyName == n) - return; - d->propertyName = n; - emit propertyChanged(); -} - -/*! - \qmlproperty Object QtQuick1::PropertyAction::target - \qmlproperty list<Object> QtQuick1::PropertyAction::targets - \qmlproperty string QtQuick1::PropertyAction::property - \qmlproperty string QtQuick1::PropertyAction::properties - - These properties determine the items and their properties that are - 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 QDeclarative1PropertyAction::properties() const -{ - Q_D(const QDeclarative1PropertyAction); - return d->properties; -} - -void QDeclarative1PropertyAction::setProperties(const QString &p) -{ - Q_D(QDeclarative1PropertyAction); - if (d->properties == p) - return; - d->properties = p; - emit propertiesChanged(p); -} - -QDeclarativeListProperty<QObject> QDeclarative1PropertyAction::targets() -{ - Q_D(QDeclarative1PropertyAction); - return QDeclarativeListProperty<QObject>(this, d->targets); -} - -/*! - \qmlproperty list<Object> QtQuick1::PropertyAction::exclude - This property holds the objects that should not be affected by this action. - - \sa targets -*/ -QDeclarativeListProperty<QObject> QDeclarative1PropertyAction::exclude() -{ - Q_D(QDeclarative1PropertyAction); - return QDeclarativeListProperty<QObject>(this, d->exclude); -} - -/*! - \qmlproperty any QtQuick1::PropertyAction::value - This property holds the value to be set on the property. - - If the PropertyAction is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. -*/ -QVariant QDeclarative1PropertyAction::value() const -{ - Q_D(const QDeclarative1PropertyAction); - return d->value; -} - -void QDeclarative1PropertyAction::setValue(const QVariant &v) -{ - Q_D(QDeclarative1PropertyAction); - if (d->value.isNull || d->value != v) { - d->value = v; - emit valueChanged(v); - } -} - -QAbstractAnimation *QDeclarative1PropertyAction::qtAnimation() -{ - Q_D(QDeclarative1PropertyAction); - return d->spa; -} - -void QDeclarative1PropertyAction::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1PropertyAction); - Q_UNUSED(direction); - - struct QDeclarative1SetPropertyAnimationAction : public QAbstractAnimationAction - { - QDeclarative1StateActions actions; - virtual void doAction() - { - for (int ii = 0; ii < actions.count(); ++ii) { - const QDeclarative1Action &action = actions.at(ii); - QDeclarativePropertyPrivate::write(action.property, action.toValue, QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::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(); - } - - QDeclarative1SetPropertyAnimationAction *data = new QDeclarative1SetPropertyAnimationAction; - - 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) { - QDeclarative1Action myAction; - myAction.property = d->createProperty(targets.at(j), props.at(i), this); - if (myAction.property.isValid()) { - myAction.toValue = d->value; - QDeclarative1PropertyAnimationPrivate::convertVariant(myAction.toValue, myAction.property.propertyType()); - data->actions << myAction; - hasExplicit = true; - for (int ii = 0; ii < actions.count(); ++ii) { - QDeclarative1Action &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) { - QDeclarative1Action &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)))) { - QDeclarative1Action myAction = action; - - if (d->value.isValid()) - myAction.toValue = d->value; - QDeclarative1PropertyAnimationPrivate::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 NumberAnimation QDeclarative1NumberAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits PropertyAnimation - \brief The NumberAnimation element animates changes in qreal-type values. - - NumberAnimation is a specialized PropertyAnimation that defines an - animation to be applied when a numerical value changes. - - Here is a NumberAnimation applied to the \c x property of a \l Rectangle - as a property value source. It animates the \c x value from its current - value to a value of 50, over 1000 milliseconds: - - \snippet doc/src/snippets/qtquick1/numberanimation.qml 0 - - Like any other animation element, a NumberAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - Note that NumberAnimation may not animate smoothly if there are irregular - changes in the number value that it is tracking. If this is the case, use - SmoothedAnimation instead. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1NumberAnimation::QDeclarative1NumberAnimation(QObject *parent) -: QDeclarative1PropertyAnimation(parent) -{ - init(); -} - -QDeclarative1NumberAnimation::QDeclarative1NumberAnimation(QDeclarative1PropertyAnimationPrivate &dd, QObject *parent) -: QDeclarative1PropertyAnimation(dd, parent) -{ - init(); -} - -QDeclarative1NumberAnimation::~QDeclarative1NumberAnimation() -{ -} - -void QDeclarative1NumberAnimation::init() -{ - Q_D(QDeclarative1PropertyAnimation); - d->interpolatorType = QMetaType::QReal; - d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); -} - -/*! - \qmlproperty real QtQuick1::NumberAnimation::from - This property holds the starting value for the animation. - - For example, the following animation is not applied until the \c x value - has reached 100: - - \qml - Item { - states: [ - // ... - ] - - transition: Transition { - NumberAnimation { properties: "x"; from: 100; duration: 200 } - } - } - \endqml - - If the NumberAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the starting state of the - \l Transition, or the current value of the property at the moment the - \l Behavior is triggered. - - \sa {QML Animation and Transitions} -*/ - -qreal QDeclarative1NumberAnimation::from() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->from.toReal(); -} - -void QDeclarative1NumberAnimation::setFrom(qreal f) -{ - QDeclarative1PropertyAnimation::setFrom(f); -} - -/*! - \qmlproperty real QtQuick1::NumberAnimation::to - This property holds the end value for the animation. - - If the NumberAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. - - \sa {QML Animation and Transitions} -*/ -qreal QDeclarative1NumberAnimation::to() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->to.toReal(); -} - -void QDeclarative1NumberAnimation::setTo(qreal t) -{ - QDeclarative1PropertyAnimation::setTo(t); -} - - - -/*! - \qmlclass Vector3dAnimation QDeclarative1Vector3dAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits PropertyAnimation - \brief The Vector3dAnimation element animates changes in QVector3d values. - - Vector3dAnimation is a specialized PropertyAnimation that defines an - animation to be applied when a Vector3d value changes. - - Like any other animation element, a Vector3dAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1Vector3dAnimation::QDeclarative1Vector3dAnimation(QObject *parent) -: QDeclarative1PropertyAnimation(parent) -{ - Q_D(QDeclarative1PropertyAnimation); - d->interpolatorType = QMetaType::QVector3D; - d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); - d->defaultToInterpolatorType = true; -} - -QDeclarative1Vector3dAnimation::~QDeclarative1Vector3dAnimation() -{ -} - -/*! - \qmlproperty real QtQuick1::Vector3dAnimation::from - This property holds the starting value for the animation. - - If the Vector3dAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the starting state of the - \l Transition, or the current value of the property at the moment the - \l Behavior is triggered. - - \sa {QML Animation and Transitions} -*/ -QVector3D QDeclarative1Vector3dAnimation::from() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->from.value<QVector3D>(); -} - -void QDeclarative1Vector3dAnimation::setFrom(QVector3D f) -{ - QDeclarative1PropertyAnimation::setFrom(f); -} - -/*! - \qmlproperty real QtQuick1::Vector3dAnimation::to - This property holds the end value for the animation. - - If the Vector3dAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. - - \sa {QML Animation and Transitions} -*/ -QVector3D QDeclarative1Vector3dAnimation::to() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->to.value<QVector3D>(); -} - -void QDeclarative1Vector3dAnimation::setTo(QVector3D t) -{ - QDeclarative1PropertyAnimation::setTo(t); -} - - - -/*! - \qmlclass RotationAnimation QDeclarative1RotationAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits PropertyAnimation - \brief The RotationAnimation element animates changes in rotation values. - - RotationAnimation is a specialized PropertyAnimation that gives control - over the direction of rotation during an animation. - - By default, it rotates in the direction - of the numerical change; a rotation from 0 to 240 will rotate 240 degrees - clockwise, while a rotation from 240 to 0 will rotate 240 degrees - counterclockwise. The \l direction property can be set to specify the - direction in which the rotation should occur. - - In the following example we use RotationAnimation to animate the rotation - between states via the shortest path: - - \snippet doc/src/snippets/qtquick1/rotationanimation.qml 0 - - Notice the RotationAnimation did not need to set a \l target - value. As a convenience, when used in a transition, RotationAnimation will rotate all - properties named "rotation" or "angle". You can override this by providing - your own properties via \l {PropertyAnimation::properties}{properties} or - \l {PropertyAnimation::property}{property}. - - Also, note the \l Rectangle will be rotated around its default - \l {Item::}{transformOrigin} (which is \c Item.Center). To use a different - transform origin, set the origin in the PropertyChanges object and apply - the change at the start of the animation using PropertyAction. See the - PropertyAction documentation for more details. - - Like any other animation element, a RotationAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -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); -} - -QDeclarative1RotationAnimation::QDeclarative1RotationAnimation(QObject *parent) -: QDeclarative1PropertyAnimation(*(new QDeclarative1RotationAnimationPrivate), parent) -{ - Q_D(QDeclarative1RotationAnimation); - d->interpolatorType = QMetaType::QReal; - d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); - d->defaultProperties = QLatin1String("rotation,angle"); -} - -QDeclarative1RotationAnimation::~QDeclarative1RotationAnimation() -{ -} - -/*! - \qmlproperty real QtQuick1::RotationAnimation::from - This property holds the starting value for the animation. - - For example, the following animation is not applied until the \c angle value - has reached 100: - - \qml - Item { - states: [ - // ... - ] - - transition: Transition { - RotationAnimation { properties: "angle"; from: 100; duration: 2000 } - } - } - \endqml - - If the RotationAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the starting state of the - \l Transition, or the current value of the property at the moment the - \l Behavior is triggered. - - \sa {QML Animation and Transitions} -*/ -qreal QDeclarative1RotationAnimation::from() const -{ - Q_D(const QDeclarative1RotationAnimation); - return d->from.toReal(); -} - -void QDeclarative1RotationAnimation::setFrom(qreal f) -{ - QDeclarative1PropertyAnimation::setFrom(f); -} - -/*! - \qmlproperty real QtQuick1::RotationAnimation::to - This property holds the end value for the animation.. - - If the RotationAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. - - \sa {QML Animation and Transitions} -*/ -qreal QDeclarative1RotationAnimation::to() const -{ - Q_D(const QDeclarative1RotationAnimation); - return d->to.toReal(); -} - -void QDeclarative1RotationAnimation::setTo(qreal t) -{ - QDeclarative1PropertyAnimation::setTo(t); -} - -/*! - \qmlproperty enumeration QtQuick1::RotationAnimation::direction - This property holds the direction of the rotation. - - Possible values are: - - \list - \o RotationAnimation.Numerical (default) - Rotate by linearly interpolating between the two numbers. - A rotation from 10 to 350 will rotate 340 degrees clockwise. - \o RotationAnimation.Clockwise - Rotate clockwise between the two values - \o RotationAnimation.Counterclockwise - Rotate counterclockwise between the two values - \o RotationAnimation.Shortest - Rotate in the direction that produces the shortest animation path. - A rotation from 10 to 350 will rotate 20 degrees counterclockwise. - \endlist -*/ -QDeclarative1RotationAnimation::RotationDirection QDeclarative1RotationAnimation::direction() const -{ - Q_D(const QDeclarative1RotationAnimation); - return d->direction; -} - -void QDeclarative1RotationAnimation::setDirection(QDeclarative1RotationAnimation::RotationDirection direction) -{ - Q_D(QDeclarative1RotationAnimation); - 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(); -} - - - -QDeclarative1AnimationGroup::QDeclarative1AnimationGroup(QObject *parent) -: QDeclarative1AbstractAnimation(*(new QDeclarative1AnimationGroupPrivate), parent) -{ -} - -QDeclarative1AnimationGroup::QDeclarative1AnimationGroup(QDeclarative1AnimationGroupPrivate &dd, QObject *parent) - : QDeclarative1AbstractAnimation(dd, parent) -{ -} - -void QDeclarative1AnimationGroupPrivate::append_animation(QDeclarativeListProperty<QDeclarative1AbstractAnimation> *list, QDeclarative1AbstractAnimation *a) -{ - QDeclarative1AnimationGroup *q = qobject_cast<QDeclarative1AnimationGroup *>(list->object); - if (q) { - a->setGroup(q); - // This is an optimization for the parenting that already occurs via addAnimation - QDeclarative_setParent_noEvent(a->qtAnimation(), q->d_func()->ag); - q->d_func()->ag->addAnimation(a->qtAnimation()); - } -} - -void QDeclarative1AnimationGroupPrivate::clear_animation(QDeclarativeListProperty<QDeclarative1AbstractAnimation> *list) -{ - QDeclarative1AnimationGroup *q = qobject_cast<QDeclarative1AnimationGroup *>(list->object); - if (q) { - while (q->d_func()->animations.count()) { - QDeclarative1AbstractAnimation *firstAnim = q->d_func()->animations.at(0); - QDeclarative_setParent_noEvent(firstAnim->qtAnimation(), 0); - q->d_func()->ag->removeAnimation(firstAnim->qtAnimation()); - firstAnim->setGroup(0); - } - } -} - -QDeclarative1AnimationGroup::~QDeclarative1AnimationGroup() -{ -} - -QDeclarativeListProperty<QDeclarative1AbstractAnimation> QDeclarative1AnimationGroup::animations() -{ - Q_D(QDeclarative1AnimationGroup); - QDeclarativeListProperty<QDeclarative1AbstractAnimation> list(this, d->animations); - list.append = &QDeclarative1AnimationGroupPrivate::append_animation; - list.clear = &QDeclarative1AnimationGroupPrivate::clear_animation; - return list; -} - -/*! - \qmlclass SequentialAnimation QDeclarative1SequentialAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The SequentialAnimation element allows animations to be run sequentially. - - The SequentialAnimation and ParallelAnimation elements allow multiple - animations to be run together. Animations defined in a SequentialAnimation - are run one after the other, while animations defined in a ParallelAnimation - are run at the same time. - - The following example runs two number animations in a sequence. The \l Rectangle - animates to a \c x position of 50, then to a \c y position of 50. - - \snippet doc/src/snippets/qtquick1/sequentialanimation.qml 0 - - Animations defined within a \l Transition are automatically run in parallel, - so SequentialAnimation can be used to enclose the animations in a \l Transition - if this is the preferred behavior. - - Like any other animation element, a SequentialAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \note Once an animation has been grouped into a SequentialAnimation or - ParallelAnimation, it cannot be individually started and stopped; the - SequentialAnimation or ParallelAnimation must be started and stopped as a group. - - \sa ParallelAnimation, {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ - -QDeclarative1SequentialAnimation::QDeclarative1SequentialAnimation(QObject *parent) : - QDeclarative1AnimationGroup(parent) -{ - Q_D(QDeclarative1AnimationGroup); - d->ag = new QSequentialAnimationGroup; - QDeclarative_setParent_noEvent(d->ag, this); -} - -QDeclarative1SequentialAnimation::~QDeclarative1SequentialAnimation() -{ -} - -QAbstractAnimation *QDeclarative1SequentialAnimation::qtAnimation() -{ - Q_D(QDeclarative1AnimationGroup); - return d->ag; -} - -void QDeclarative1SequentialAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1AnimationGroup); - - 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 QDeclarative1ParallelAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The ParallelAnimation element allows animations to be run in parallel. - - The SequentialAnimation and ParallelAnimation elements allow multiple - animations to be run together. Animations defined in a SequentialAnimation - are run one after the other, while animations defined in a ParallelAnimation - are run at the same time. - - The following animation runs two number animations in parallel. The \l Rectangle - moves to (50,50) by animating its \c x and \c y properties at the same time. - - \snippet doc/src/snippets/qtquick1/parallelanimation.qml 0 - - Like any other animation element, a ParallelAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \note Once an animation has been grouped into a SequentialAnimation or - ParallelAnimation, it cannot be individually started and stopped; the - SequentialAnimation or ParallelAnimation must be started and stopped as a group. - - \sa SequentialAnimation, {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1ParallelAnimation::QDeclarative1ParallelAnimation(QObject *parent) : - QDeclarative1AnimationGroup(parent) -{ - Q_D(QDeclarative1AnimationGroup); - d->ag = new QParallelAnimationGroup; - QDeclarative_setParent_noEvent(d->ag, this); -} - -QDeclarative1ParallelAnimation::~QDeclarative1ParallelAnimation() -{ -} - -QAbstractAnimation *QDeclarative1ParallelAnimation::qtAnimation() -{ - Q_D(QDeclarative1AnimationGroup); - return d->ag; -} - -void QDeclarative1ParallelAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1AnimationGroup); - 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 QDeclarative1PropertyAnimationPrivate::convertVariant(QVariant &variant, int type) -{ - if (variant.userType() != QVariant::String) { - variant.convert((QVariant::Type)type); - return; - } - - switch (type) { - case QVariant::Rect: { - variant.setValue(QDeclarativeStringConverters::rectFFromString(variant.toString()).toRect()); - break; - } - case QVariant::RectF: { - variant.setValue(QDeclarativeStringConverters::rectFFromString(variant.toString())); - break; - } - case QVariant::Point: { - variant.setValue(QDeclarativeStringConverters::pointFFromString(variant.toString()).toPoint()); - break; - } - case QVariant::PointF: { - variant.setValue(QDeclarativeStringConverters::pointFFromString(variant.toString())); - break; - } - case QVariant::Size: { - variant.setValue(QDeclarativeStringConverters::sizeFFromString(variant.toString()).toSize()); - break; - } - case QVariant::SizeF: { - variant.setValue(QDeclarativeStringConverters::sizeFFromString(variant.toString())); - break; - } - case QVariant::Color: { - variant.setValue(QDeclarativeStringConverters::colorFromString(variant.toString())); - break; - } - case QVariant::Vector3D: { - variant.setValue(QDeclarativeStringConverters::vector3DFromString(variant.toString())); - break; - } - default: - if (QDeclarativeValueTypeFactory::isValueType((uint)type)) { - variant.convert((QVariant::Type)type); - } else { - QDeclarativeMetaType::StringConverter converter = QDeclarativeMetaType::customStringConverter(type); - if (converter) - variant = converter(variant.toString()); - } - break; - } -} - -/*! - \qmlclass PropertyAnimation QDeclarative1PropertyAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The PropertyAnimation element animates changes in property values. - - PropertyAnimation provides a way to animate changes to a property's value. - - It can be used to define animations in a number of ways: - - \list - \o In a \l Transition - - For example, to animate any objects that have changed their \c x or \c y properties - as a result of a state change, using an \c InOutQuad easing curve: - - \snippet doc/src/snippets/qtquick1/propertyanimation.qml transition - - - \o In a \l Behavior - - For example, to animate all changes to a rectangle's \c x property: - - \snippet doc/src/snippets/qtquick1/propertyanimation.qml behavior - - - \o As a property value source - - For example, to repeatedly animate the rectangle's \c x property: - - \snippet doc/src/snippets/qtquick1/propertyanimation.qml propertyvaluesource - - - \o In a signal handler - - For example, to fade out \c theObject when clicked: - \qml - MouseArea { - anchors.fill: theObject - onClicked: PropertyAnimation { target: theObject; property: "opacity"; to: 0 } - } - \endqml - - \o Standalone - - For example, to animate \c rect's \c width property over 500ms, from its current width to 30: - - \snippet doc/src/snippets/qtquick1/propertyanimation.qml standalone - - \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 and Transitions} introduction. - - Note that PropertyAnimation inherits the abstract \l Animation element. - This includes additional properties and methods for controlling the animation. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ - -QDeclarative1PropertyAnimation::QDeclarative1PropertyAnimation(QObject *parent) -: QDeclarative1AbstractAnimation(*(new QDeclarative1PropertyAnimationPrivate), parent) -{ - Q_D(QDeclarative1PropertyAnimation); - d->init(); -} - -QDeclarative1PropertyAnimation::QDeclarative1PropertyAnimation(QDeclarative1PropertyAnimationPrivate &dd, QObject *parent) -: QDeclarative1AbstractAnimation(dd, parent) -{ - Q_D(QDeclarative1PropertyAnimation); - d->init(); -} - -QDeclarative1PropertyAnimation::~QDeclarative1PropertyAnimation() -{ -} - -void QDeclarative1PropertyAnimationPrivate::init() -{ - Q_Q(QDeclarative1PropertyAnimation); - va = new QDeclarative1BulkValueAnimator; - QDeclarative_setParent_noEvent(va, q); -} - -/*! - \qmlproperty int QtQuick1::PropertyAnimation::duration - This property holds the duration of the animation, in milliseconds. - - The default value is 250. -*/ -int QDeclarative1PropertyAnimation::duration() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->va->duration(); -} - -void QDeclarative1PropertyAnimation::setDuration(int duration) -{ - if (duration < 0) { - qmlInfo(this) << tr("Cannot set a duration of < 0"); - return; - } - - Q_D(QDeclarative1PropertyAnimation); - if (d->va->duration() == duration) - return; - d->va->setDuration(duration); - emit durationChanged(duration); -} - -/*! - \qmlproperty real QtQuick1::PropertyAnimation::from - This property holds the starting value for the animation. - - If the PropertyAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the starting state of the - \l Transition, or the current value of the property at the moment the - \l Behavior is triggered. - - \sa {QML Animation and Transitions} -*/ -QVariant QDeclarative1PropertyAnimation::from() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->from; -} - -void QDeclarative1PropertyAnimation::setFrom(const QVariant &f) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->fromIsDefined && f == d->from) - return; - d->from = f; - d->fromIsDefined = f.isValid(); - emit fromChanged(f); -} - -/*! - \qmlproperty real QtQuick1::PropertyAnimation::to - This property holds the end value for the animation. - - If the PropertyAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. - - \sa {QML Animation and Transitions} -*/ -QVariant QDeclarative1PropertyAnimation::to() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->to; -} - -void QDeclarative1PropertyAnimation::setTo(const QVariant &t) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->toIsDefined && t == d->to) - return; - d->to = t; - d->toIsDefined = t.isValid(); - emit toChanged(t); -} - -/*! - \qmlproperty enumeration QtQuick1::PropertyAnimation::easing.type - \qmlproperty real QtQuick1::PropertyAnimation::easing.amplitude - \qmlproperty real QtQuick1::PropertyAnimation::easing.overshoot - \qmlproperty real QtQuick1::PropertyAnimation::easing.period - \brief the easing curve used for the animation. - - To specify an easing curve you need to specify at least the type. For some curves you can also specify - amplitude, period and/or overshoot (more details provided after the table). The default easing curve is - \c Easing.Linear. - - \qml - PropertyAnimation { properties: "y"; easing.type: Easing.InOutElastic; easing.amplitude: 2.0; easing.period: 1.5 } - \endqml - - Available types are: - - \table - \row - \o \c Easing.Linear - \o Easing curve for a linear (t) function: velocity is constant. - \o \inlineimage qeasingcurve-linear.png - \row - \o \c Easing.InQuad - \o Easing curve for a quadratic (t^2) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-inquad.png - \row - \o \c Easing.OutQuad - \o Easing curve for a quadratic (t^2) function: decelerating to zero velocity. - \o \inlineimage qeasingcurve-outquad.png - \row - \o \c Easing.InOutQuad - \o Easing curve for a quadratic (t^2) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutquad.png - \row - \o \c Easing.OutInQuad - \o Easing curve for a quadratic (t^2) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outinquad.png - \row - \o \c Easing.InCubic - \o Easing curve for a cubic (t^3) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-incubic.png - \row - \o \c Easing.OutCubic - \o Easing curve for a cubic (t^3) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outcubic.png - \row - \o \c Easing.InOutCubic - \o Easing curve for a cubic (t^3) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutcubic.png - \row - \o \c Easing.OutInCubic - \o Easing curve for a cubic (t^3) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outincubic.png - \row - \o \c Easing.InQuart - \o Easing curve for a quartic (t^4) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-inquart.png - \row - \o \c Easing.OutQuart - \o Easing curve for a quartic (t^4) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outquart.png - \row - \o \c Easing.InOutQuart - \o Easing curve for a quartic (t^4) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutquart.png - \row - \o \c Easing.OutInQuart - \o Easing curve for a quartic (t^4) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outinquart.png - \row - \o \c Easing.InQuint - \o Easing curve for a quintic (t^5) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-inquint.png - \row - \o \c Easing.OutQuint - \o Easing curve for a quintic (t^5) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outquint.png - \row - \o \c Easing.InOutQuint - \o Easing curve for a quintic (t^5) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutquint.png - \row - \o \c Easing.OutInQuint - \o Easing curve for a quintic (t^5) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outinquint.png - \row - \o \c Easing.InSine - \o Easing curve for a sinusoidal (sin(t)) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-insine.png - \row - \o \c Easing.OutSine - \o Easing curve for a sinusoidal (sin(t)) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outsine.png - \row - \o \c Easing.InOutSine - \o Easing curve for a sinusoidal (sin(t)) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutsine.png - \row - \o \c Easing.OutInSine - \o Easing curve for a sinusoidal (sin(t)) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outinsine.png - \row - \o \c Easing.InExpo - \o Easing curve for an exponential (2^t) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-inexpo.png - \row - \o \c Easing.OutExpo - \o Easing curve for an exponential (2^t) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outexpo.png - \row - \o \c Easing.InOutExpo - \o Easing curve for an exponential (2^t) function: acceleration until halfway, then deceleration. - \o \inlineimage qeasingcurve-inoutexpo.png - \row - \o \c Easing.OutInExpo - \o Easing curve for an exponential (2^t) function: deceleration until halfway, then acceleration. - \o \inlineimage qeasingcurve-outinexpo.png - \row - \o \c Easing.InCirc - \o Easing curve for a circular (sqrt(1-t^2)) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-incirc.png - \row - \o \c Easing.OutCirc - \o Easing curve for a circular (sqrt(1-t^2)) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outcirc.png - \row - \o \c Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.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 Easing.InBounce - \o Easing curve for a bounce (exponentially decaying parabolic bounce) function: accelerating from zero velocity. - \o \inlineimage qeasingcurve-inbounce.png - \row - \o \c Easing.OutBounce - \o Easing curve for a bounce (exponentially decaying parabolic bounce) function: decelerating from zero velocity. - \o \inlineimage qeasingcurve-outbounce.png - \row - \o \c Easing.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 Easing.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 - - \c easing.amplitude is only applicable for bounce and elastic curves (curves of type - \c Easing.InBounce, \c Easing.OutBounce, \c Easing.InOutBounce, \c Easing.OutInBounce, \c Easing.InElastic, - \c Easing.OutElastic, \c Easing.InOutElastic or \c Easing.OutInElastic). - - \c easing.overshoot is only applicable if \c easing.type is: \c Easing.InBack, \c Easing.OutBack, - \c Easing.InOutBack or \c Easing.OutInBack. - - \c easing.period is only applicable if easing.type is: \c Easing.InElastic, \c Easing.OutElastic, - \c Easing.InOutElastic or \c Easing.OutInElastic. - - See the \l {declarative/animation/easing}{easing} example for a demonstration of - the different easing settings. -*/ -QEasingCurve QDeclarative1PropertyAnimation::easing() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->va->easingCurve(); -} - -void QDeclarative1PropertyAnimation::setEasing(const QEasingCurve &e) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->va->easingCurve() == e) - return; - - d->va->setEasingCurve(e); - emit easingChanged(e); -} - -QObject *QDeclarative1PropertyAnimation::target() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->target; -} - -void QDeclarative1PropertyAnimation::setTarget(QObject *o) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->target == o) - return; - d->target = o; - emit targetChanged(); -} - -QString QDeclarative1PropertyAnimation::property() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->propertyName; -} - -void QDeclarative1PropertyAnimation::setProperty(const QString &n) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->propertyName == n) - return; - d->propertyName = n; - emit propertyChanged(); -} - -QString QDeclarative1PropertyAnimation::properties() const -{ - Q_D(const QDeclarative1PropertyAnimation); - return d->properties; -} - -void QDeclarative1PropertyAnimation::setProperties(const QString &prop) -{ - Q_D(QDeclarative1PropertyAnimation); - if (d->properties == prop) - return; - - d->properties = prop; - emit propertiesChanged(prop); -} - -/*! - \qmlproperty string QtQuick1::PropertyAnimation::properties - \qmlproperty list<Object> QtQuick1::PropertyAnimation::targets - \qmlproperty string QtQuick1::PropertyAnimation::property - \qmlproperty Object QtQuick1::PropertyAnimation::target - - 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. - - The \c targets property allows multiple targets to be set. For example, this animates the - \c x property of both \c itemA and \c itemB: - - \qml - NumberAnimation { targets: [itemA, itemB]; properties: "x"; to: 500 } - \endqml - - In many cases these properties do not need to be explicitly specified, as 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) - NumberAnimation on x { to: 500; loops: Animation.Infinite } //animate theRect's x property - Behavior on y { 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, {QML Animation and Transitions} -*/ -QDeclarativeListProperty<QObject> QDeclarative1PropertyAnimation::targets() -{ - Q_D(QDeclarative1PropertyAnimation); - return QDeclarativeListProperty<QObject>(this, d->targets); -} - -/*! - \qmlproperty list<Object> QtQuick1::PropertyAnimation::exclude - This property holds the items not to be affected by this animation. - \sa PropertyAnimation::targets -*/ -QDeclarativeListProperty<QObject> QDeclarative1PropertyAnimation::exclude() -{ - Q_D(QDeclarative1PropertyAnimation); - return QDeclarativeListProperty<QObject>(this, d->exclude); -} - -QAbstractAnimation *QDeclarative1PropertyAnimation::qtAnimation() -{ - Q_D(QDeclarative1PropertyAnimation); - return d->va; -} - -void QDeclarative1AnimationPropertyUpdater::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; - for (int ii = 0; ii < actions.count(); ++ii) { - QDeclarative1Action &action = actions[ii]; - - if (v == 1.) - QDeclarativePropertyPrivate::write(action.property, action.toValue, QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::DontRemoveBinding); - else { - if (!fromSourced && !fromDefined) { - action.fromValue = action.property.read(); - if (interpolatorType) - QDeclarative1PropertyAnimationPrivate::convertVariant(action.fromValue, interpolatorType); - } - if (!interpolatorType) { - int propType = action.property.propertyType(); - if (!prevInterpolatorType || prevInterpolatorType != propType) { - prevInterpolatorType = propType; - interpolator = QVariantAnimationPrivate::getInterpolator(prevInterpolatorType); - } - } - if (interpolator) - QDeclarativePropertyPrivate::write(action.property, interpolator(action.fromValue.constData(), action.toValue.constData(), v), QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::DontRemoveBinding); - } - if (deleted) - return; - } - wasDeleted = 0; - fromSourced = true; -} - -void QDeclarative1PropertyAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1PropertyAnimation); - - 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(',')); - } - - QDeclarative1AnimationPropertyUpdater *data = new QDeclarative1AnimationPropertyUpdater; - 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) { - QDeclarative1Action 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) { - QDeclarative1Action &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) { - QDeclarative1Action &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))) { - QDeclarative1Action 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); - d->actions = &data->actions; - } else { - delete data; - d->va->setFromSourcedValue(0); //clear previous data - d->va->setAnimValue(0, QAbstractAnimation::DeleteWhenStopped); //clear previous data - d->actions = 0; - } -} - -/*! - \qmlclass ParentAnimation QDeclarative1ParentAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The ParentAnimation element animates changes in parent values. - - ParentAnimation is used to animate a parent change for an \l Item. - - For example, the following ParentChange changes \c blueRect to become - a child of \c redRect when it is clicked. The inclusion of the - ParentAnimation, which defines a NumberAnimation to be applied during - the transition, ensures the item animates smoothly as it moves to - its new parent: - - \snippet doc/src/snippets/qtquick1/parentanimation.qml 0 - - A ParentAnimation can contain any number of animations. These animations will - be run in parallel; to run them sequentially, define them within a - SequentialAnimation. - - In some cases, such as when reparenting between items with clipping enabled, it is useful - to animate the parent change via another item that does not have clipping - enabled. Such an item can be set using the \l via property. - - For convenience, when a ParentAnimation is used in a \l Transition, it will - animate any ParentChange that has occurred during the state change. - This can be overridden by setting a specific target item using the - \l target property. - - Like any other animation element, a ParentAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \sa {QML Animation and Transitions}, {declarative/animation/basics}{Animation basics example} -*/ -QDeclarative1ParentAnimation::QDeclarative1ParentAnimation(QObject *parent) - : QDeclarative1AnimationGroup(*(new QDeclarative1ParentAnimationPrivate), parent) -{ - Q_D(QDeclarative1ParentAnimation); - d->topLevelGroup = new QSequentialAnimationGroup; - QDeclarative_setParent_noEvent(d->topLevelGroup, this); - - d->startAction = new QActionAnimation_1; - QDeclarative_setParent_noEvent(d->startAction, d->topLevelGroup); - d->topLevelGroup->addAnimation(d->startAction); - - d->ag = new QParallelAnimationGroup; - QDeclarative_setParent_noEvent(d->ag, d->topLevelGroup); - d->topLevelGroup->addAnimation(d->ag); - - d->endAction = new QActionAnimation_1; - QDeclarative_setParent_noEvent(d->endAction, d->topLevelGroup); - d->topLevelGroup->addAnimation(d->endAction); -} - -QDeclarative1ParentAnimation::~QDeclarative1ParentAnimation() -{ -} - -/*! - \qmlproperty Item QtQuick1::ParentAnimation::target - The item to reparent. - - When used in a transition, if no target is specified, all - ParentChange occurrences are animated by the ParentAnimation. -*/ -QDeclarativeItem *QDeclarative1ParentAnimation::target() const -{ - Q_D(const QDeclarative1ParentAnimation); - return d->target; -} - -void QDeclarative1ParentAnimation::setTarget(QDeclarativeItem *target) -{ - Q_D(QDeclarative1ParentAnimation); - if (target == d->target) - return; - - d->target = target; - emit targetChanged(); -} - -/*! - \qmlproperty Item QtQuick1::ParentAnimation::newParent - The new parent to animate to. - - If the ParentAnimation is defined within a \l Transition or \l Behavior, - this value defaults to the value defined in the end state of the - \l Transition, or the value of the property change that triggered the - \l Behavior. -*/ -QDeclarativeItem *QDeclarative1ParentAnimation::newParent() const -{ - Q_D(const QDeclarative1ParentAnimation); - return d->newParent; -} - -void QDeclarative1ParentAnimation::setNewParent(QDeclarativeItem *newParent) -{ - Q_D(QDeclarative1ParentAnimation); - if (newParent == d->newParent) - return; - - d->newParent = newParent; - emit newParentChanged(); -} - -/*! - \qmlproperty Item QtQuick1::ParentAnimation::via - The item to reparent via. This provides a way to do an unclipped animation - when both the old parent and new parent are clipped. - - \qml - ParentAnimation { - target: myItem - via: topLevelItem - // ... - } - \endqml -*/ -QDeclarativeItem *QDeclarative1ParentAnimation::via() const -{ - Q_D(const QDeclarative1ParentAnimation); - return d->via; -} - -void QDeclarative1ParentAnimation::setVia(QDeclarativeItem *via) -{ - Q_D(QDeclarative1ParentAnimation); - if (via == d->via) - return; - - d->via = via; - emit viaChanged(); -} - -//### mirrors same-named function in QDeclarativeItem -QPointF QDeclarative1ParentAnimationPrivate::computeTransformOrigin(QDeclarativeItem::TransformOrigin origin, qreal width, qreal height) const -{ - switch(origin) { - default: - case QDeclarativeItem::TopLeft: - return QPointF(0, 0); - case QDeclarativeItem::Top: - return QPointF(width / 2., 0); - case QDeclarativeItem::TopRight: - return QPointF(width, 0); - case QDeclarativeItem::Left: - return QPointF(0, height / 2.); - case QDeclarativeItem::Center: - return QPointF(width / 2., height / 2.); - case QDeclarativeItem::Right: - return QPointF(width, height / 2.); - case QDeclarativeItem::BottomLeft: - return QPointF(0, height); - case QDeclarativeItem::Bottom: - return QPointF(width / 2., height); - case QDeclarativeItem::BottomRight: - return QPointF(width, height); - } -} - -void QDeclarative1ParentAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_D(QDeclarative1ParentAnimation); - - struct QDeclarative1ParentAnimationData : public QAbstractAnimationAction - { - QDeclarative1ParentAnimationData() {} - ~QDeclarative1ParentAnimationData() { qDeleteAll(pc); } - - QDeclarative1StateActions actions; - //### reverse should probably apply on a per-action basis - bool reverse; - QList<QDeclarative1ParentChange *> pc; - virtual void doAction() - { - for (int ii = 0; ii < actions.count(); ++ii) { - const QDeclarative1Action &action = actions.at(ii); - if (reverse) - action.event->reverse(); - else - action.event->execute(); - } - } - }; - - QDeclarative1ParentAnimationData *data = new QDeclarative1ParentAnimationData; - QDeclarative1ParentAnimationData *viaData = new QDeclarative1ParentAnimationData; - - bool hasExplicit = false; - if (d->target && d->newParent) { - data->reverse = false; - QDeclarative1Action myAction; - QDeclarative1ParentChange *pc = new QDeclarative1ParentChange; - pc->setObject(d->target); - pc->setParent(d->newParent); - myAction.event = pc; - data->pc << pc; - data->actions << myAction; - hasExplicit = true; - if (d->via) { - viaData->reverse = false; - QDeclarative1Action myVAction; - QDeclarative1ParentChange *vpc = new QDeclarative1ParentChange; - vpc->setObject(d->target); - vpc->setParent(d->via); - myVAction.event = vpc; - viaData->pc << vpc; - viaData->actions << myVAction; - } - //### once actions have concept of modified, - // loop to match appropriate ParentChanges and mark as modified - } - - if (!hasExplicit) - for (int i = 0; i < actions.size(); ++i) { - QDeclarative1Action &action = actions[i]; - if (action.event && action.event->typeName() == QLatin1String("ParentChange") - && (!d->target || static_cast<QDeclarative1ParentChange*>(action.event)->object() == d->target)) { - - QDeclarative1ParentChange *pc = static_cast<QDeclarative1ParentChange*>(action.event); - QDeclarative1Action myAction = action; - data->reverse = action.reverseEvent; - - //### this logic differs from PropertyAnimation - // (probably a result of modified vs. done) - if (d->newParent) { - QDeclarative1ParentChange *epc = new QDeclarative1ParentChange; - epc->setObject(static_cast<QDeclarative1ParentChange*>(action.event)->object()); - epc->setParent(d->newParent); - myAction.event = epc; - data->pc << epc; - data->actions << myAction; - pc = epc; - } else { - action.actionDone = true; - data->actions << myAction; - } - - if (d->via) { - viaData->reverse = false; - QDeclarative1Action myAction; - QDeclarative1ParentChange *vpc = new QDeclarative1ParentChange; - vpc->setObject(pc->object()); - vpc->setParent(d->via); - myAction.event = vpc; - viaData->pc << vpc; - viaData->actions << myAction; - QDeclarative1Action dummyAction; - QDeclarative1Action &xAction = pc->xIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction; - QDeclarative1Action &yAction = pc->yIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction; - QDeclarative1Action &sAction = pc->scaleIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction; - QDeclarative1Action &rAction = pc->rotationIsSet() && i < actions.size()-1 ? actions[++i] : dummyAction; - QDeclarativeItem *target = pc->object(); - QDeclarativeItem *targetParent = action.reverseEvent ? pc->originalParent() : pc->parent(); - - //### this mirrors the logic in QDeclarative1ParentChange. - bool ok; - const QTransform &transform = targetParent->itemTransform(d->via, &ok); - if (transform.type() >= QTransform::TxShear || !ok) { - qmlInfo(this) << QDeclarative1ParentAnimation::tr("Unable to preserve appearance under complex transform"); - ok = false; - } - - qreal scale = 1; - qreal rotation = 0; - bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0); - if (ok && !isRotate) { - if (transform.m11() == transform.m22()) - scale = transform.m11(); - else { - qmlInfo(this) << QDeclarative1ParentAnimation::tr("Unable to preserve appearance under non-uniform scale"); - ok = false; - } - } else if (ok && isRotate) { - if (transform.m11() == transform.m22()) - scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12()); - else { - qmlInfo(this) << QDeclarative1ParentAnimation::tr("Unable to preserve appearance under non-uniform scale"); - ok = false; - } - - if (scale != 0) - rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI; - else { - qmlInfo(this) << QDeclarative1ParentAnimation::tr("Unable to preserve appearance under scale of 0"); - ok = false; - } - } - - const QPointF &point = transform.map(QPointF(xAction.toValue.toReal(),yAction.toValue.toReal())); - qreal x = point.x(); - qreal y = point.y(); - if (ok && target->transformOrigin() != QDeclarativeItem::TopLeft) { - qreal w = target->width(); - qreal h = target->height(); - if (pc->widthIsSet() && i < actions.size() - 1) - w = actions[++i].toValue.toReal(); - if (pc->heightIsSet() && i < actions.size() - 1) - h = actions[++i].toValue.toReal(); - const QPointF &transformOrigin - = d->computeTransformOrigin(target->transformOrigin(), w,h); - qreal tempxt = transformOrigin.x(); - qreal tempyt = transformOrigin.y(); - QTransform t; - t.translate(-tempxt, -tempyt); - t.rotate(rotation); - t.scale(scale, scale); - t.translate(tempxt, tempyt); - const QPointF &offset = t.map(QPointF(0,0)); - x += offset.x(); - y += offset.y(); - } - - if (ok) { - //qDebug() << x << y << rotation << scale; - xAction.toValue = x; - yAction.toValue = y; - sAction.toValue = sAction.toValue.toReal() * scale; - rAction.toValue = rAction.toValue.toReal() + rotation; - } - } - } - } - - if (data->actions.count()) { - if (direction == QDeclarative1AbstractAnimation::Forward) { - d->startAction->setAnimAction(d->via ? viaData : data, QActionAnimation_1::DeleteWhenStopped); - d->endAction->setAnimAction(d->via ? data : 0, QActionAnimation_1::DeleteWhenStopped); - } else { - d->endAction->setAnimAction(d->via ? viaData : data, QActionAnimation_1::DeleteWhenStopped); - d->startAction->setAnimAction(d->via ? data : 0, QActionAnimation_1::DeleteWhenStopped); - } - if (!d->via) - delete viaData; - } else { - delete data; - delete viaData; - } - - //take care of any child animations - 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); - } - -} - -QAbstractAnimation *QDeclarative1ParentAnimation::qtAnimation() -{ - Q_D(QDeclarative1ParentAnimation); - return d->topLevelGroup; -} - -/*! - \qmlclass AnchorAnimation QDeclarative1AnchorAnimation - \inqmlmodule QtQuick 1 - \ingroup qml-animation-transition - \since QtQuick 1.0 - \inherits Animation - \brief The AnchorAnimation element animates changes in anchor values. - - AnchorAnimation is used to animate an anchor change. - - In the following snippet we animate the addition of a right anchor to a \l Rectangle: - - \snippet doc/src/snippets/qtquick1/anchoranimation.qml 0 - - For convenience, when an AnchorAnimation is used in a \l Transition, it will - animate any AnchorChanges that have occurred during the state change. - This can be overridden by setting a specific target item using the - \l target property. - - Like any other animation element, an AnchorAnimation can be applied in a - number of ways, including transitions, behaviors and property value - sources. The \l {QML Animation and Transitions} documentation shows a - variety of methods for creating animations. - - \sa {QML Animation and Transitions}, AnchorChanges -*/ - -QDeclarative1AnchorAnimation::QDeclarative1AnchorAnimation(QObject *parent) -: QDeclarative1AbstractAnimation(*(new QDeclarative1AnchorAnimationPrivate), parent) -{ - Q_D(QDeclarative1AnchorAnimation); - d->va = new QDeclarative1BulkValueAnimator; - QDeclarative_setParent_noEvent(d->va, this); -} - -QDeclarative1AnchorAnimation::~QDeclarative1AnchorAnimation() -{ -} - -QAbstractAnimation *QDeclarative1AnchorAnimation::qtAnimation() -{ - Q_D(QDeclarative1AnchorAnimation); - return d->va; -} - -/*! - \qmlproperty list<Item> QtQuick1::AnchorAnimation::targets - The items to reanchor. - - If no targets are specified all AnchorChanges will be - animated by the AnchorAnimation. -*/ -QDeclarativeListProperty<QDeclarativeItem> QDeclarative1AnchorAnimation::targets() -{ - Q_D(QDeclarative1AnchorAnimation); - return QDeclarativeListProperty<QDeclarativeItem>(this, d->targets); -} - -/*! - \qmlproperty int QtQuick1::AnchorAnimation::duration - This property holds the duration of the animation, in milliseconds. - - The default value is 250. -*/ -int QDeclarative1AnchorAnimation::duration() const -{ - Q_D(const QDeclarative1AnchorAnimation); - return d->va->duration(); -} - -void QDeclarative1AnchorAnimation::setDuration(int duration) -{ - if (duration < 0) { - qmlInfo(this) << tr("Cannot set a duration of < 0"); - return; - } - - Q_D(QDeclarative1AnchorAnimation); - if (d->va->duration() == duration) - return; - d->va->setDuration(duration); - emit durationChanged(duration); -} - -/*! - \qmlproperty enumeration QtQuick1::AnchorAnimation::easing.type - \qmlproperty real QtQuick1::AnchorAnimation::easing.amplitude - \qmlproperty real QtQuick1::AnchorAnimation::easing.overshoot - \qmlproperty real QtQuick1::AnchorAnimation::easing.period - \brief the easing curve used for the animation. - - To specify an easing curve you need to specify at least the type. For some curves you can also specify - amplitude, period and/or overshoot. The default easing curve is - Linear. - - \qml - AnchorAnimation { easing.type: Easing.InOutQuad } - \endqml - - See the \l{PropertyAnimation::easing.type} documentation for information - about the different types of easing curves. -*/ - -QEasingCurve QDeclarative1AnchorAnimation::easing() const -{ - Q_D(const QDeclarative1AnchorAnimation); - return d->va->easingCurve(); -} - -void QDeclarative1AnchorAnimation::setEasing(const QEasingCurve &e) -{ - Q_D(QDeclarative1AnchorAnimation); - if (d->va->easingCurve() == e) - return; - - d->va->setEasingCurve(e); - emit easingChanged(e); -} - -void QDeclarative1AnchorAnimation::transition(QDeclarative1StateActions &actions, - QDeclarativeProperties &modified, - TransitionDirection direction) -{ - Q_UNUSED(modified); - Q_D(QDeclarative1AnchorAnimation); - QDeclarative1AnimationPropertyUpdater *data = new QDeclarative1AnimationPropertyUpdater; - data->interpolatorType = QMetaType::QReal; - data->interpolator = d->interpolator; - - data->reverse = direction == Backward ? true : false; - data->fromSourced = false; - data->fromDefined = false; - - for (int ii = 0; ii < actions.count(); ++ii) { - QDeclarative1Action &action = actions[ii]; - if (action.event && action.event->typeName() == QLatin1String("AnchorChanges") - && (d->targets.isEmpty() || d->targets.contains(static_cast<QDeclarative1AnchorChanges*>(action.event)->object()))) { - data->actions << static_cast<QDeclarative1AnchorChanges*>(action.event)->additionalActions(); - } - } - - 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; - } -} - -QDeclarative1ScriptActionPrivate::QDeclarative1ScriptActionPrivate() - : QDeclarative1AbstractAnimationPrivate(), hasRunScriptScript(false), reversing(false), proxy(this), rsa(0) {} - - - - -QT_END_NAMESPACE |