diff -r 000000000000 -r 16d8024aca5e src/hbcore/effects/hbeffectanimation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbcore/effects/hbeffectanimation.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,153 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbCore module of the UI Extensions for Mobile. +** +** 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ +#include +#include "hbeffectanimation_p.h" +#include "hbeffectgroup_p.h" +#include "hbeffectdef_p.h" +#include "hbeffectfxmldata_p.h" +#include +#include + +HbEffectAnimation::HbEffectAnimation() : + QVariantAnimation(), + mCurve(QEasingCurve::Linear), + mLoopStart(-1), + mLoopEnd(-1), + mInactive(false), + mFinished(false) +{ + connect(this, SIGNAL(finished()), this, SLOT(handleFinished())); +} + +HbEffectAnimation::~HbEffectAnimation() +{ +} + +void HbEffectAnimation::addLooping(const HbEffectFxmlParamData *param, HbEffectGroup *group) +{ + if (param) { + if (param->loopDefined()) { + int duration = QVariantAnimation::duration(); + + int loopStart = (int)(param->loopStart() * float(duration)); + int loopEnd = (int)(param->loopEnd() * float(duration)); + + // Limit given values to valid range + loopStart = qBound(0, loopStart, duration); + loopEnd = qBound(0, loopEnd, duration); + + // Add looping range to animation if loop end is after its start + if (loopEnd > loopStart) { + mLoopStart = loopStart; + mLoopEnd = loopEnd; + group->setLooping(true); + } + } + } +} + +void HbEffectAnimation::updateCurrentValue(const QVariant &value) +{ + if (mInactive) { + return; + } + + // If there is a loop defined, check whether the current time of + // the animation is past the loop end. If it is, do not update the effect with that value + // but instead change the current time back to (loopStartTime + currentTime - LoopEndTime). + + if (looping()) { + int current = currentTime(); + + if (current > mLoopEnd) { + int newCurrentTime = mLoopStart + current - mLoopEnd; + + // If the calculated new current time is again beyond the loop end, + // change it to the loop end to avoid infinite recursion. + if (newCurrentTime > mLoopEnd) { + newCurrentTime = mLoopEnd; + } + + //qDebug() << "Loop restarted: current time changed from" << current << "to" << newCurrentTime; + + // Set the current time of the animation according to the defined loop, + // it will create a callback to this function again. + setCurrentTime(newCurrentTime); + return; + } + } + + // Create a callback to derived classes + handleAnimationUpdate(value); +} + +void HbEffectAnimation::handleFinished() +{ + // Restart loop if the animation is looping + if (looping()) { + int current = currentTime(); + int newCurrentTime = mLoopStart + current - mLoopEnd; + + // If the calculated new current time is again beyond the loop end, + // change it to the loop end to avoid infinite recursion. + if (newCurrentTime > mLoopEnd) { + newCurrentTime = mLoopEnd; + } + + //qDebug() << "Loop restarted: current time changed from" << current << "to" << newCurrentTime; + + // Temporarily prevent the animation from reacting to update request, + // because start() causes update with time=0 and the loop might start from a later point of time. + mInactive = true; + // Restart the animation + start(); + mInactive = false; + // Set the current time of the animation according to the defined loop. + setCurrentTime(newCurrentTime); + } + // Otherwise handle finish + else { + mFinished = true; + // Create a callback to derived classes + handleAnimationFinish(); + } +} + +QVariant HbEffectAnimation::interpolated(const QVariant &from, const QVariant &to, qreal progress) const +{ + // Interpolation is handled here so that we can apply curve shape to each keyframe separately. + // QVariantAnimation would apply the curve shape to the whole animation. + + qreal fromValue = qVariantValue(from); + qreal toValue = qVariantValue(to); + + return fromValue + mCurve.valueForProgress(progress) * (toValue - fromValue); +} + +// End of File + + + +