diff -r e48454f237ca -r 49c70dcc3f17 ganeswidgets/src/hgcoverflowcontainer.cpp --- a/ganeswidgets/src/hgcoverflowcontainer.cpp Mon May 03 13:32:54 2010 +0300 +++ b/ganeswidgets/src/hgcoverflowcontainer.cpp Fri May 14 16:57:01 2010 +0300 @@ -37,7 +37,7 @@ mDescriptionPosition(HgMediawall::PositionNone), mPrevPos(-1), mAspectRatio(1), - mDrawableRect(rect()) + mAnimationAboutToEndReacted(false) { mTitleLabel = new HbLabel(this); mTitleLabel->setZValue(zValue()+1); @@ -48,7 +48,7 @@ mDescriptionLabel->setZValue(zValue()+1); mDescriptionLabel->setAlignment(Qt::AlignCenter); mDescriptionLabel->setVisible(false); - + mUserItemSize = QSize(250,250); mUserItemSpacing = QSize(1,1); } @@ -60,7 +60,9 @@ // events void HgCoverflowContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + painter->setRenderHint(QPainter::Antialiasing, true); HgContainer::paint(painter, option, widget); + painter->setRenderHint(QPainter::Antialiasing, false); } void HgCoverflowContainer::resizeEvent(QGraphicsSceneResizeEvent *event) @@ -69,13 +71,13 @@ HbWidget::resizeEvent(event); - updatePositions(); + updatePositions(); } // from HgContainer HgMediaWallRenderer* HgCoverflowContainer::createRenderer(Qt::Orientation scrollDirection) { - HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this, scrollDirection, true); + HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this, scrollDirection, scrollDirection, true); renderer->setImageSize(mUserItemSize); renderer->enableCoverflowMode(true); renderer->setRowCount(1, renderer->getImageSize(), false); @@ -120,12 +122,25 @@ { HgContainer::onScrollPositionChanged(pos); + if(!mAnimationAboutToEndReacted) { + qreal endPos = mSpring.endPos().x(); + qreal abs = qAbs(endPos - mSpring.pos().x()); + + if( abs <= 0.5f ) { + HgWidgetItem* item = itemByIndex((int)endPos); + if (item) { + emit animationAboutToEnd( item->modelIndex() ); + mAnimationAboutToEndReacted = true; + } + } + } + qreal ipos = floorf(pos); qreal frac = pos - ipos; qreal p = frac > 0.5 ? ipos + 1.0f : ipos; if (mPrevPos != (int)p) { - mPrevPos = (int)p; + mPrevPos = (int)p; HgWidgetItem* item = itemByIndex((int)p); if (item && item->modelIndex() != mSelectionModel->currentIndex()) { mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); @@ -133,6 +148,16 @@ } } +void HgCoverflowContainer::onScrollingStarted() +{ + mAnimationAboutToEndReacted = false; //reset +} + +void HgCoverflowContainer::onScrollingEnded() +{ + mAnimationAboutToEndReacted = false; //reset +} + void HgCoverflowContainer::handleCurrentChanged(const QModelIndex ¤t) { FUNC_LOG; @@ -243,7 +268,7 @@ FUNC_LOG; HANDLE_ERROR_NULL(mTitleLabel); HANDLE_ERROR_NULL(mDescriptionLabel); - + int height = size().height(); int width = size().width(); int titleHeight = QFontMetrics(mTitleLabel->effectiveFontSpec().font()).height(); @@ -256,61 +281,67 @@ usableHeight -= (descriptionHeight+KLabelMargin); } - usableHeight *= 0.8; // Leave some space for the reflection if (usableHeight <= 0) return; - qreal usableWidth = width/2; + qreal usableWidth = width/1.4; if (usableWidth <= 0) return; - mDrawableRect = rect(); - QSizeF imageSize; + QRectF imageRect = rect(); if (usableWidth/usableHeight > mAspectRatio) { - imageSize.setHeight(usableHeight); - imageSize.setWidth(mAspectRatio*usableHeight); + imageRect.setHeight(usableHeight); + imageRect.setWidth(mAspectRatio*usableHeight); + imageRect.moveLeft((width-imageRect.width())/2); } else { - imageSize.setWidth(usableWidth); - imageSize.setHeight(usableWidth/mAspectRatio); - mDrawableRect.setTop((usableHeight-imageSize.height())/2); + imageRect.setWidth(usableWidth); + imageRect.setHeight(usableWidth/mAspectRatio); + imageRect.moveTop((usableHeight-imageRect.height())/2); + imageRect.moveLeft((width-imageRect.width())/2); } - QRectF titleGeometry(0, mDrawableRect.top()+KLabelMargin, width, titleHeight); - QRectF descriptionGeometry(0, mDrawableRect.top()+KLabelMargin, width, descriptionHeight); + QRectF titleGeometry(0, imageRect.top()+KLabelMargin, width, titleHeight); + QRectF descriptionGeometry(0, imageRect.top()+KLabelMargin, width, descriptionHeight); if (mTitlePosition == HgMediawall::PositionAboveImage && mDescriptionPosition == HgMediawall::PositionAboveImage) { // titleGeometry default is ok descriptionGeometry.moveTop(titleGeometry.bottom()+KLabelMargin); - mDrawableRect.setTop(descriptionGeometry.bottom()+KLabelMargin); + imageRect.moveTop(descriptionGeometry.bottom()+KLabelMargin); } else if (mTitlePosition == HgMediawall::PositionBelowImage && mDescriptionPosition == HgMediawall::PositionBelowImage) { - titleGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + titleGeometry.moveTop(imageRect.bottom()+KLabelMargin); descriptionGeometry.moveTop(titleGeometry.bottom()+KLabelMargin); } else { if (mTitlePosition == HgMediawall::PositionAboveImage) { // titleGeometry default is ok - mDrawableRect.setTop(titleGeometry.bottom()+KLabelMargin); + imageRect.moveTop(titleGeometry.bottom()+KLabelMargin); } else if (mDescriptionPosition == HgMediawall::PositionAboveImage) { // descriptionGeometry default is ok - mDrawableRect.setTop(descriptionGeometry.bottom()+KLabelMargin); + imageRect.moveTop(descriptionGeometry.bottom()+KLabelMargin); } if (mTitlePosition == HgMediawall::PositionBelowImage) { - titleGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + titleGeometry.moveTop(imageRect.bottom()+KLabelMargin); } else if (mDescriptionPosition == HgMediawall::PositionBelowImage) { - descriptionGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + descriptionGeometry.moveTop(imageRect.bottom()+KLabelMargin); } } - INFO("Setting image size to:" << imageSize << "(total size:" << QSize(width, height) - << "usable size:" << QSizeF(usableWidth, usableHeight) << ", aspect ratio is:" << mAspectRatio << ")" << "Drawable rect:" << mDrawableRect); - mRenderer->setImageSize(imageSize); - mAutoSize = imageSize; - mDrawableRect.setHeight(imageSize.height()/0.8); + INFO("Setting image rect to:" << imageRect << "(total size:" << QSize(width, height) + << "usable size:" << QSizeF(usableWidth, usableHeight) << ", aspect ratio is:" << mAspectRatio << ")"); + + mRenderer->setImageSize(imageRect.size()); + qreal diff = rect().center().y()-imageRect.center().y(); + + INFO("Setting front item position to:" << QPointF(0, -diff) << "(rect:" << rect() + << "imageRect:" << imageRect << ")"); + mRenderer->setFrontItemPosition(QPointF(0, -diff)); + + mAutoSize = imageRect.size(); if (mTitlePosition != HgMediawall::PositionNone) { INFO("Title geometry:" << titleGeometry); @@ -333,9 +364,9 @@ if (mSelectionModel && mSelectionModel->currentIndex().isValid()) { updateLabels(mSelectionModel->currentIndex().row()); } - + mRenderer->setSpacing(QSizeF(1,1)); - + } void HgCoverflowContainer::positionLabels() @@ -343,7 +374,6 @@ FUNC_LOG; HANDLE_ERROR_NULL(mTitleLabel); HANDLE_ERROR_NULL(mDescriptionLabel); - HANDLE_ERROR_NULL(mSelectionModel); int centerIconTop = (size().height() - mRenderer->getImageSize().height()) / 2; @@ -433,14 +463,6 @@ HgContainer::scrollToPosition(p,animate); } -QRectF HgCoverflowContainer::drawableRect() const -{ - if (mItemSizePolicy == HgWidget::ItemSizeAutomatic) - return mDrawableRect; - - return rect(); -} - void HgCoverflowContainer::setDefaultImage(QImage defaultImage) { HgContainer::setDefaultImage(defaultImage); @@ -457,24 +479,24 @@ } QSizeF HgCoverflowContainer::getAutoItemSpacing() const -{ +{ return QSizeF(1,1); } void HgCoverflowContainer::updateItemSizeAndSpacing() { HgContainer::updateItemSizeAndSpacing(); - + updatePositions(); } void HgCoverflowContainer::updatePositions() { - if (mItemSizePolicy == HgWidget::ItemSizeAutomatic) + if (mItemSizePolicy == HgWidget::ItemSizeAutomatic) { calculatePositions(); - else - { + } + else { positionLabels(); } } @@ -483,7 +505,7 @@ { if (!mRenderer) return; - + mRenderer->setFrontItemPosition(position); }