diff -r a60acebbbd9d -r 78ad99c24f08 photosgallery/viewframework/medialists/src/glxmedialist.cpp --- a/photosgallery/viewframework/medialists/src/glxmedialist.cpp Tue May 11 16:13:40 2010 +0300 +++ b/photosgallery/viewframework/medialists/src/glxmedialist.cpp Tue May 25 12:42:31 2010 +0300 @@ -39,6 +39,17 @@ #include "mglxmedialistobserver.h" #include "glxmediastaticitemdefs.h" +/** + * Min & Max wait interval for a modify event, in microseconds + * This is to allow thumbnail manager to procees the event first. + */ +const TInt KModifyEventMinWaitInterval = 2000000; +const TInt KModifyEventMaxWaitInterval = 3000000; +/** + * Maximum items count for minimum wait interval. + */ +const TInt KMaxItemsCount = 500; + namespace NGlxMediaList { /** @@ -1288,6 +1299,7 @@ iMediaListArray = CGlxMediaListArray::InstanceL(); iCountAttributes.AppendL(KGlxMediaCollectionPluginSpecificSubTitle); iCountAttributes.AppendL(KGlxMediaGeneralSlideshowableContent); + iCountAttributes.AppendL(KMPXMediaGeneralCount); } // ----------------------------------------------------------------------------- @@ -1510,6 +1522,32 @@ } CleanupStack::PopAndDestroy(&itemIndices); + + RPointerArray& mediaLists = iMediaListArray->Array(); + TInt listCount = mediaLists.Count(); + GLX_DEBUG2("ML:HandleItemModifiedL listCount=%d", listCount); + if (listCount > 0) + { + CGlxMediaList* mediaList = mediaLists[listCount-1]; + // Force a delay to allow TNM to process the modified event + if (mediaList == this) + { + GLX_DEBUG3("ML:HandleItemModifiedL(wait) listCount=%d, Id=%d", + listCount, id.Value()); + TTimeIntervalMicroSeconds32 timeout; + timeout = (mediaList->Count() > KMaxItemsCount ? + KModifyEventMaxWaitInterval : KModifyEventMinWaitInterval ); + RTimer timer; + CleanupClosePushL(timer); + TRequestStatus status; + timer.CreateLocal(); + timer.After(status, timeout); + // User::WaitForRequest() will add codescanner warning but is necessary + // as User::WaitForAnyRequest() cannot be used in this case + User::WaitForRequest(status); + CleanupStack::PopAndDestroy(&timer); + } + } } } @@ -1847,17 +1885,8 @@ void CGlxMediaList::CancelPreviousRequests() { - TRACER("CGlxMediaList::CancelPreviousRequests"); - - TInt focusIndex = FocusIndex(); - - if(focusIndex >= KErrNone) - { - if(!Item(focusIndex).Properties()) - { - // If media is NULL, cancel the previous pending request. - // Place a new request for the item in focus, to fetch the media attributes - iManager->CancelPreviousRequest(); - } - } - } + TRACER("CGlxMediaList::CancelPreviousRequests"); + // Cancel the previous pending request. + // Place a new request for the item in focus, to fetch the media attributes + iManager->CancelPreviousRequest(); + }