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"
KDE 4.6 API Reference