ganeswidgets/src/hgmediawallrenderer.cpp
changeset 1 e48454f237ca
parent 0 89c329efa980
child 2 49c70dcc3f17
--- a/ganeswidgets/src/hgmediawallrenderer.cpp	Mon Apr 19 14:40:06 2010 +0300
+++ b/ganeswidgets/src/hgmediawallrenderer.cpp	Mon May 03 13:32:54 2010 +0300
@@ -35,7 +35,6 @@
 #include <qpainter>
 #include <qpaintengine>
 
-const Qt::Orientation KDefaultOrientation(Qt::Vertical);
 const qreal KPi = 3.1415926535897932384626433832795;
 
 static qreal lerp(qreal start, qreal end, qreal t)
@@ -99,13 +98,14 @@
     MyVectorAnimation mScaleAnimation;
 };
 
-HgMediaWallRenderer::HgMediaWallRenderer(HgMediaWallDataProvider* provider) :
+HgMediaWallRenderer::HgMediaWallRenderer(HgMediaWallDataProvider* provider, 
+    Qt::Orientation scrollDirection, bool coverflowMode) :
     mDataProvider(provider),
     mRenderer(NULL),
     mIndicatorRenderer(NULL),
     mRendererInitialized(false),
-    mOrientation(KDefaultOrientation),
-    mNextOrientation(KDefaultOrientation),
+    mOrientation(scrollDirection),
+    mNextOrientation(scrollDirection),
     mStateAnimationAlpha(0),
     mStateAnimationOnGoing(false),
     mAnimationAlpha(0),
@@ -113,7 +113,7 @@
     mOpenedItem(-1),
     mFlipAngle(qreal(360)),
     mZoomAmount(qreal(0.5)),
-    mCoverflowMode(false),
+    mCoverflowMode(coverflowMode),
     mRowCount(1),
     mNextRowCount(1),
     mStateAnimationDuration(300),
@@ -127,12 +127,18 @@
     mFrontCoverElevation(0.4),
     mReflectionsEnabled(true),
     mItemCountChanged(false),
-    mOpenedItemState(ItemClosed)
+    mOpenedItemState(ItemClosed),
+    mFrontItemPosition(0,0),
+    mFrontItemPositionSet(false)    
 {
     createStateMachine();
     mImageFader = new HgImageFader();    
     mRenderer = new HgVgQuadRenderer(256);
     mRendererInitialized = true;
+    if (mCoverflowMode) {
+        mOrientation = Qt::Horizontal;
+        mNextOrientation = mOrientation;
+    }
 }
 
 HgMediaWallRenderer::~HgMediaWallRenderer()
@@ -369,6 +375,14 @@
 
 void HgMediaWallRenderer::setOrientation(Qt::Orientation orientation, bool animate)
 {
+    // coverflow is always horizontal
+    if (mCoverflowMode)
+    {
+        mOrientation = Qt::Horizontal;
+        mNextOrientation = mOrientation;
+        return;
+    }
+    
     if (mOrientation != orientation)
     {
         mStateMachine->setAnimated(animate);
@@ -390,6 +404,7 @@
 
 void HgMediaWallRenderer::drawQuads(QPainter* painter)
 {
+    
     mRenderer->transformQuads(mViewMatrix, mProjMatrix, mRect);
 
     mRenderer->drawQuads(mRect, painter);    
@@ -530,11 +545,21 @@
 
     mViewMatrix = view;
     mProjMatrix = proj;
-    
-    qreal mirrorPlaneY = getRowPosY(mRowCount-1)-mImageSize3D.height()/2;
+
+    qreal mirrorPlaneY;
+    if (mCoverflowMode)
+    {
+        mirrorPlaneY = -mImageSize3D.height()/2;
+    }
+    else // grid
+    {
+        mirrorPlaneY = getRowPosY(mRowCount-1)-mImageSize3D.height()/2;
+    }
+
     mRenderer->setMirroringPlaneY(mirrorPlaneY);
 }
 
+
 void HgMediaWallRenderer::updateSpacingAndImageSize()
 {
     qreal div = mRect.width() <= mRect.height() ? mRect.width() : mRect.height();
@@ -645,14 +670,16 @@
 
 qreal HgMediaWallRenderer::getWorldWidth() const
 {   
-    qreal width = (qreal)mDataProvider->imageCount() / (qreal)mRowCount - 1.0f;
+    qreal width = ceil((qreal)mDataProvider->imageCount() / (qreal)mRowCount - 1.0f);
     
+    // if we are in vertical orientation we want last and first item
+    // to place at the top and bottom of the screen instead of center
     if (mOrientation == Qt::Vertical)
     {
         qreal step = mSpacing2D.height() + mImageSize2D.height(); 
         width -= (mRect.height() / step - 1.0f);
     }
-   
+       
     return width;
 }
 
@@ -731,8 +758,8 @@
     qreal frac = (position.x() - ipos) * step;
     qreal posX = -(qreal)(selectedItemIndex + 0) * step - frac;
     qreal zFar = -mFrontCoverElevation;
-    qreal posY = 0;    
-    
+    qreal posY = 0;
+
     int count = mDataProvider->imageCount();
     int quadIndex = 0;
     int itemIndex = ((int)(ipos - (qreal)selectedItemIndex));
@@ -974,4 +1001,15 @@
     return mRenderer->getVisibleQuads(QRectF(0, 0, mRect.width(), mRect.height()));
 }
 
+void HgMediaWallRenderer::setFrontItemPosition(const QPointF& position)
+{
+    mFrontItemPosition = position;
+    
+    mRenderer->setTranslation(
+        QVector2D(position.x(), position.y()));    
+}
 
+QPointF HgMediaWallRenderer::frontItemPosition() const
+{
+    return mFrontItemPosition;
+}