diff -r a60acebbbd9d -r 78ad99c24f08 photosgallery/viewframework/views/listview/src/glxlistviewimp.cpp --- a/photosgallery/viewframework/views/listview/src/glxlistviewimp.cpp Tue May 11 16:13:40 2010 +0300 +++ b/photosgallery/viewframework/views/listview/src/glxlistviewimp.cpp Tue May 25 12:42:31 2010 +0300 @@ -55,7 +55,8 @@ #include // For transition effects #include "glxgfxtranseffect.h" // For transition effects -const TInt KListDataWindowSize(16); +const TInt KListDataWindowSize(8); // Visible page +const TInt KListNonVisibleDataWindowSize(32); // Visible page + 3 pages const TInt KNoOfPages(4); const TInt KGlxCollectionRootLevel = 1; @@ -226,10 +227,11 @@ GlxSetAppState::SetState(EGlxInListView); // Separate contexts so that some attributes are loaded before others - iThumbnailIterator.SetRangeOffsets(KListDataWindowSize, - KListDataWindowSize); - iTitleAttributeContext = new (ELeave) CGlxAttributeContext( - &iThumbnailIterator); + // No need to fetch the rear pages as we do not support looping + iThumbnailIterator.SetRangeOffsets(0, KListDataWindowSize); + + iTitleAttributeContext = CGlxDefaultAttributeContext::NewL(); + iTitleAttributeContext->SetRangeOffsets(0, KMaxTInt); iTitleAttributeContext->AddAttributeL(KMPXMediaGeneralTitle); iSubtitleAttributeContext = new (ELeave) CGlxAttributeContext( @@ -238,9 +240,42 @@ KGlxMediaCollectionPluginSpecificSubTitle); iMediaList->AddContextL(iTitleAttributeContext, KMaxTInt); - iMediaList->AddContextL(iSubtitleAttributeContext, KMaxTInt); + iMediaList->AddContextL(iSubtitleAttributeContext, KGlxFetchContextPriorityNormal); if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) { + iOtherAttribsContext = new (ELeave) CGlxAttributeContext( + &iThumbnailIterator); + iOtherAttribsContext->AddAttributeL(KMPXMediaGeneralCount); + + iNonVisibleThumbnailIterator.SetRangeOffsets(0, KListNonVisibleDataWindowSize); + iNonVisibleSubtitleAttributeContext + = new (ELeave) CGlxAttributeContext( + &iNonVisibleThumbnailIterator); + iNonVisibleSubtitleAttributeContext->AddAttributeL( + KGlxMediaCollectionPluginSpecificSubTitle); + iMediaList->AddContextL(iNonVisibleSubtitleAttributeContext, + KGlxFetchContextPriorityLow); + iNonVisibleOtherAttribsContext = new (ELeave) CGlxAttributeContext( + &iNonVisibleThumbnailIterator); + iNonVisibleOtherAttribsContext->AddAttributeL(KMPXMediaGeneralCount); + + CMPXCollectionPath* path = iMediaList->PathLC( + NGlxListDefs::EPathParent); + if (path->Id(0) == KGlxCollectionPluginAlbumsImplementationUid) + { + iOtherAttribsContext->AddAttributeL(KGlxMediaGeneralSystemItem); + iOtherAttribsContext->AddAttributeL( + KGlxMediaGeneralSlideshowableContent); + + iNonVisibleOtherAttribsContext->AddAttributeL( + KGlxMediaGeneralSystemItem); + iNonVisibleOtherAttribsContext->AddAttributeL( + KGlxMediaGeneralSlideshowableContent); + } + CleanupStack::PopAndDestroy(path); + + iMediaList->AddContextL(iOtherAttribsContext, + KGlxFetchContextPriorityNormal); iThumbnailContext = new (ELeave) CGlxAttributeContext( &iThumbnailIterator); TMPXAttribute tnAttr(KGlxMediaIdThumbnail, @@ -251,6 +286,16 @@ iThumbnailContext->AddAttributeL(tnAttr); iMediaList->AddContextL(iThumbnailContext, KGlxFetchContextPriorityNormal); + + iMediaList->AddContextL(iNonVisibleOtherAttribsContext, + KGlxFetchContextPriorityLow); + iNonVisibleThumbnailContext = new (ELeave) CGlxAttributeContext( + &iNonVisibleThumbnailIterator); + iNonVisibleThumbnailContext->SetDefaultSpec(iGridIconSize.iWidth, + iGridIconSize.iHeight); + iNonVisibleThumbnailContext->AddAttributeL(tnAttr); + iMediaList->AddContextL(iNonVisibleThumbnailContext, + KGlxFetchContextPriorityLow); } iMediaList->AddMediaListObserverL(this); @@ -258,10 +303,10 @@ iBgContext = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgScreen,apRect,ETrue); - if(iUiUtility->ViewNavigationDirection() == EGlxNavigationBackwards ) - { - iBackwardNavigation = ETrue; - } + iBackwardNavigation = (iUiUtility->ViewNavigationDirection() + == EGlxNavigationBackwards); + GLX_LOG_INFO1("CGlxListViewImp::DoMLViewActivateL() - " + "iBackwardNavigation(%d)", iBackwardNavigation); iPreviewTNBinding = CGlxPreviewThumbnailBinding::NewL(*this); CreateListL(); @@ -302,19 +347,7 @@ iTitletext = titlePane->Text()->AllocL()); } - iMediaList->RemoveContext( iTitleAttributeContext ); - delete iTitleAttributeContext; - iTitleAttributeContext = NULL; - - iMediaList->RemoveContext( iSubtitleAttributeContext ); - delete iSubtitleAttributeContext; - iSubtitleAttributeContext = NULL; - if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) - { - iMediaList->RemoveContext(iThumbnailContext); - delete iThumbnailContext; - iThumbnailContext = NULL; - } + RemoveContext(); iMediaList->RemoveMediaListObserver( this ); delete iPreviewTNBinding; iPreviewTNBinding = NULL; @@ -330,6 +363,67 @@ } // --------------------------------------------------------------------------- +// RemoveContext +// --------------------------------------------------------------------------- +// +void CGlxListViewImp::RemoveContext() + { + TRACER("CGlxListViewImp::DoMLViewDeactivate"); + + if (iTitleAttributeContext) + { + iMediaList->RemoveContext(iTitleAttributeContext); + delete iTitleAttributeContext; + iTitleAttributeContext = NULL; + } + + if (iSubtitleAttributeContext) + { + iMediaList->RemoveContext(iSubtitleAttributeContext); + delete iSubtitleAttributeContext; + iSubtitleAttributeContext = NULL; + } + + if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) + { + if (iOtherAttribsContext) + { + iMediaList->RemoveContext(iOtherAttribsContext); + delete iOtherAttribsContext; + iOtherAttribsContext = NULL; + } + + if (iThumbnailContext) + { + iMediaList->RemoveContext(iThumbnailContext); + delete iThumbnailContext; + iThumbnailContext = NULL; + } + + if (iNonVisibleSubtitleAttributeContext) + { + iMediaList->RemoveContext(iNonVisibleSubtitleAttributeContext); + delete iNonVisibleSubtitleAttributeContext; + iNonVisibleSubtitleAttributeContext = NULL; + } + + if (iNonVisibleOtherAttribsContext) + { + iMediaList->RemoveContext(iNonVisibleOtherAttribsContext); + delete iNonVisibleOtherAttribsContext; + iNonVisibleOtherAttribsContext = NULL; + } + + if (iNonVisibleThumbnailContext) + { + iMediaList->RemoveContext(iNonVisibleThumbnailContext); + delete iNonVisibleThumbnailContext; + iNonVisibleThumbnailContext = NULL; + } + } + } + +// --------------------------------------------------------------------------- // Destroys the Widget // --------------------------------------------------------------------------- // @@ -456,7 +550,6 @@ UpdatePreviewL(i); } - iList->RefreshScreen(visIndex); if(iMediaList->IdSpaceId(0) == KGlxIdSpaceIdRoot) { if ( visIndex != iLastFocusedIndex && !iPopulateListTNs) @@ -518,6 +611,7 @@ if (iNextViewActivationEnabled && (aIndex >= 0 && aIndex < iMediaList->Count()) && (iUiUtility->GetItemsLeftCount() == 0)) { + iMediaList->CancelPreviousRequests(); //Delete the PreviewTNMBinding as in forward navigation //we do not get the medialist callback. delete iPreviewTNBinding; @@ -530,38 +624,19 @@ //Navigate to the next view iUiUtility->SetViewNavigationDirection(EGlxNavigationForwards); GLX_LOG_INFO("CGlxListViewImp::HandleOpenL()- EGlxNavigationForwards!"); - CMPXCollectionPath* path = iMediaList->PathLC( NGlxListDefs::EPathFocusOrSelection); // When a collection is opened for browsing, // there are two queries executed with similar filter. // First query to open the collection from list / cloud view. - // Second one from grid view construction. To improve the grid opening - // performance, the first query will be completed with empty Id list. - CMPXCollectionPath* pathParent = iMediaList->PathLC( - NGlxListDefs::EPathParent); - - if ((iMediaList->IdSpaceId(0) == KGlxIdSpaceIdRoot && path->Id(0) - == KGlxCollectionPluginAllImplementationUid) - || (pathParent->Id() - == KGlxCollectionPluginMonthsImplementationUid) - || (pathParent->Id() - == KGlxCollectionPluginAlbumsImplementationUid)) - { - RArray attributeArray; - CleanupClosePushL(attributeArray); - attributeArray.AppendL(KGlxFilterGeneralNavigationalStateOnly); - iCollectionUtility->Collection().OpenL(*path, - attributeArray.Array()); - CleanupStack::PopAndDestroy(&attributeArray); - } - else - { - iCollectionUtility->Collection().OpenL(*path); - } - - CleanupStack::PopAndDestroy(pathParent); + // Second one from grid/list view construction. To improve the grid/list + // opening performance, the first query will be completed with empty Id list. + RArray attributeArray; + CleanupClosePushL(attributeArray); + attributeArray.AppendL(KGlxFilterGeneralNavigationalStateOnly); + iCollectionUtility->Collection().OpenL(*path, attributeArray.Array()); + CleanupStack::PopAndDestroy(&attributeArray); CleanupStack::PopAndDestroy(path); } } @@ -613,17 +688,9 @@ } } - TInt firstIndex = iList->FirstIndexOnScreen(); - TInt itemsOnScreen = iList->ItemsOnScreen(); - TInt lastOnScreen = firstIndex + itemsOnScreen - 1; - if (lastOnScreen > (mediaCount - 1)) - { - lastOnScreen = mediaCount - 1; - } - GLX_DEBUG2("CGlxListViewImp::PreviewTNReadyL()" - " RefreshScreen - focusIndex(%d)", focusIndex); - iList->RefreshScreen(focusIndex); + " RefreshList(%d)", focusIndex); + RefreshList(focusIndex); if (iPopulateListTNs) { @@ -756,20 +823,21 @@ HBufC* emptyText = StringLoader::LoadLC(R_LIST_EMPTY_VIEW_TEXT); iList->SetEmptyTextL(*emptyText); CleanupStack::PopAndDestroy(emptyText); + + //While coming back to main listview + TGlxIdSpaceId id = iMediaList->IdSpaceId(0); + if((id == KGlxIdSpaceIdRoot) && (mediaCount > 0)) + { + for (TInt i = 0; i < mediaCount; i++) + { + SetDefaultThumbnailL(i); + } + } } //Fix for ESLM-7SAHPT::Clear Flag to Disable QWERTY search input in list view iList->ClearFlags(CHgScroller::EHgScrollerSearchWithQWERTY ); - //While coming back to main listview - TGlxIdSpaceId id = iMediaList->IdSpaceId(0); - if((id == KGlxIdSpaceIdRoot) && (mediaCount > 0)) - { - for (TInt i = 0; i < mediaCount; i++) - { - SetDefaultThumbnailL(i); - } - } // Set the scrollbar type for albums list if (path->Id() == KGlxCollectionPluginAlbumsImplementationUid) { @@ -796,7 +864,6 @@ } iMediaList->SetFocusL(NGlxListDefs::EAbsolute, iLastFocusedIndex); iList->SetSelectedIndex(iLastFocusedIndex); - iList->RefreshScreen(iLastFocusedIndex); } } @@ -817,7 +884,10 @@ const TGlxMedia& item = iMediaList->Item(i); iList->ItemL(i).SetTitleL(item.Title()); iList->ItemL(i).SetTextL(item.SubTitle()); - SetDefaultThumbnailL(i); + if (iMediaList->IdSpaceId(0) == KGlxIdSpaceIdRoot) + { + SetDefaultThumbnailL(i); + } } if(aStartIndex == aEndIndex ) @@ -825,10 +895,9 @@ iLastFocusedIndex = aStartIndex; iPopulateListTNs = EFalse; iMediaList->SetFocusL(NGlxListDefs::EAbsolute, iLastFocusedIndex); + iList->SetSelectedIndex(iLastFocusedIndex); + iList->RefreshScreen(iLastFocusedIndex); } - - iList->SetSelectedIndex(iLastFocusedIndex); - iList->RefreshScreen(iLastFocusedIndex); } } @@ -874,14 +943,25 @@ if (KErrNotFound != aAttributes.Find(titleAttrib, match)) { iList->ItemL(aItemIndex).SetTitleL(item.Title()); - iList->RefreshScreen(aItemIndex); + if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) + { + iList->RefreshScreen(aItemIndex); + } } if (KErrNotFound != aAttributes.Find(subTitleAttrib, match)) { iList->ItemL(aItemIndex).SetTextL(item.SubTitle()); - iList->RefreshScreen(aItemIndex); - + + if (iMediaList->IdSpaceId(0) == KGlxIdSpaceIdRoot) + { + RefreshList(aItemIndex); + } + else + { + iList->RefreshScreen(aItemIndex); + } + // If there is some modified in grid/fullscreen view, // HandleAttributesAvailableL will get called. Here we are setting // iIsRefreshNeeded flag to ETrue @@ -893,10 +973,6 @@ CleanUpL(); } } - if(iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) - { - UpdatePreviewL(aItemIndex); - } // Set iPopulateListTNs to ETrue and refresh all the items in // list view if subtitle is updated else if (iPreviewTNBinding && ((!iPopulateListTNs && aItemIndex @@ -912,17 +988,20 @@ CleanupStack::PopAndDestroy(path); } } - TMPXAttribute thumbnailAttribute(KGlxMediaIdThumbnail, - GlxFullThumbnailAttributeId(ETrue, iGridIconSize.iWidth, - iGridIconSize.iHeight)); - if (KErrNotFound != aAttributes.Find(thumbnailAttribute, match)) - { - if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) - { - UpdatePreviewL(aItemIndex); - iIsRefreshNeeded = EFalse; - } - } + + if (iMediaList->IdSpaceId(0) != KGlxIdSpaceIdRoot) + { + TMPXAttribute countAttrib(KMPXMediaGeneralCount); + TMPXAttribute thumbnailAttribute(KGlxMediaIdThumbnail, + GlxFullThumbnailAttributeId(ETrue, iGridIconSize.iWidth, + iGridIconSize.iHeight)); + if ((KErrNotFound != aAttributes.Find(thumbnailAttribute, match)) + || (KErrNotFound != aAttributes.Find(countAttrib, match))) + { + iIsRefreshNeeded = EFalse; + UpdatePreviewL(aItemIndex); + } + } } // ---------------------------------------------------------------------------- @@ -1244,18 +1323,55 @@ iGridIconSize.iHeight)); GLX_LOG_INFO1("CGlxListViewImp::UpdatePreviewL(aIndex = %d)", aIndex); const TGlxMedia& item = iMediaList->Item(aIndex); + + TMPXAttribute attrCount(KMPXMediaGeneralCount); + TInt usageCount = 0; + const CGlxMedia* media = item.Properties(); + if (media) + { + if (media->IsSupported(attrCount)) + { + usageCount = media->ValueTObject (attrCount); + GLX_LOG_INFO1("CGlxListViewImp::UpdatePreviewL() - UsageCount(%d)", usageCount); + } + } + const CGlxThumbnailAttribute* value = item.ThumbnailAttribute( thumbnailAttribute); - if (value) + if (usageCount && value) { CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); iPreviewTNBinding->ScaleBitmapToListSizeL(value->iBitmap, bitmap); iList->ItemL(aIndex).SetIcon(CGulIcon::NewL(bitmap)); + CleanupStack::Pop(bitmap); iList->RefreshScreen(aIndex); - CleanupStack::Pop(bitmap); } } } +// ---------------------------------------------------------------------------- +// RefreshList +// ---------------------------------------------------------------------------- +// +void CGlxListViewImp::RefreshList(TInt aIndex) + { + TRACER("CGlxListViewImp::RefreshList()"); + GLX_DEBUG2("CGlxListViewImp::RefreshList(%d)", aIndex); + __ASSERT_ALWAYS(iList, Panic(EGlxPanicNullPointer)); + TInt firstIndex = iList->FirstIndexOnScreen(); + TInt itemsOnScreen = iList->ItemsOnScreen(); + TInt lastOnScreen = firstIndex + itemsOnScreen - 1; + TInt mediaCount = iMediaList->Count(); + if (lastOnScreen > (mediaCount - 1)) + { + lastOnScreen = mediaCount - 1; + } + + if (aIndex == lastOnScreen) + { + GLX_DEBUG2("CGlxListViewImp::RefreshList() RefreshScreen(%d)", aIndex); + iList->RefreshScreen(aIndex); + } + } // End of File