12 * Contributors: |
12 * Contributors: |
13 * |
13 * |
14 * Description: |
14 * Description: |
15 * |
15 * |
16 */ |
16 */ |
17 #include "HgMediaWallRenderer.h" |
17 #include "hgmediawallrenderer.h" |
18 #include "hgmediawalldataprovider.h" |
18 #include "hgmediawalldataprovider.h" |
19 #include "hgquadrenderer.h" |
19 #include "hgquadrenderer.h" |
20 #include "hgquad.h" |
20 #include "hgquad.h" |
21 #include "hgimage.h" |
21 #include "hgimage.h" |
22 #include "HgImageFader.h" |
22 #include "hgimagefader.h" |
23 #include "hgvgquadrenderer.h" |
23 #include "hgvgquadrenderer.h" |
24 #include "hgqtquadrenderer.h" |
24 #include "hgqtquadrenderer.h" |
25 #include <qvector3d> |
25 #include <QVector3D> |
26 #include <qtimer> |
26 #include <QTimer> |
27 #include <qpropertyanimation> |
27 #include <QPropertyAnimation> |
28 #include <qstate.h> |
28 #include <QState> |
29 #include <qabstracttransition> |
29 #include <QAbstractTransition> |
30 #include <qstatemachine> |
30 #include <QStateMachine> |
31 #include <qsignaltransition> |
31 #include <QSignalTransition> |
32 #include <qsequentialanimationgroup> |
32 #include <QSequentialAnimationGroup> |
33 #include <qparallelanimationgroup> |
33 #include <QParallelAnimationGroup> |
34 #include <qvariantanimation> |
34 #include <QVariantAnimation> |
35 #include <qpolygon> |
35 #include <QPolygon> |
36 #include <qpainter> |
36 #include <QPainter> |
37 #include <qpaintengine> |
37 #include <QPaintEngine> |
38 |
38 |
39 const qreal KPi = 3.1415926535897932384626433832795; |
39 const qreal KPi = 3.1415926535897932384626433832795; |
40 |
40 |
41 |
41 |
42 static qreal lerp(qreal start, qreal end, qreal t) |
42 static qreal lerp(qreal start, qreal end, qreal t) |
176 { |
176 { |
177 qreal stepY = spacing.height() + size.height(); |
177 qreal stepY = spacing.height() + size.height(); |
178 qreal posY = 0.5f - (rect.height() / rect.width() / 2.0 - stepY / 2.0); |
178 qreal posY = 0.5f - (rect.height() / rect.width() / 2.0 - stepY / 2.0); |
179 tm.translate(-posY,0); |
179 tm.translate(-posY,0); |
180 rm.rotate(-90, QVector3D(0,0,1)); |
180 rm.rotate(-90, QVector3D(0,0,1)); |
181 rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90); |
181 rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), 90); |
182 } |
182 } |
183 else if (mNextScrollDirection == Qt::Vertical) |
183 else if (mNextScrollDirection == Qt::Vertical) |
184 { |
184 { |
185 tm.translate(0,0.5f); |
185 tm.translate(0,0.5f); |
186 rm.rotate(90, QVector3D(0,0,1)); |
186 rm.rotate(90, QVector3D(0,0,1)); |
187 rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90); |
187 rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90); |
188 } |
188 } |
189 |
|
190 |
189 |
191 } |
190 } |
192 |
191 |
193 HgAnimatedQuad* createQuad(HgQuad* qA, HgQuad* qB) const |
192 HgAnimatedQuad* createQuad(HgQuad* qA, HgQuad* qB) const |
194 { |
193 { |
245 mCameraRotationZ(0), |
244 mCameraRotationZ(0), |
246 mFrontCoverElevation(0.4), |
245 mFrontCoverElevation(0.4), |
247 mFrontItemPosition(0,0) |
246 mFrontItemPosition(0,0) |
248 { |
247 { |
249 createStateMachine(); |
248 createStateMachine(); |
250 mRenderer = new HgQtQuadRenderer(64); |
249 mRenderer = new HgQtQuadRenderer(128); |
251 mRenderer->enableReflections(true); |
250 mRenderer->enableReflections(true); |
252 mRendererInitialized = true; |
251 mRendererInitialized = true; |
253 if (mCoverflowMode) { |
252 if (mCoverflowMode) { |
254 mScrollDirection = Qt::Horizontal; |
253 mScrollDirection = Qt::Horizontal; |
255 mNextScrollDirection = mScrollDirection; |
254 mNextScrollDirection = mScrollDirection; |
441 if (mScrollDirection != scrollDirection) |
440 if (mScrollDirection != scrollDirection) |
442 { |
441 { |
443 mStateMachine->setAnimated(animate); |
442 mStateMachine->setAnimated(animate); |
444 mNextScrollDirection = scrollDirection; |
443 mNextScrollDirection = scrollDirection; |
445 |
444 |
446 if (!animate) |
445 if (!animate) { |
447 mScrollDirection = scrollDirection; |
446 mScrollDirection = scrollDirection; |
|
447 } |
448 else |
448 else |
449 { |
449 { |
450 //emit renderingNeeded(); |
450 //emit renderingNeeded(); |
451 } |
451 } |
|
452 } else if (!animate) { |
|
453 // reset next scrolldirection just to be sure. In some cases |
|
454 // when orientation changes couple of times and container visibility changes |
|
455 // we might otherwise end up in wrong state. |
|
456 mNextScrollDirection = scrollDirection; |
452 } |
457 } |
453 } |
458 } |
454 |
459 |
455 Qt::Orientation HgMediaWallRenderer::getScrollDirection() const |
460 Qt::Orientation HgMediaWallRenderer::getScrollDirection() const |
456 { |
461 { |
717 qreal springVelocity, |
722 qreal springVelocity, |
718 QPainter* painter, |
723 QPainter* painter, |
719 const QTransform& sceneTransform, |
724 const QTransform& sceneTransform, |
720 const QRectF& rect) |
725 const QRectF& rect) |
721 { |
726 { |
|
727 Q_UNUSED(sceneTransform) |
|
728 Q_UNUSED(rect) |
722 |
729 |
723 // save state for current orientation |
730 // save state for current orientation |
724 setupRows(startPosition, position, targetPosition, springVelocity, painter); |
731 setupRows(startPosition, position, targetPosition, springVelocity, painter); |
725 recordState(mOldState); |
732 recordState(mOldState); |
726 |
733 |
755 qreal springVelocity, |
762 qreal springVelocity, |
756 QPainter* painter, |
763 QPainter* painter, |
757 const QTransform& sceneTransform, |
764 const QTransform& sceneTransform, |
758 const QRectF& rect) |
765 const QRectF& rect) |
759 { |
766 { |
|
767 Q_UNUSED(sceneTransform) |
|
768 Q_UNUSED(rect) |
|
769 |
760 setupRows(startPosition, position, targetPosition, springVelocity, painter); |
770 setupRows(startPosition, position, targetPosition, springVelocity, painter); |
761 recordState(mOldState); |
771 recordState(mOldState); |
762 |
772 |
763 mRowCount = mNextRowCount; |
773 mRowCount = mNextRowCount; |
764 setImageSize(mNextImageSize); |
774 setImageSize(mNextImageSize); |
973 |
983 |
974 void HgMediaWallRenderer::setupDefaultQuad(const QVector3D& pos, int itemIndex, bool reflectionsEnabled, int& quadIndex) |
984 void HgMediaWallRenderer::setupDefaultQuad(const QVector3D& pos, int itemIndex, bool reflectionsEnabled, int& quadIndex) |
975 { |
985 { |
976 HgQuad* quad = mRenderer->quad(quadIndex++); |
986 HgQuad* quad = mRenderer->quad(quadIndex++); |
977 quad->setPosition(pos); |
987 quad->setPosition(pos); |
978 quad->setImage(mDataProvider->image(itemIndex)); |
988 const HgImage* image = mDataProvider->image(itemIndex); |
979 quad->setVisible(true); |
989 quad->setImage(image); |
|
990 quad->setVisible(image && image->alpha() != 0); |
980 quad->setScale(QVector2D(mImageSize3D.width(),mImageSize3D.height())); |
991 quad->setScale(QVector2D(mImageSize3D.width(),mImageSize3D.height())); |
981 quad->setPivot(QVector2D(0,0)); |
992 quad->setPivot(QVector2D(0,0)); |
982 quad->setUserData(QVariant(itemIndex)); |
993 quad->setUserData(QVariant(itemIndex)); |
983 quad->setRotation(QQuaternion(1,0,0,0)); |
994 quad->setRotation(QQuaternion(1,0,0,0)); |
984 quad->setOuterRotation(QQuaternion(1,0,0,0)); |
995 quad->setOuterRotation(QQuaternion(1,0,0,0)); |
990 const HgImage* indicatorImage = mDataProvider->indicator(flags); |
1001 const HgImage* indicatorImage = mDataProvider->indicator(flags); |
991 if (flags != 0 && indicatorImage && quadIndex < mRenderer->quadCount()) |
1002 if (flags != 0 && indicatorImage && quadIndex < mRenderer->quadCount()) |
992 { |
1003 { |
993 HgQuad* indicator = mRenderer->quad(quadIndex++); |
1004 HgQuad* indicator = mRenderer->quad(quadIndex++); |
994 setupIndicator(quad, indicator, indicatorImage, |
1005 setupIndicator(quad, indicator, indicatorImage, |
995 itemIndex); |
1006 itemIndex+1000); |
996 indicator->enableMirrorImage(reflectionsEnabled); |
1007 indicator->enableMirrorImage(reflectionsEnabled); |
997 } |
1008 } |
998 |
1009 |
999 |
1010 |
1000 } |
1011 } |