//////////////////////////////////////////////////////////////////////// // rotation.cpp // // // // Copyright(C) 2009 Igor Trindade Oliveira // // Copyright(C) 2009 Adenilson Cavalcanti // // // // This library is free software; you can redistribute it and/or // // modify it under the terms of the GNU Lesser General Public // // License as published by the Free Software Foundation; either // // version 2.1 of the License, or (at your option) any later version. // // // // This library 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 // // Lesser General Public License for more details. // // // // You should have received a copy of the GNU Lesser General Public // // License along with this library; if not, write to the Free Software // // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA // // 02110-1301 USA // ///////////////////////////////////////////////////////////////////////// #include "rotation_p.h" #include #include namespace Plasma { class RotationAnimationPrivate { public: /* TODO: check if the rotation object will be deleted * when the animation runs */ QGraphicsRotation *rotation; /** * Animation rotation angle (e.g. 45, 180, etc) */ qreal angle; /** * Rotation axis (e.g. X, Y, Z) */ Qt::Axis axis; /** * Rotation reference (e.g. Center, Up, Down, Left, Right) can * be combined (i.e. Center|Up) */ qint8 reference; }; void RotationAnimation::setWidgetToAnimate(QGraphicsWidget *widget) { if(widget == widgetToAnimate()) { return; } Animation::setWidgetToAnimate(widget); } RotationAnimation::RotationAnimation(QObject *parent, const qint8 &reference, const Qt::Axis &axis, const qreal &angle) : Animation(parent), d(new RotationAnimationPrivate) { setAngle(angle); setAxis(axis); setReference(reference); d->rotation = new QGraphicsRotation(this); } RotationAnimation::~RotationAnimation() { delete d; } Qt::Axis RotationAnimation::axis() const { return d->axis; } void RotationAnimation::setAxis(const Qt::Axis &axis) { d->axis = axis; } qint8 RotationAnimation::reference() const { return d->reference; } void RotationAnimation::setReference(const qint8 &reference) { d->reference = reference; } qreal RotationAnimation::angle() const { return d->angle; } void RotationAnimation::setAngle(const qreal &angle) { d->angle = angle; } void RotationAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { QGraphicsWidget *m_object = widgetToAnimate(); if (!m_object) { return; } QVector3D vector(0, 0, 0); const qreal widgetWidth = m_object->size().width(); const qreal widgetHeight = m_object->size().height(); if (axis() == Qt::XAxis) { switch (reference()) { case Center: vector.setY(widgetHeight/2); break; case Up: vector.setY(0); break; case Down: vector.setY(widgetHeight); break; } } else if(axis() == Qt::YAxis) { switch (reference()) { case Center: vector.setX(widgetWidth/2); break; case Left: vector.setX(0); break; case Right: vector.setX(widgetWidth); break; } } else if (axis() == Qt::ZAxis) { switch (reference()) { case Center: vector.setX(widgetWidth/2); vector.setY(widgetHeight/2); break; case Center|Up: vector.setX(widgetWidth/2); vector.setY(0); break; case Center|Down: vector.setX(widgetWidth/2); vector.setY(widgetHeight); break; case Center|Left: vector.setX(0); vector.setY(widgetHeight/2); break; case Center|Right: vector.setX(widgetWidth); vector.setY(widgetHeight/2); break; } } d->rotation->setOrigin(vector); d->rotation->setAxis(axis()); QList transformation; transformation.append(d->rotation); m_object->setTransformations(transformation); if ((oldState == Stopped) && (newState == Running)) { d->rotation->setAngle(direction() == Forward ? 0 : angle()); } else if (newState == Stopped) { d->rotation->setAngle(direction() == Forward ? angle() : 0); } } void RotationAnimation::updateCurrentTime(int currentTime) { QGraphicsWidget *w = widgetToAnimate(); if (w) { qreal delta = currentTime / qreal(duration()); delta = angle() * delta; d->rotation->setAngle(delta); } } }