ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp
changeset 2 49c70dcc3f17
parent 1 e48454f237ca
child 3 c863538fcbb6
--- 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 <hbinstance.h>
 #include <hblabel.h>
 #include <hblistwidget.h>
+#include <hblistwidgetitem.h>
 #include <hbmenu.h>
 #include <hbscrollbar>
 #include <QActionGroup>
 #include <QGraphicsLinearLayout>
 #include <QSettings>
+#include <QParallelAnimationGroup>
+#include <QPropertyAnimation>
 #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 <hgwidgets/hggrid.h>
 #include <hgwidgets/hgmediawall.h>
 
 
 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<HgMediawall*>( 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>()) {
+        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<HgMediawall*>(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<QPixmap>() && texts.canConvert<QStringList>())
         {
@@ -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>();
+    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<QImage>() && texts.canConvert<QStringList>())
     {
@@ -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<HgMediawall::ItemSizePolicy>(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<HgCoverflowWidget*>(mWidget);
+    HgMediawall* wall = qobject_cast<HgMediawall*>(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<HgMediawall*>(mWidget);
-    if (wall)
-        wall->enableReflections(enabled);
-}
-
 void HgWidgetTestView::resetModel()
 {
     mModel->reset();