videocollection/videocollectionview/src/videolistview.cpp
changeset 35 3738fe97f027
parent 34 bbb98528c666
child 36 8aed59de29f9
--- a/videocollection/videocollectionview/src/videolistview.cpp	Thu Apr 01 23:22:15 2010 +0300
+++ b/videocollection/videocollectionview/src/videolistview.cpp	Thu Apr 01 23:32:44 2010 +0300
@@ -41,6 +41,7 @@
 #include "videocollectionwrapper.h"
 #include "videosortfilterproxymodel.h"
 #include "videocollectionuiloader.h"
+#include "mpxhbvideocommondefs.h"
 
 // remove these
 #include <QDebug>
@@ -55,7 +56,12 @@
 mWrapper(VideoCollectionWrapper::instance()),
 mUiLoader(uiLoader),
 mIsService(false),
+mHintLoaded(false),
+mListsLoaded(false),
+mMultiselectionLoaded(false),
 mModelReady(false),
+mTransitionOngoing(false),
+mHintLevel(VideoHintWidget::AllVideos),
 mVideoServices(0),
 mCurrentList(0),
 mToolbarViewsActionGroup(0),
@@ -72,6 +78,8 @@
 {
     qDebug() << "VideoListView::~VideoListView()";
     
+    toolBar()->clearActions();
+    
     mToolbarActions.clear();
     mSortingRoles.clear();
 
@@ -110,7 +118,6 @@
         	connect(mVideoServices, SIGNAL(titleReady(const QString&)), this, SLOT(titleReadySlot(const QString&)));
         }
 	}
-    mUiLoader->setIsService(mIsService);
     
     // start open all videos model
     VideoSortFilterProxyModel *model =
@@ -128,24 +135,20 @@
     // start loading widgets
     QSet<QString> uiItems;
     uiItems.insert(DOCML_NAME_VC_VIDEOLISTWIDGET);
+    uiItems.insert(DOCML_NAME_VC_HEADINGBANNER);
     uiItems.insert(DOCML_NAME_OPTIONS_MENU);
-    uiItems.insert(DOCML_NAME_ADD_TO_COLLECTION);
-    uiItems.insert(DOCML_NAME_CREATE_COLLECTION);
-    uiItems.insert(DOCML_NAME_DELETE_MULTIPLE);
-    uiItems.insert(DOCML_NAME_VC_HEADINGBANNER);
-    uiItems.insert(DOCML_NAME_VC_VIDEOHINTWIDGET);
-    uiItems.insert(DOCML_NAME_HINT_BUTTON);
-    uiItems.insert(DOCML_NAME_NO_VIDEOS_LABEL);
+    if(!mIsService)
+    {
+		uiItems.insert(DOCML_NAME_ADD_TO_COLLECTION);
+		uiItems.insert(DOCML_NAME_CREATE_COLLECTION);
+		uiItems.insert(DOCML_NAME_DELETE_MULTIPLE);
+    }
     uiItems.insert(DOCML_NAME_SORT_MENU);
     uiItems.insert(DOCML_NAME_SORT_BY_DATE);
     uiItems.insert(DOCML_NAME_SORT_BY_NAME);
     uiItems.insert(DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS);
-    uiItems.insert(DOCML_NAME_SORT_BY_TOTAL_LENGTH);
     uiItems.insert(DOCML_NAME_SORT_BY_RATING);
     uiItems.insert(DOCML_NAME_SORT_BY_SIZE);
-    uiItems.insert(DOCML_NAME_VC_COLLECTIONWIDGET);
-    uiItems.insert(DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
-    uiItems.insert(DOCML_NAME_DIALOG);
     mUiLoader->startLoading(uiItems,
         this,
         SLOT(widgetReadySlot(QGraphicsWidget*, const QString&)),
@@ -193,7 +196,7 @@
         }
         
     	int result = mCurrentList->activate(level);
-        if(result < 0) 
+        if(result < 0)
         {
             // activate failed, deactivate view so we get rid of dangling connections.
             deactivateView();
@@ -238,6 +241,70 @@
     return 0;
 }
 
+
+// ---------------------------------------------------------------------------
+// loadMultiSelection
+// ---------------------------------------------------------------------------
+//
+void VideoListView::loadMultiSelection()
+{
+	if(!mIsService)
+    {
+		if(!mMultiselectionLoaded)
+		{
+			QSet<QString> uiItems;
+			uiItems.insert(DOCML_NAME_DIALOG);
+			mUiLoader->startLoading(uiItems,
+				this,
+				SLOT(widgetReadySlot(QGraphicsWidget*, const QString&)),
+				SLOT(objectReadySlot(QObject*, const QString&)));
+			uiItems.clear();
+			mMultiselectionLoaded = true;
+		}
+    }
+}
+
+// ---------------------------------------------------------------------------
+// loadLists
+// ---------------------------------------------------------------------------
+//
+void VideoListView::loadLists(bool doAsync)
+{
+	if(!mListsLoaded)
+	{
+		QSet<QString> uiItems;
+		uiItems.insert(DOCML_NAME_VC_COLLECTIONWIDGET);
+		uiItems.insert(DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
+		mUiLoader->startLoading(uiItems,
+			this,
+			SLOT(widgetReadySlot(QGraphicsWidget*, const QString&)),
+			SLOT(objectReadySlot(QObject*, const QString&)));
+		uiItems.clear();
+
+		if(!doAsync)
+		{
+			VideoListWidget* widget(0);
+			widget = mUiLoader->findWidget<VideoListWidget>(DOCML_NAME_VC_COLLECTIONWIDGET);
+			widget->setVisible(false);
+			widget = mUiLoader->findWidget<VideoListWidget>(DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
+			widget->setVisible(false);
+		}
+	    mListsLoaded = true;
+	}
+}
+
+// ---------------------------------------------------------------------------
+// doDelayedsSlot
+// ---------------------------------------------------------------------------
+//
+void VideoListView::doDelayedsSlot()
+{
+	loadLists(true);
+	loadMultiSelection();
+	loadHint(true);
+	emit doDelayeds();
+}
+
 // ---------------------------------------------------------------------------
 // modelReadySlot
 // ---------------------------------------------------------------------------
@@ -366,33 +433,30 @@
                 mToolbarViewsActionGroup, SLOT(openAllVideosViewSlot()));
 
         // Collections tab
-        mToolbarActions[ETBActionCollections] = createAction(":/images/qtg_mono_video_collection.svg",
+        mToolbarActions[ETBActionCollections] = createAction("qtg_mono_video_collection",
                 mToolbarViewsActionGroup, SLOT(openCollectionViewSlot()));
 
         if (!mIsService)
         {
 			// Services tab
-			mToolbarActions[ETBActionServices] = createAction(":/images/qtg_mono_video_services.svg",
+			mToolbarActions[ETBActionServices] = createAction("qtg_mono_ovistore",
 					mToolbarViewsActionGroup, SLOT(openServicesViewSlot()));
 			// Add Videos tab
-			mToolbarActions[ETBActionAddVideos] = createAction(":/images/mono_video_addvideos.svg",
+			mToolbarActions[ETBActionAddVideos] = 
+			        createAction("qtg_mono_add_to_video_collection",
 					mToolbarCollectionActionGroup, SLOT(addVideosToCollectionSlot()));
 
 			// Remove Videos tab
-			mToolbarActions[ETBActionRemoveVideos] = createAction(":/images/mono_video_removevideos.svg",
-					mToolbarCollectionActionGroup, SLOT(debugNotImplementedYet()));
+			mToolbarActions[ETBActionRemoveVideos] = 
+			        createAction(":/images/qtg_mono_remove_from_video_collection.svg",
+					mToolbarCollectionActionGroup, SLOT(removeVideosFromCollectionSlot()));
         }
 
-        // Sort by tab
-        mToolbarActions[ETBActionSortVideos] = createAction(":/images/mono_video_sortvideos.svg",
-                mToolbarCollectionActionGroup, SLOT(openSortByMenuSlot()));
-
         HbToolBar *bar = toolBar(); // First call to toolBar() creates the object, so on failure it could return 0.
 
         if(   !bar
 		   || !mToolbarActions[ETBActionAllVideos]
            || !mToolbarActions[ETBActionCollections]
-		   || !mToolbarActions[ETBActionSortVideos]
            || (!mToolbarActions[ETBActionServices]     && !mIsService)
            || (!mToolbarActions[ETBActionAddVideos]    && !mIsService)
            || (!mToolbarActions[ETBActionRemoveVideos] && !mIsService))
@@ -402,7 +466,6 @@
             delete mToolbarActions[ETBActionServices];
             delete mToolbarActions[ETBActionAddVideos];
             delete mToolbarActions[ETBActionRemoveVideos];
-            delete mToolbarActions[ETBActionSortVideos];
         	return -1;
         }
 
@@ -412,7 +475,7 @@
 
         if (!mIsService)
         {
-        	mToolbarActions[ETBActionServices]->setCheckable(true);
+        	mToolbarActions[ETBActionServices]->setCheckable(false);
         }
 
         // Allvideos is checked at creation phase
@@ -451,6 +514,32 @@
 }
 
 // ---------------------------------------------------------------------------
+// loadHint
+// ---------------------------------------------------------------------------
+//
+void VideoListView::loadHint(bool doAsync)
+{
+	if(!mHintLoaded)
+	{
+		QSet<QString> uiItems;
+	    uiItems.insert(DOCML_NAME_VC_VIDEOHINTWIDGET);
+	    uiItems.insert(DOCML_NAME_HINT_BUTTON);
+	    uiItems.insert(DOCML_NAME_NO_VIDEOS_LABEL);
+		mUiLoader->startLoading(uiItems,
+			this,
+			SLOT(widgetReadySlot(QGraphicsWidget*, const QString&)),
+			SLOT(objectReadySlot(QObject*, const QString&)));
+		uiItems.clear();
+
+		if(!doAsync)
+		{
+			HbPushButton* button = mUiLoader->findWidget<HbPushButton>(DOCML_NAME_HINT_BUTTON);
+		}
+		mHintLoaded = true;
+	}
+}
+
+// ---------------------------------------------------------------------------
 // showHint
 // ---------------------------------------------------------------------------
 //
@@ -462,9 +551,32 @@
     }
 
     VideoSortFilterProxyModel &model = mCurrentList->getModel();
+
+    HbGroupBox *subLabel =
+        mUiLoader->findWidget<HbGroupBox>(DOCML_NAME_VC_HEADINGBANNER);
+
+    if((!mHintLoaded && !show) || (!mHintLoaded && model.rowCount() != 0))
+    {
+    	if(subLabel)
+    	{
+    		subLabel->show();
+    	}
+    	return;
+    }
+    else if(!mHintLoaded)
+    {
+    	loadHint(false);
+    }
+
     VideoHintWidget *hintWidget =
         mUiLoader->findWidget<VideoHintWidget>(
             DOCML_NAME_VC_VIDEOHINTWIDGET);
+
+    if (hintWidget)
+    {
+        hintWidget->setLevel(mHintLevel);
+    }
+
     if (mModelReady &&
         model.rowCount() == 0 &&
         hintWidget)
@@ -483,8 +595,6 @@
     	{
     		mToolbarActions[ETBActionRemoveVideos]->setVisible(false);
     	}
-        mToolbarActions[ETBActionSortVideos]->setVisible(false);
-
         if(mCurrentList->getLevel() == VideoCollectionCommon::ELevelDefaultColl) 
         {
         	if(!mIsService)
@@ -511,24 +621,18 @@
 	            mToolbarActions[ETBActionAddVideos]->setVisible(true);
 	        }
     	}
-        if(mToolbarActions[ETBActionSortVideos]->isVisible() == false) 
-        {
-            mToolbarActions[ETBActionSortVideos]->setVisible(true);
-        }
         hintWidget->setButtonShown(true);
     }
     
-    HbGroupBox *subLabel =
-        mUiLoader->findWidget<HbGroupBox>(DOCML_NAME_VC_HEADINGBANNER);
     if (subLabel)
     {
         if (show &&
-            subLabel &&
+            subLabel->isVisible() &&
             mCurrentList->getLevel() == VideoCollectionCommon::ELevelVideos)
         {
             subLabel->hide();
         }
-        else
+        else if (!subLabel->isVisible())
         {
             subLabel->show();
         }
@@ -541,13 +645,7 @@
 //
 void VideoListView::setHintLevel(VideoHintWidget::HintLevel level)
 {
-    VideoHintWidget *hintWidget =
-        mUiLoader->findWidget<VideoHintWidget>(
-            DOCML_NAME_VC_VIDEOHINTWIDGET);
-    if (hintWidget)
-    {
-        hintWidget->setLevel(level);
-    }
+	mHintLevel = level;
 }
 
 // ---------------------------------------------------------------------------
@@ -580,19 +678,22 @@
         HbGroupBox *subLabel = 
             mUiLoader->findWidget<HbGroupBox>(
                 DOCML_NAME_VC_HEADINGBANNER);
-        
-        if (mCurrentList == videoListWidget)
-        {
-            subLabel->setHeading(hbTrId("txt_videos_subtitle_ln_videos", itemCount));
-        }
-        else if (mCurrentList == collectionWidget)
+
+        if(subLabel)
         {
-            subLabel->setHeading(hbTrId("txt_videos_subtitle_l1_collections", itemCount));
+			if (mCurrentList == videoListWidget)
+			{
+				subLabel->setHeading(hbTrId("txt_videos_subtitle_ln_videos", itemCount));
+			}
+			else if (mCurrentList == collectionWidget)
+			{
+				subLabel->setHeading(hbTrId("txt_videos_subtitle_ln_collections", itemCount));
+			}
+			else if(mCurrentList == collectionContentWidget)
+			{
+				subLabel->setHeading(hbTrId("txt_videos_subtitle_1_l2").arg(mCollectionName).arg(itemCount));
+			}
         }
-        else if(mCurrentList == collectionContentWidget)
-        {
-            subLabel->setHeading(hbTrId("txt_videos_subtitle_1_l2").arg(mCollectionName).arg(itemCount));
-        }  
     }
 }
 
@@ -678,9 +779,15 @@
 //
 void VideoListView::openAllVideosViewSlot()
 {
+	if(!mListsLoaded)
+	{
+		loadLists(false);
+	}
+
     VideoListWidget *videoListWidget =
         mUiLoader->findWidget<VideoListWidget>(
             DOCML_NAME_VC_VIDEOLISTWIDGET);
+    
     if (mCurrentList &&
         videoListWidget &&
         mCurrentList != videoListWidget)
@@ -706,9 +813,15 @@
 //
 void VideoListView::openCollectionViewSlot()
 {
+	if(!mListsLoaded)
+	{
+		loadLists(false);
+	}
+
     VideoListWidget *collectionWidget =
         mUiLoader->findWidget<VideoListWidget>(
             DOCML_NAME_VC_COLLECTIONWIDGET);
+    
     if (mCurrentList &&
         mCurrentList != collectionWidget)
     {
@@ -778,20 +891,30 @@
     {
         // get sorting role from active action
         HbAction *action = optionsMenu->activeAction()->menu()->activeAction();
-        int role = mSortingRoles[action];
+        if(action)
+		{
+			doSorting(mSortingRoles[action]);
+		}
+    }
+}
 
-        // sort model
-        Qt::SortOrder order(Qt::AscendingOrder);
-        VideoSortFilterProxyModel &model = mCurrentList->getModel();
-        if(model.sortRole() == role && model.sortOrder() == Qt::AscendingOrder)
-        {
-            order = Qt::DescendingOrder;
-        }
-        model.doSorting(role, order);
+// ---------------------------------------------------------------------------
+// doSorting()
+// ---------------------------------------------------------------------------
+//
+void VideoListView::doSorting(int role)
+{
+	// sort model
+	Qt::SortOrder order(Qt::AscendingOrder);
+	VideoSortFilterProxyModel &model = mCurrentList->getModel();
+	if(model.sortRole() == role && model.sortOrder() == Qt::AscendingOrder)
+	{
+		order = Qt::DescendingOrder;
+	}
+	model.doSorting(role, order);
 
-        // save sorting values
-        mUiUtils.saveSortingValues(role, order);
-    }    
+	// save sorting values
+	mUiUtils.saveSortingValues(role, order);
 }
 
 // -------------------------------------------------------------------------------------------------
@@ -828,6 +951,12 @@
     {
         return;
     }
+
+    if(!mMultiselectionLoaded)
+    {
+    	loadMultiSelection();
+    }
+
     VideoListSelectionDialog *dialog =
         mUiLoader->findWidget<VideoListSelectionDialog>(
             DOCML_NAME_DIALOG);
@@ -855,8 +984,8 @@
     
     bool ok = false;
     // query a name for the collection
-    QString label(tr("Enter name:")); // TODO: localization missing!
-    QString text(tr("New collection")); // TODO: localization missing!
+    QString label(hbTrId("txt_videos_title_enter_name"));
+    QString text(hbTrId("txt_videos_dialog_entry_new_collection"));
     text = HbInputDialog::getText(label, text, &ok);
     if (ok && text.length())
     {
@@ -885,32 +1014,82 @@
     {
         return;
     }
-    
+
+    if(!mMultiselectionLoaded)
+    {
+    	loadMultiSelection();
+    }
+
     VideoListSelectionDialog *dialog =
         mUiLoader->findWidget<VideoListSelectionDialog>(
             DOCML_NAME_DIALOG);
-    if (dialog)
+    if (!dialog)
     {
-        if(mCurrentList->getLevel() == VideoCollectionCommon::ELevelAlbum)
+        // fatal: no selection dialog
+        return;
+    }
+    if(mCurrentList->getLevel() == VideoCollectionCommon::ELevelAlbum)
+    {
+        // album is opened, do not proceed in case it already have same amount
+        // of videos than all videos view.
+        VideoListWidget *allVideos = mUiLoader->findWidget<VideoListWidget>(
+                    DOCML_NAME_VC_VIDEOLISTWIDGET);
+        if(allVideos)
         {
-            // album is opened, do not proceed in case it already have same amount
-            // of videos than all videos view.
-            VideoListWidget *allVideos = mUiLoader->findWidget<VideoListWidget>(
-                        DOCML_NAME_VC_VIDEOLISTWIDGET);
-            if(allVideos)
+            int count = allVideos->getModel().rowCount();
+            if(count == mCurrentList->getModel().rowCount())
             {
-                if(allVideos->getModel().rowCount() == mCurrentList->getModel().rowCount())
+                if(count)
                 {
                     QVariant emptyAdditional;
                     mUiUtils.showStatusMsgSlot(
                             VideoCollectionCommon::statusAllVideosAlreadyInCollection,
                             emptyAdditional);
-                    return;
-                }  
-            }
+                }
+                return;
+            }  
         }
-        TMPXItemId collectionId = mCurrentList->getModel().getOpenItem();
-        dialog->setupContent(VideoListSelectionDialog::EAddToCollection, collectionId);
+    }
+    TMPXItemId collectionId = mCurrentList->getModel().getOpenItem();
+    dialog->setupContent(VideoListSelectionDialog::EAddToCollection, collectionId);
+    dialog->exec();
+}
+
+// -------------------------------------------------------------------------------------------------
+// removeVideosFromCollectionSlot
+// -------------------------------------------------------------------------------------------------
+//
+void VideoListView::removeVideosFromCollectionSlot()
+{
+    if(!mCurrentList)
+    {
+        return;
+    }
+    // not allowed if for some reason current widget 
+    // is all videos or collection or there are no items
+    if(mCurrentList->getLevel() < VideoCollectionCommon::ELevelDefaultColl ||
+       !mCurrentList->getModel().rowCount())
+    {
+        return;
+    }
+
+    if(!mMultiselectionLoaded)
+    {
+    	loadMultiSelection();
+    }
+
+    VideoListSelectionDialog *dialog =
+            mUiLoader->findWidget<VideoListSelectionDialog>(
+                        DOCML_NAME_DIALOG);
+    if (!dialog)
+    {
+        // fatal: no selection dialog
+        return;
+    }
+    TMPXItemId collectionId = mCurrentList->getModel().getOpenItem();
+    if(collectionId != TMPXItemId::InvalidId() && collectionId.iId2 != KVcxMvcMediaTypeVideo)
+    {
+        dialog->setupContent(VideoListSelectionDialog::ERemoveFromCollection, collectionId);
         dialog->exec();
     }
 }
@@ -935,7 +1114,6 @@
     showAction(false, DOCML_NAME_SORT_BY_DATE);
     showAction(false, DOCML_NAME_SORT_BY_NAME);
     showAction(false, DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS);
-    showAction(false, DOCML_NAME_SORT_BY_TOTAL_LENGTH);
     showAction(false, DOCML_NAME_SORT_BY_RATING);
     showAction(false, DOCML_NAME_SORT_BY_SIZE);
     showAction(false, DOCML_NAME_SORT_MENU);
@@ -958,8 +1136,7 @@
     {
         showAction(true, DOCML_NAME_SORT_MENU);
         showAction(true, DOCML_NAME_SORT_BY_DATE);
-        if (isActionChecked(DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS) ||
-            isActionChecked(DOCML_NAME_SORT_BY_TOTAL_LENGTH)) 
+        if (isActionChecked(DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS))
         {
             //TODO: when changing between videos and categories, sorting order needs to be changed, if new
             //      view does not have the previously active sorting order supported
@@ -1010,11 +1187,29 @@
         }
         
         showAction(true, DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS);
-        showAction(true, DOCML_NAME_SORT_BY_TOTAL_LENGTH);
     }
     else if(firstAction != mToolbarActions[ETBActionAllVideos])
     {
-        //Add, Remove and Sort by will be launched from toolbar
+        showAction(true, DOCML_NAME_SORT_MENU);
+        showAction(true, DOCML_NAME_SORT_BY_DATE);
+        if (isActionChecked(DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS))
+        {
+            //TODO: when changing between videos and categories, sorting order needs to be changed, if new
+            //      view does not have the previously active sorting order supported
+            showAction(true, DOCML_NAME_SORT_BY_DATE);
+        }
+        else
+        {
+            HbAction* action = mSortingRoles.key(role);
+            if (action)
+            {
+                action->setChecked(true);
+            }
+        }
+
+        showAction(true, DOCML_NAME_SORT_BY_NAME);
+        showAction(true, DOCML_NAME_SORT_BY_SIZE);
+
         if (!mIsService)
         {
             showAction(true, DOCML_NAME_DELETE_MULTIPLE);
@@ -1040,28 +1235,31 @@
     const QString& collection,
     const QModelIndex &index)
 {
-    if(!mToolbarCollectionActionGroup || !mToolbarViewsActionGroup || !mToolbarActions.contains(ETBActionCollections))
-    {
-        return;
-    }
-    
+	if(mTransitionOngoing)
+	{
+		return;
+	}
+	else
+	{
+	    // clear toolbar actions.
+	    toolBar()->clearActions();
+	}
+	
     // update collection specific information
     mCollectionName = collection;
 
-    HbToolBar* bar = toolBar();
-    bar->clearActions();
-
-    if (collectionOpened)
+    if(collectionOpened)
     {
         if(!index.isValid())
         {   
             return;
         }
-		
+        
         // open album view
         VideoListWidget *collectionContentWidget =
             mUiLoader->findWidget<VideoListWidget>(
                 DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
+        
         if (mCurrentList &&
             mCurrentList != collectionContentWidget)
         {
@@ -1077,88 +1275,104 @@
                 return;
             }
             
-            // deactivat current
-            mCurrentList->deactivate();
-			
-            // activate video collection content widget
-            mCurrentList = collectionContentWidget;
-            
+            // Send level that is opened with the effect.
+            QVariant nextLevel;
             if(itemId.iId2 ==  KVcxMvcMediaTypeCategory)
             {
-                mCurrentList->activate(VideoCollectionCommon::ELevelDefaultColl);
+                nextLevel = QVariant(VideoCollectionCommon::ELevelDefaultColl);
             }
             else if(itemId.iId2 == KVcxMvcMediaTypeAlbum)
             {
-                mCurrentList->activate(VideoCollectionCommon::ELevelAlbum);
-            }
-            mCurrentList->getModel().openItem(itemId);
+                nextLevel = QVariant(VideoCollectionCommon::ELevelAlbum);
+            }            
+            
+            // Start fetching content.
+            collectionContentWidget->getModel().openItem(itemId);
             
-            // update hint widget, but don't show yet
-            setHintLevel(VideoHintWidget::Collection);
-            showHint(false);
+            HbEffect::start(collectionContentWidget,
+                            EFFECT_SLIDE_IN_TO_LEFT,
+                            this,
+                            "finishCollectionOpenedSlot",
+                            nextLevel);
             
-            // update toolbar
-            mToolbarActions[ETBActionCollections]->setChecked(false);
-            bar->addActions(mToolbarCollectionActionGroup->actions());
+            mTransitionOngoing = true;
         }
     }
     else
     {
-        // open collection view
-        openCollectionViewSlot();
+        // open categories view.
+        VideoListWidget *collectionContentWidget =
+            mUiLoader->findWidget<VideoListWidget>(
+                DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
         
-        // update toolbar
-        bar->addActions(mToolbarViewsActionGroup->actions());
-        mToolbarActions[ETBActionCollections]->setChecked(true);
+        HbEffect::start(collectionContentWidget,
+                        EFFECT_SLIDE_OUT_TO_LEFT,
+                        this,
+                        "finishCollectionClosedSlot");
+        
+        mTransitionOngoing = true;
     }
 }
 
 // -------------------------------------------------------------------------------------------------
-// openSortByMenuSlot
+// finishCollectionOpenedSlot
 // -------------------------------------------------------------------------------------------------
 //
-void VideoListView::openSortByMenuSlot()
+void VideoListView::finishCollectionOpenedSlot(const HbEffect::EffectStatus &status)
 {
-	if(!mCurrentList)
-	{
-		return;
-	}
-	
-    VideoSortFilterProxyModel &model = mCurrentList->getModel();
-    if (!model.rowCount(QModelIndex()))
+    Q_UNUSED(status);
+    
+    mTransitionOngoing = false;
+    
+    // deactivat current widget.
+    mCurrentList->deactivate();
+    
+    // activate video collection content widget.
+    mCurrentList = mUiLoader->findWidget<VideoListWidget>(
+                    DOCML_NAME_VC_COLLECTIONCONTENTWIDGET);
+
+    if(!mCurrentList || !status.userData.isValid())
     {
-        // no items, no menu
         return;
     }
     
-    // hide all actions by default
-    showAction(false, DOCML_NAME_ADD_TO_COLLECTION);
-    showAction(false, DOCML_NAME_CREATE_COLLECTION);
-    showAction(false, DOCML_NAME_DELETE_MULTIPLE);
-    showAction(false, DOCML_NAME_SORT_BY_DATE);
-    showAction(false, DOCML_NAME_SORT_BY_NAME);
-    showAction(false, DOCML_NAME_SORT_BY_NUMBER_OF_ITEMS);
-    showAction(false, DOCML_NAME_SORT_BY_TOTAL_LENGTH);
-    showAction(false, DOCML_NAME_SORT_BY_RATING);
-    showAction(false, DOCML_NAME_SORT_BY_SIZE);
-    showAction(false, DOCML_NAME_SORT_MENU);
+    updateSubLabel();
+
+    VideoCollectionCommon::TCollectionLevels level =
+            static_cast<VideoCollectionCommon::TCollectionLevels>(status.userData.toInt());
+    mCurrentList->activate(level);
     
-    // if sort menu found, show all sort items
-    HbMenu *sortMenu = mUiLoader->findWidget<HbMenu>(DOCML_NAME_SORT_MENU);
-    if (sortMenu)
+    // update hint widget
+    setHintLevel(VideoHintWidget::Collection);
+    showHint();
+
+    // update toolbar for albums, default categories don't have one.
+    if(level == VideoCollectionCommon::ELevelAlbum && 
+       mToolbarCollectionActionGroup && mToolbarActions.contains(ETBActionCollections))
     {
-        // show actions
-        showAction(true, DOCML_NAME_SORT_MENU);
-        showAction(true, DOCML_NAME_SORT_BY_DATE);
-        showAction(true, DOCML_NAME_SORT_BY_NAME);
-        showAction(true, DOCML_NAME_SORT_BY_SIZE);
+        mToolbarActions[ETBActionCollections]->setChecked(false);
+        toolBar()->addActions(mToolbarCollectionActionGroup->actions());
+    }
+}
 
-        // show sort menu
-        sortMenu->show();
-        
-        // execute sort menu
-        QPointF coords((size()/2).width(), (size()/3).height());
-        sortMenu->exec(coords);
+// -------------------------------------------------------------------------------------------------
+// finishCollectionClosedSlot
+// -------------------------------------------------------------------------------------------------
+//
+void VideoListView::finishCollectionClosedSlot(const HbEffect::EffectStatus &status)
+{
+    Q_UNUSED(status);
+    
+    mTransitionOngoing = false;
+    
+    // open collection view
+    openCollectionViewSlot();
+    
+    // update toolbar
+    if(mToolbarViewsActionGroup && mToolbarActions.contains(ETBActionCollections))
+    {
+        toolBar()->addActions(mToolbarViewsActionGroup->actions());
+        mToolbarActions[ETBActionCollections]->setChecked(true);
     }
 }
 
@@ -1171,12 +1385,15 @@
     if (name.compare(DOCML_NAME_VC_VIDEOLISTWIDGET) == 0)
     {
         connect(widget, SIGNAL(command(int)), this, SIGNAL(command(int)));
+        connect(this, SIGNAL(doDelayeds()), widget, SLOT(doDelayedsSlot()));
     }
     else if (name.compare(DOCML_NAME_VC_COLLECTIONWIDGET) == 0)
     {
         connect(
             widget, SIGNAL(collectionOpened(bool, const QString&, const QModelIndex&)),
             this, SLOT(collectionOpenedSlot(bool, const QString&, const QModelIndex&)));
+            connect(this, SIGNAL(doDelayeds()), widget, SLOT(doDelayedsSlot()));
+            emit(doDelayeds());
     }
     else if (name.compare(DOCML_NAME_VC_COLLECTIONCONTENTWIDGET) == 0)
     {
@@ -1184,6 +1401,8 @@
         connect(
             widget, SIGNAL(collectionOpened(bool, const QString&, const QModelIndex&)),
             this, SLOT(collectionOpenedSlot(bool, const QString&, const QModelIndex&)));
+            connect(this, SIGNAL(doDelayeds()), widget, SLOT(doDelayedsSlot()));
+            emit(doDelayeds());
     }
     else if (name.compare(DOCML_NAME_OPTIONS_MENU) == 0)
     {
@@ -1230,16 +1449,6 @@
             mSortingRoles[action] = 0;
         }
     }
-    else if (name.compare(DOCML_NAME_SORT_BY_TOTAL_LENGTH) == 0)
-    {
-        HbAction *action = qobject_cast<HbAction*>(object);
-        if (action)
-        {
-        	// TODO: implement
-            connect(action, SIGNAL(triggered()), this, SLOT(debugNotImplementedYet()));
-            mSortingRoles[action] = 0;
-        }
-    }
     else if (name.compare(DOCML_NAME_SORT_BY_SIZE) == 0)
     {
         HbAction *action = qobject_cast<HbAction*>(object);