diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgmediawallrenderer.cpp --- 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 #include -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; +}