diff -r e48454f237ca -r 49c70dcc3f17 ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp --- a/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp Mon May 03 13:32:54 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp Fri May 14 16:57:01 2010 +0300 @@ -20,11 +20,14 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include "hgwidgettestview.h" #include "hgtestview.h" #include "hgwidgetoptionsview.h" @@ -34,12 +37,13 @@ #include "hgitemsizedialog.h" #include "hgcoverflowwidget.h" #include "trace.h" +#include "hgcoveritem.h" #include #include static const int GRIDBUFFERSIZE(400); -static const int COVERFLOWBUFFERSIZE(130); +static const int COVERFLOWBUFFERSIZE(150); HgWidgetTestView::HgWidgetTestView(QGraphicsItem *parent) : HbView(parent), @@ -52,11 +56,16 @@ mFrontItem(0), mOptionsView(0), mItemSizeDialog(0), - mItemPosDialog(0) -{ + mItemPosDialog(0), + mDialog(0), + mCoverItem(0), + mAnimationGroup(0) +{ mModel = new HgWidgetTestDataModel(this); mSelectionModel = new QItemSelectionModel(mModel, this); + mAnimationGroup = new QParallelAnimationGroup(); + createMenu(); mLayout = new QGraphicsLinearLayout(Qt::Vertical); @@ -67,6 +76,7 @@ HgWidgetTestView::~HgWidgetTestView() { + delete mAnimationGroup; } void HgWidgetTestView::createMenu() @@ -123,20 +133,26 @@ setItemVisible(Hb::AllItems, true); mModel->enableLowResImages(false); // TODO, init grid different model, - mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); +// mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); break; case HgWidgetCoverflow: - mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); +// mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); setItemVisible(Hb::AllItems, orientation() != Qt::Horizontal); break; case HgWidgetTBone: setItemVisible(Hb::AllItems, true); - mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); +// mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); mListWidget = new HbListWidget; mLayout->addItem(mListWidget); - mListWidget->addItem( "List item 1"); + /*mListWidget->addItem( "List item 1"); mListWidget->addItem( "List item 2"); - mListWidget->addItem( "List item 3"); + mListWidget->addItem( "List item 3");*/ + + HgMediawall* mediawall = qobject_cast( mWidget ); + if (mediawall) { + connect(mediawall, SIGNAL(animationAboutToEnd(QModelIndex)), + SLOT(animationAboutToEnd(QModelIndex))); + } break; default: break; @@ -160,6 +176,27 @@ } } +void HgWidgetTestView::animationAboutToEnd(const QModelIndex& targetIndex) +{ + FUNC_LOG; + + QVariant texts = mModel->data(targetIndex, Qt::DisplayRole); + if (texts.canConvert()) { + QStringList strList = texts.toStringList(); + if (strList.count() > 0) { + if( mListWidget->count() >= 5 ) { + //delete the last itme in the list and insert the new row to the beginning of the list + HbListWidgetItem* delItem = mListWidget->takeItem(4); + if (delItem) { + delete delItem; + delItem = 0; + } + } + mListWidget->insertItem(0, strList.at(0)); + } + } +} + void HgWidgetTestView::changeScrollBarVisibility(HgWidget::ScrollBarPolicy policy) { FUNC_LOG; @@ -277,14 +314,53 @@ mLayout->setContentsMargins(margin, top, margin, bottom); } -void HgWidgetTestView::openDialog(const QModelIndex& index) +void HgWidgetTestView::changeReflectionsEnabled(bool enabled) +{ + HgMediawall* wall = qobject_cast(mWidget); + if (wall) + wall->enableReflections(enabled); +} + +void HgWidgetTestView::changeItemSizePolicy(HgMediawall::ItemSizePolicy policy) { FUNC_LOG; - QVariant image = mModel->data(index, Qt::DecorationRole); - QVariant texts = mModel->data(index, Qt::DisplayRole); + if (mWidget && mWidget->itemSizePolicy() != policy) { + mWidget->setItemSizePolicy(policy); + } +} + +void HgWidgetTestView::activated() +{ + mAnimationGroup->setDirection(QAbstractAnimation::Backward); + connect(mAnimationGroup, SIGNAL(finished()), this, SLOT(animationFinished())); + mAnimationGroup->start(); +} - if (mWidgetType == HgWidgetCoverflow || mWidgetType == HgWidgetTBone) +void HgWidgetTestView::animationFinished() +{ + delete mCoverItem; + mCoverItem = 0; + mAnimationGroup->disconnect(this, SIGNAL(animationFinished())); + mAnimationGroup->setDirection(QAbstractAnimation::Forward); + mAnimationGroup->clear(); + delete mDialog; + mDialog = 0; +} + +void HgWidgetTestView::openDialog(const QModelIndex& index) +{ + FUNC_LOG; + + QVariant image = mModel->silentData(index, Qt::DecorationRole); + QVariant texts = mModel->silentData(index, Qt::DisplayRole); + + if (mWidgetType == HgWidgetCoverflow ) + { + startAnimation(index); + return; + } + else if(mWidgetType == HgWidgetTBone) { if (image.canConvert() && texts.canConvert()) { @@ -351,12 +427,78 @@ dlg.exec(); } +void HgWidgetTestView::startAnimation(const QModelIndex& index) +{ + if( mAnimationGroup->state() == QAbstractAnimation::Running || + mDialog || mCoverItem ) return; + + QPolygonF poly; + if (!mWidget->getItemOutline(index, poly)) + return; + + + mFlippedIndex = index; + + QRectF itemRect = poly.boundingRect(); + itemRect.moveTo(itemRect.topLeft() + mWidget->geometry().topLeft()); + + QVariant image = mModel->silentData(index, Qt::DecorationRole); + QPixmap pixmap; + QImage temp = image.value(); + QImage scaled = temp.scaled(itemRect.size().toSize()); + if (scaled.isNull()) return; + QPixmap pixmap2 = pixmap.fromImage(scaled); + if(pixmap2.isNull()) return; + + mCoverItem = new HgCoverItem(pixmap2, this); + mCoverItem->setPos(itemRect.topLeft()); + mCoverItem->setZValue(mWidget->zValue()+2); + mCoverItem->show(); + + QPropertyAnimation* animation = new QPropertyAnimation(mCoverItem, "geometry"); + animation->setDuration(400); + animation->setStartValue(itemRect); + + QRectF endRect = itemRect; + int topLeftX = (mWidget->size().width() - itemRect.size().width()*2)/2; + endRect.moveTo(topLeftX,endRect.topLeft().y()); + animation->setEndValue(endRect); + + mAnimationGroup->addAnimation(animation); + + HgListWidget* list = new HgListWidget(this); + mDialog = new HbDialog(this); + mDialog->setZValue(mWidget->zValue()+1); + mDialog->setContentWidget(list); + mDialog->setDismissPolicy(HbPopup::TapOutside); + list->addItem( "List item 1"); + list->addItem( "List item 2"); + list->addItem( "List item 3"); + list->addItem( "List item 4"); + list->addItem( "List item 5"); + list->addItem( "List item 6"); + list->addItem( "List item 7"); + + connect(list,SIGNAL(activated(HbListWidgetItem*)),this, SLOT(activated())); + connect(list,SIGNAL(close()),this, SLOT(activated())); + connect(mCoverItem,SIGNAL(close()),this, SLOT(activated())); + + animation = new QPropertyAnimation(mDialog, "geometry"); + animation->setDuration(400); + animation->setStartValue(itemRect); + endRect.moveTo(endRect.topRight()); + animation->setEndValue(endRect); + + mAnimationGroup->addAnimation(animation); + mAnimationGroup->start(); +} + void HgWidgetTestView::openView(const QModelIndex& index) { FUNC_LOG; - QVariant image = mModel->data(index, Qt::DecorationRole); - QVariant texts = mModel->data(index, Qt::DisplayRole); + QVariant image = mModel->silentData(index, Qt::DecorationRole); + QVariant texts = mModel->silentData(index, Qt::DisplayRole); if (image.canConvert() && texts.canConvert()) { @@ -515,6 +657,8 @@ SLOT(changeDescriptionFont(HbFontSpec))); connect(view, SIGNAL(reflectionsEnabledChanged(bool)), SLOT(changeReflectionsEnabled(bool))); + connect(view, SIGNAL(itemSizePolicyChanged(HgWidget::ItemSizePolicy)), + SLOT(changeItemSizePolicy(HgWidget::ItemSizePolicy))); mOptionsView = view; primaryWindow->addView(mOptionsView); @@ -603,6 +747,10 @@ changeReflectionsEnabled(value.toBool()); } + value = settings.value(SETT_ITEM_SIZE_POLICY); + if (value.isValid()) { + changeItemSizePolicy(static_cast(value.toInt())); + } } void HgWidgetTestView::setupWidgetSize() @@ -631,13 +779,15 @@ if (mainWindows.count() > 0) { HbMainWindow *primaryWindow = mainWindows[0]; + primaryWindow->scene()->setItemIndexMethod(QGraphicsScene::NoIndex); + primaryWindow->setOptimizationFlag(QGraphicsView::DontSavePainterState, true); if (primaryWindow->orientation() == Qt::Horizontal) { scrollDirection = Qt::Horizontal; } } HgWidget* widget = 0; - HgCoverflowWidget* temp = 0; + HgMediawall* temp = 0; switch (type) { case HgWidgetGrid: @@ -646,18 +796,21 @@ widget = new HgGrid(scrollDirection); break; case HgWidgetCoverflow: + { mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); mModel->setBuffer(COVERFLOWBUFFERSIZE, COVERFLOWBUFFERSIZE/3); - widget = new HgCoverflowWidget(); - temp = (HgCoverflowWidget*)widget; - temp->setTitlePosition(HgMediawall::PositionNone); + widget = new HgMediawall(); + temp = (HgMediawall*)widget; + temp->setDescriptionPosition(HgMediawall::PositionAboveImage); break; + } case HgWidgetTBone: mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); mModel->setBuffer(COVERFLOWBUFFERSIZE, COVERFLOWBUFFERSIZE/3); - widget = new HgCoverflowWidget(); - temp = (HgCoverflowWidget*)widget; - temp->setTitlePosition(HgMediawall::PositionNone); + widget = new HgMediawall(); + temp = (HgMediawall*)widget; + temp->setDescriptionPosition(HgMediawall::PositionAboveImage); + temp->enableReflections(false); break; default: break; @@ -670,6 +823,9 @@ widget->setLongPressEnabled(true); widget->scrollTo(widget->currentIndex()); + QImage defaultImage(":/images/default.svg"); + widget->setDefaultImage(defaultImage); + return widget; } @@ -736,7 +892,7 @@ return; // fetch highresolution image from the model - QVariant imgVariant = mModel->data(index, Qt::UserRole+2); + QVariant imgVariant = mModel->silentData(index, Qt::UserRole+2); if (imgVariant.isNull()) return; @@ -762,19 +918,26 @@ void HgWidgetTestView::orientationChanged(Qt::Orientation orientation) { + if (mDialog) { + mModel->setData(mFlippedIndex, true, Qt::UserRole+1); + } + mAnimationGroup->stop(); + delete mDialog; + mDialog = 0; + delete mCoverItem; + mCoverItem = 0; + mAnimationGroup->clear(); + + if (orientation == Qt::Horizontal && mWidgetType == HgWidgetCoverflow ) { setItemVisible(Hb::AllItems, false); } else if (orientation == Qt::Horizontal && mWidgetType == HgWidgetTBone) { initWidget(HgWidgetCoverflow); -// HbEffect::add(mWidget,":/effect1.fxml", "end"); -// HbEffect::start(mWidget, "end"); setItemVisible(Hb::AllItems, false); } else if (orientation == Qt::Vertical && mWidgetType == HgWidgetCoverflow) { initWidget(HgWidgetTBone); -// HbEffect::add(mWidget,":/effect1.fxml", "end"); -// HbEffect::start(mWidget, "end"); setItemVisible(Hb::AllItems, true); } @@ -872,13 +1035,13 @@ if (!mItemPosDialog) return; - HgCoverflowWidget* wall = qobject_cast(mWidget); + HgMediawall* wall = qobject_cast(mWidget); if (!wall) return; QSizeF s = mItemPosDialog->itemSize(); wall->setFrontItemPositionDelta(QPointF(s.width(), s.height())); - wall->updateTextPositions(); +// wall->updateTextPositions(); mWidget->update(); } @@ -900,13 +1063,6 @@ setupWidget(); } -void HgWidgetTestView::changeReflectionsEnabled(bool enabled) -{ - HgMediawall* wall = qobject_cast(mWidget); - if (wall) - wall->enableReflections(enabled); -} - void HgWidgetTestView::resetModel() { mModel->reset();