From a51ab88ce0c8d49e5faabf6a5c5126c2ace4f93c Mon Sep 17 00:00:00 2001 From: Igor Trindade Oliveira Date: Mon, 11 Jan 2010 17:26:36 +0000 Subject: [PATCH] Add support to custom animations svn path=/trunk/KDE/kdelibs/; revision=1073131 --- CMakeLists.txt | 1 + animations/customanimation.cpp | 114 +++++++++++++++++++++++++++++++++ animations/customanimation_p.h | 65 +++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 animations/customanimation.cpp create mode 100644 animations/customanimation_p.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 722938df8..8308cfd24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ set(plasma_LIB_SRCS animations/stackedlayout.cpp animations/geometry.cpp animations/zoom.cpp + animations/customanimation.cpp applet.cpp configloader.cpp containment.cpp diff --git a/animations/customanimation.cpp b/animations/customanimation.cpp new file mode 100644 index 000000000..80f20c408 --- /dev/null +++ b/animations/customanimation.cpp @@ -0,0 +1,114 @@ +///////////////////////////////////////////////////////////////////////// +// 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; +} + +} diff --git a/animations/customanimation_p.h b/animations/customanimation_p.h new file mode 100644 index 000000000..3ceb07c7f --- /dev/null +++ b/animations/customanimation_p.h @@ -0,0 +1,65 @@ +/*********************************************************************/ +/* */ +/* Copyright (C) 2010 Igor Oliveira */ +/* Copyright (C) 2010 Adenilson Cavalcanti */ +/* */ +/* This program is free software; you can redistribute it and/or */ +/* modify it under the terms of the GNU General Public License */ +/* as published by the Free Software Foundation; either version 2 */ +/* of the License, or (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA */ +/* 02110-1301, USA. */ +/*********************************************************************/ + +#ifndef PLASMA_ANIMATIONS_CUSTOMANIMATION_H +#define PLASMA_ANIMATIONS_CUSTOMANIMATION_H + +#include +#include + +class QString; + +namespace Plasma +{ + +class CustomAnimation : public Animation +{ + Q_OBJECT + Q_PROPERTY(QString callback READ callback WRITE setCallback) + Q_PROPERTY(QVariant startValue READ startValue WRITE setStartValue) + Q_PROPERTY(QVariant endValue READ endValue WRITE setEndValue) + +public: + CustomAnimation(QObject *parent); + + QString callback() const; + void setCallback(const QString &method); + + QVariant startValue() const; + void setStartValue(const QVariant &value); + + QVariant endValue() const; + void setEndValue(const QVariant &value); + +protected: + void updateCurrentTime(int currentTime); + +private: + QVariant interpolate(const QVariant &start, const QVariant &end, qreal delta); + +private: + QString m_method; + QVariant m_startValue; + QVariant m_endValue; +}; +} + +#endif