///////////////////////////////////////////////////////////////////////// // customanimation.cpp // // // // Copyright (C) 2010 Igor Oliveira // // Copyright (C) 2010 Adenilson Cavalcanti namespace Plasma { CustomAnimation::CustomAnimation(QObject *parent) : Animation(parent) { } QString CustomAnimation::callback() const { return m_method; } void CustomAnimation::setCallback(const QString &slot) { m_method = slot; } QVariant CustomAnimation::startValue() const { return m_startValue; } void CustomAnimation::setStartValue(const QVariant &value) { m_startValue = value; } QVariant CustomAnimation::endValue() const { return m_endValue; } void CustomAnimation::setEndValue(const QVariant &value) { m_endValue = value; } void CustomAnimation::updateCurrentTime(int currentTime) { QGraphicsWidget *obj = targetWidget(); if (obj) { qreal delta = currentTime / qreal(duration()); delta = Animation::easingCurve().valueForProgress(delta); const QVariant retValue = interpolate(startValue(), endValue(), delta); QMetaObject::invokeMethod(obj, m_method.toUtf8().data(), Q_ARG(QVariant, retValue)); } Animation::updateCurrentTime(currentTime); } QVariant CustomAnimation::interpolate(const QVariant &start, const QVariant &end, qreal delta) { QVariant retValue; if (start.type() != end.type()) { return retValue; } if (start.type() == QVariant::Double) { qreal realStartValue = start.toReal(); qreal realEndValue = end.toReal(); qreal retRealValue = (realStartValue - realEndValue) * delta; retValue = QVariant(retRealValue); } else if (start.type() == QVariant::Int) { int intStartValue = start.toInt(); int intEndValue = end.toInt(); int retIntValue = (intStartValue - intEndValue) * delta; retValue = QVariant(retIntValue); } else if (start.type() == QVariant::RectF) { QRectF rectfStartValue = start.toRectF(); QRectF rectfEndValue = end.toRectF(); QRectF retRectfValue = QRectF((rectfStartValue.x() - rectfEndValue.x()) * delta, (rectfStartValue.y() - rectfEndValue.x()) * delta, (rectfStartValue.width() - rectfEndValue.width()) * delta, (rectfStartValue.height() - rectfEndValue.height()) * delta); retValue = QVariant(retRectfValue); } return retValue; } }