diff --git a/CMakeLists.txt b/CMakeLists.txt index 492b5a253..752cdb3ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ set(plasma_LIB_SRCS animations/grow.cpp animations/slide.cpp animations/pulser.cpp + animations/rotation.cpp applet.cpp configloader.cpp containment.cpp @@ -352,6 +353,7 @@ install(FILES animations/grow.h animations/slide.h animations/pulser.h + animations/rotation.h DESTINATION ${INCLUDE_INSTALL_DIR}/plasma/animations COMPONENT Devel) diff --git a/animations/rotation.cpp b/animations/rotation.cpp new file mode 100644 index 000000000..1f6c4809c --- /dev/null +++ b/animations/rotation.cpp @@ -0,0 +1,128 @@ +//////////////////////////////////////////////////////////////////////// +// 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.h" + +#include + +namespace Plasma +{ + +RotationAnimation::RotationAnimation(qint8 reference, const Qt::Axis &axis, + const qreal &angle) + : m_angle(angle), m_axis(axis), m_reference(reference) +{ +} + +void RotationAnimation::setAxis(const Qt::Axis &axis) +{ + m_axis = axis; +} + +void RotationAnimation::setReference(const qint8 reference) +{ + m_reference = reference; +} + +void RotationAnimation::setAngle(const qreal &angle) +{ + m_angle = angle; +} + +QPropertyAnimation *RotationAnimation::render(QObject *parent) +{ + QGraphicsWidget *m_object = getAnimatedObject(); + QGraphicsRotation *rotation = new QGraphicsRotation(m_object); + + QVector3D vector(0, 0, 0); + + const qreal widgetWidth = m_object->size().width(); + const qreal widgetHeight = m_object->size().height(); + + if (m_axis == Qt::XAxis) { + switch(m_reference) { + case Center: + vector.setY(widgetHeight/2); + break; + case Up: + vector.setY(0); + break; + case Down: + vector.setY(widgetHeight); + break; + } + } else if(m_axis == Qt::YAxis) { + switch(m_reference) { + case Center: + vector.setX(widgetWidth/2); + break; + case Left: + vector.setX(0); + break; + case Right: + vector.setX(widgetWidth); + break; + } + }else if (m_axis == Qt::ZAxis) { + switch(m_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; + } + } + + rotation->setOrigin(vector); + rotation->setAxis(m_axis); + + QList transformation; + transformation.append(rotation); + m_object->setTransformations(transformation); + + QPropertyAnimation *rotationAnimation= new QPropertyAnimation(rotation, + "angle", m_object); + rotationAnimation->setEndValue(m_angle); + rotationAnimation->setDuration(duration()); + + return rotationAnimation; +} + +} diff --git a/animations/rotation.h b/animations/rotation.h new file mode 100644 index 000000000..61c73acda --- /dev/null +++ b/animations/rotation.h @@ -0,0 +1,57 @@ +/***********************************************************************/ +/* rotation.h */ +/* */ +/* 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 +#include + +#include + +namespace Plasma { + +class PLASMA_EXPORT RotationAnimation : public Animation +{ + Q_OBJECT + + public: + enum Reference{ + Center, + Up, + Down, + Left, + Right + }; + + public: + RotationAnimation(qint8 reference = Center, const Qt::Axis &axis = Qt::ZAxis, const qreal &angle = 180); + + QPropertyAnimation* render(QObject* parent = 0); + + void setAxis(const Qt::Axis &axis); + void setReference(qint8 reference); + void setAngle(const qreal &angle); + + private: + qreal m_angle; + Qt::Axis m_axis; + qint8 m_reference; +}; +} // Plasma