• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • kdelibs
  • KDE Home
  • Contact Us
 

Plasma

rotationstacked.cpp

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2009 Igor Trindade Oliveira <igor.oliveira@indt.org.br>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Lesser General Public
00006     License as published by the Free Software Foundation; either
00007     version 2.1 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Lesser General Public License for more details.
00013 
00014     You should have received a copy of the GNU Lesser General Public
00015     License along with this library.  If not, see <http://www.gnu.org/licenses/>.
00016 */
00017 
00018 #include "rotationstacked_p.h"
00019 #include <QGraphicsRotation>
00020 #include <QSequentialAnimationGroup>
00021 #include <QWeakPointer>
00022 #include <kdebug.h>
00023 
00024 #include "stackedlayout.h"
00025 #include "plasma.h"
00026 
00027 namespace Plasma
00028 {
00029 
00030 const int RotationStackedAnimation::s_sideAngle = 90;
00031 
00032 RotationStackedAnimation::RotationStackedAnimation(QObject *parent)
00033     : EasingAnimation(parent)
00034 {
00035     m_backRotation = new QGraphicsRotation(this);
00036     m_frontRotation = new QGraphicsRotation(this);
00037     m_wLayout = new StackedLayout;
00038 }
00039 
00040 RotationStackedAnimation::~RotationStackedAnimation()
00041 {
00042     delete m_wLayout.data();
00043 }
00044 
00045 void RotationStackedAnimation::setMovementDirection(const Animation::MovementDirection &direction)
00046 {
00047     m_animDirection = direction;
00048 
00049     QVector3D animDirection(0, 0, 0);
00050 
00051     if (m_animDirection.testFlag(MoveUp)) {
00052         animDirection.setX(1);
00053     } else if (m_animDirection.testFlag(MoveDown)) {
00054         animDirection.setX(-1);
00055     }
00056 
00057     if (m_animDirection.testFlag(MoveLeft)) {
00058         animDirection.setY(-1);
00059     } else if (m_animDirection.testFlag(MoveRight)) {
00060         animDirection.setY(1);
00061     }
00062 
00063     m_frontRotation->setAxis(animDirection);
00064     m_backRotation->setAxis(animDirection);
00065 
00066     updateTransformations();
00067 }
00068 
00069 Animation::MovementDirection RotationStackedAnimation::movementDirection() const
00070 {
00071     return m_animDirection;
00072 }
00073 
00074 void RotationStackedAnimation::setReference(const Animation::Reference &reference)
00075 {
00076     m_animReference = reference;
00077 
00078     if (!targetWidget() || !backWidget()) {
00079         return;
00080     }
00081 
00082     const QSizeF transformArea = targetWidget()->size().expandedTo(backWidget()->size());
00083 
00084     QVector3D frontTransformOrigin(transformArea.width()/2, transformArea.height()/2, 0);
00085     QVector3D backTransformOrigin(transformArea.width()/2, transformArea.height()/2, 0);
00086 
00087     if (m_animReference.testFlag(Up)) {
00088         frontTransformOrigin.setY(0);
00089         backTransformOrigin.setY(0);
00090     } else if (m_animReference.testFlag(Down)) {
00091         frontTransformOrigin.setY(transformArea.height());
00092         backTransformOrigin.setY(transformArea.height());
00093     }
00094 
00095     if (m_animReference.testFlag(Left)) {
00096         frontTransformOrigin.setX(0);
00097         backTransformOrigin.setX(0);
00098     } else if (m_animReference.testFlag(Right)) {
00099         frontTransformOrigin.setX(transformArea.width());
00100         backTransformOrigin.setX(transformArea.width());
00101     }
00102 
00103     m_frontRotation->setOrigin(frontTransformOrigin);
00104     m_backRotation->setOrigin(backTransformOrigin);
00105 
00106     updateTransformations();
00107 }
00108 
00109 Animation::Reference RotationStackedAnimation::reference() const
00110 {
00111     return m_animReference;
00112 }
00113 
00114 QGraphicsWidget *RotationStackedAnimation::backWidget()
00115 {
00116     return m_backWidget.data();
00117 }
00118 
00119 void RotationStackedAnimation::setBackWidget(QGraphicsWidget *backWidget)
00120 {
00121     m_backWidget = backWidget;
00122 
00123     StackedLayout *layout = m_wLayout.data();
00124 
00125     if(targetWidget() && backWidget && layout) {
00126         layout->addWidget(targetWidget());
00127         layout->addWidget(backWidget);
00128     }
00129 }
00130 
00131 QGraphicsLayoutItem *RotationStackedAnimation::layout()
00132 {
00133     return m_wLayout.data();
00134 }
00135 
00136 void RotationStackedAnimation::updateState(QAbstractAnimation::State newState,
00137         QAbstractAnimation::State oldState)
00138 {
00139     if (oldState == Stopped && newState == Running) {
00140         setReference(reference());
00141     }
00142 }
00143 
00144 void RotationStackedAnimation::updateEffectiveTime(int currentTime)
00145 {
00146     if (!targetWidget() || !backWidget()) {
00147         return;
00148     }
00149 
00150     StackedLayout *layout = m_wLayout.data();
00151     if (!layout) {
00152         return;
00153     }
00154 
00155     qreal delta;
00156     if (currentTime <= duration()/2) {
00157         layout->setCurrentWidgetIndex(0);
00158         delta = (currentTime*2) / qreal(duration());
00159         delta *= s_sideAngle;
00160         m_frontRotation->setAngle(delta);
00161     } else {
00162         layout->setCurrentWidgetIndex(1);
00163         delta = 1 - (((currentTime*2) - duration()) / qreal(duration()));
00164         delta = -delta;
00165         delta *= s_sideAngle;
00166         m_backRotation->setAngle(delta);
00167     }
00168 }
00169 
00170 void RotationStackedAnimation::updateTransformations()
00171 {
00172     if (!targetWidget() || !backWidget()) {
00173         return;
00174     }
00175 
00176     QList<QGraphicsTransform *> frontTransformation;
00177     QList<QGraphicsTransform *> backTransformation;
00178 
00179     frontTransformation.append(m_frontRotation);
00180     backTransformation.append(m_backRotation);
00181 
00182     targetWidget()->setTransformations(frontTransformation);
00183     backWidget()->setTransformations(backTransformation);
00184 }
00185 
00186 } //namespace Plasma
00187 
00188 #include "rotationstacked_p.moc"

Plasma

Skip menu "Plasma"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.7.3
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal