diff -r 000000000000 -r f72a12da539e menufw/menufwui/mmwidgets/src/mmdraweranimator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/menufwui/mmwidgets/src/mmdraweranimator.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Version : %version: MM_40 % << Don't touch! Updated by Synergy at check-out. +* +*/ + +#include + +#include "mmdraweranimator.h" +#include "mmlistboxitemdrawer.h" +#include "mmfloatingitem.h" +#include "mmwidgetcontainer.h" + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmDrawerAnimator::CMmDrawerAnimator(CMmListBoxItemDrawer& aDrawer) : + CActive( AknLayoutUtils::PenEnabled() ? + EPriorityRealTime : + EPriorityAbsoluteRealTime8 ), iDrawer(aDrawer), + iLastNotedHighlight( KErrNotFound ), iLastNotedTopItem( KErrNotFound ), + iLastNotedVerticalOffset( 0 ), + iUsualAnimationFramesCount( AknLayoutUtils::PenEnabled() ? + MmEffects::KUsualAnimationFramesCount : + MmEffects::KUsualAnimationFramesCountNonTouch ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmDrawerAnimator* CMmDrawerAnimator::NewLC(CMmListBoxItemDrawer& aDrawer) + { + CMmDrawerAnimator* self = new ( ELeave ) CMmDrawerAnimator(aDrawer); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmDrawerAnimator* CMmDrawerAnimator::NewL(CMmListBoxItemDrawer& aDrawer) + { + CMmDrawerAnimator* self = CMmDrawerAnimator::NewLC(aDrawer); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); // Initialize timer + CActiveScheduler::Add( this); // Add to scheduler + iPreparedForGarbage = EFalse; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmDrawerAnimator::~CMmDrawerAnimator() + { + Cancel(); // Cancel any request, if outstanding + iTimer.Close(); // Destroy the RTimer object + // Delete instance variables if any + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::DoCancel() + { + iTimer.Cancel(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMmDrawerAnimator::CancelNextRedrawL() + { + RunL(); + TTime currentTime; + currentTime.HomeTime(); + return (currentTime.MicroSecondsFrom(iLastRedrawTime) + <= MmEffects::KAnimationFrameDelay); + } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::RunL() + { + if ( iPreparedForGarbage ) + { + return; + } + + TTime currentTime; + currentTime.HomeTime(); + + if (currentTime.MicroSecondsFrom(iLastRedrawTime) + >= MmEffects::KAnimationFrameDelay && iDrawer.GetFloatingItemCount() > 0) + { + Cancel(); + + TRect refreshRect; + for(int i=0; i< iDrawer.GetFloatingItemCount(); i++) + { + TMmFloatingItem& current = iDrawer.GetFloatingItemAtIndex(i); + TSize itemSize = iDrawer.GetItemSize(current.GetDrawnItemIndex(), EFalse); + + TRect beforeRect(current.GetItemPosition(), itemSize); + current.MakeStep(); + TRect afterRect(current.GetItemPosition(), itemSize); + + if (current.GetFloatingItemType() == EDrag ) + { + TInt dragTrail = iDrawer.GetFloatingItemIndex( EPostDragRefreshItem ); + if (dragTrail != KErrNotFound) + { + refreshRect = (refreshRect == TRect(0,0,0,0)) ? beforeRect : refreshRect; + refreshRect.BoundingRect( afterRect ); + } + } + else + { + refreshRect = (refreshRect == TRect(0,0,0,0)) ? beforeRect : refreshRect; + refreshRect.BoundingRect( beforeRect ); + refreshRect.BoundingRect( afterRect ); + } + } + const TInt highlightedItemIndex = iDrawer.Widget()->View()->CurrentItemIndex(); + if ( iLastNotedHighlight != highlightedItemIndex ) + { + TRect highlightedItemRect( + iDrawer.Widget()->View()->ItemPos( highlightedItemIndex ), + iDrawer.Widget()->View()->ItemSize( highlightedItemIndex ) ); + refreshRect.BoundingRect( highlightedItemRect ); + iLastNotedHighlight = highlightedItemIndex; + } + + iDrawer.Widget()->View()->SetDisableRedraw(EFalse); + + TInt currentVerticalOffset = static_cast( + iDrawer.Widget()->Parent() )->VerticalItemOffset(); + + if (iLastNotedTopItem != iDrawer.Widget()->TopItemIndex() || + iLastNotedVerticalOffset != currentVerticalOffset ) + { + iDrawer.Widget()->DrawNow(); + iLastNotedTopItem = iDrawer.Widget()->TopItemIndex(); + iLastNotedVerticalOffset = currentVerticalOffset; + } + else + { + if ( refreshRect != TRect(0,0,0,0)) + { + TRect prev(iPreviousRefreshRect); + iPreviousRefreshRect = refreshRect; + refreshRect.BoundingRect(prev); + + // expand rect if non-touch + refreshRect = TRect( AdjustRefreshRectToNonTouch( refreshRect ) ); + + // never draw on the outside of widget's view rectangle + refreshRect.Intersection( iDrawer.Widget()->View()->ViewRect() ); + + iDrawer.Widget()->View()->Draw( &refreshRect ); + } + } + + iDrawer.Widget()->View()->SetDisableRedraw(ETrue); + + iLastRedrawTime.HomeTime(); + + } + + if (iDrawer.GetFloatingItemCount() > 0) + { + Trigger(); + } + else + { + Cancel(); + iDrawer.Widget()->View()->SetDisableRedraw( EFalse ); + +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + if ( iTransTfx && iTransTfxInternal->EffectsDisabled() ) + { + iTransTfx->EnableEffects( ETrue ); + + if ( iTransTfx ) + { + iTransTfxInternal->Remove( MAknListBoxTfxInternal::EListEverything ); + iDrawer.Widget()->DrawNow(); + iTransTfxInternal->Draw( iDrawer.Widget()->Rect() ); + } + } +#endif + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TRect CMmDrawerAnimator::AdjustRefreshRectToNonTouch( const TRect& aRefreshRect ) + { + TRect rect( aRefreshRect ); + if( !AknLayoutUtils::PenEnabled() ) + { + TRect indicatorRect( iDrawer.GetIndicatorRect() ); + TSize itemSize( iDrawer.GetItemSize( + iDrawer.Widget()->CurrentItemIndex(), ETrue ) ); + + TInt horizontalMargin( ( indicatorRect.Width() - itemSize.iWidth ) / 2 ); + TInt verticalMargin( ( indicatorRect.Height() - itemSize.iHeight ) / 2 ); + rect.iBr.iX += horizontalMargin; + rect.iBr.iY += verticalMargin; + rect.iTl.iX -= horizontalMargin; + rect.iTl.iY -= verticalMargin; + } + return rect; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMmDrawerAnimator::Trigger() + { + if ( iPreparedForGarbage ) + { + return KErrCancel; + } + + if (!IsActive() && iDrawer.GetFloatingItemCount() > 0 ) + { +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + iTransTfx = CAknListLoader::TfxApi( iDrawer.Gc() ); + iTransTfxInternal = CAknListLoader::TfxApiInternal( + iDrawer.Gc() ); + + if ( iTransTfx && !iTransTfxInternal->EffectsDisabled() ) + { + iTransTfx->EnableEffects( EFalse ); + + if ( iTransTfxInternal ) + { + iTransTfxInternal->Remove( MAknListBoxTfxInternal::EListEverything ); + iTransTfxInternal->Draw( iDrawer.Widget()->Rect() ); + } + } +#endif + + iDrawer.Widget()->View()->SetDisableRedraw(ETrue); + iTimer.After(iStatus, TTimeIntervalMicroSeconds32( + MmEffects::KAnimationFrameDelay ) ); + SetActive(); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMmDrawerAnimator::RunError(TInt aError) + { + return aError; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::AnimateDragItemTransitionL( ) + { + if (KErrNotFound != iDrawer.GetFloatingItemIndex(EDrag)) + { + TMmFloatingItem floatingItem( + iDrawer.GetFloatingItemL(EDrag).GetDrawnItemIndex(), + iDrawer.GetFloatingItemL(EDrag).GetItemPosition(), + EDragTransition, iUsualAnimationFramesCount, + iDrawer.Widget()->View()); + TPoint pointEnd = iDrawer.Widget()->View()->ItemPos( floatingItem.GetDrawnItemIndex() ); + floatingItem.SetPositionStep( pointEnd - floatingItem.GetItemPosition() ); + iDrawer.AddFloatingItemL( floatingItem, 0 ); + iDrawer.RemoveFloatingItem( iDrawer.GetFloatingItemIndex(EDrag) ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMmDrawerAnimator::IsReadyForNewAnimation() + { + if ( iPreparedForGarbage ) + { + return EFalse; + } + + for(int i=0; i< iDrawer.GetFloatingItemCount(); i++) + { + TMmFloatingItemType type + = iDrawer.GetFloatingItemAtIndex(i).GetFloatingItemType(); + if ( type != EDrag && type != EZoomTransition ) + { + return EFalse; + } + } + return ETrue; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::CancelAnimationsL() + { + for(int i=0; i< iDrawer.GetFloatingItemCount(); i++) + { + TMmFloatingItem& current = iDrawer.GetFloatingItemAtIndex(i); + if (current.GetFloatingItemType() != EDrag) + { + current.InvalidateFloatingItem(); + } + } + } + + // ----------------------------------------------------------------------------- + // + // ----------------------------------------------------------------------------- + // +void CMmDrawerAnimator::AnimateItemSwapL( TInt aItemFrom, TInt aItemTo ) + { + TMmFloatingItem floatingItem( aItemTo, + iDrawer.Widget()->View()->ItemPos( aItemFrom ), + ESwapTransition, iUsualAnimationFramesCount, + iDrawer.Widget()->View() ); + + for(int i=0; i< iDrawer.GetFloatingItemCount(); i++) + { + TMmFloatingItem& current = iDrawer.GetFloatingItemAtIndex(i); + + if (current.GetFloatingItemType() == EZoomTransition + && current.GetDrawnItemIndex() == aItemFrom ) + { + current.InvalidateFloatingItem(); + floatingItem.SetSizeStep( current.GetCurrentZoomRatio(), 1.0f ); + break; + } + } + + floatingItem.SetPositionStep( iDrawer.Widget()->View()->ItemPos(aItemTo)- + iDrawer.Widget()->View()->ItemPos(aItemFrom) ); + iDrawer.AddFloatingItemL(floatingItem); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::AnimateItemZoomL( TInt aItemIndex, TBool aZoomIn ) + { + TMmFloatingItem floatingItem( aItemIndex, + iDrawer.Widget()->View()->ItemPos( aItemIndex ), + EZoomTransition, iUsualAnimationFramesCount, + iDrawer.Widget()->View() ); + floatingItem.SetManualDelete( aZoomIn ); + floatingItem.SetSizeStep( + (aZoomIn) ? KNormalStateZoomRatio : KZoomStateZoomRatio, + (aZoomIn) ? KZoomStateZoomRatio : KNormalStateZoomRatio ); + + TInt animationFound = EFalse; + for(int i=0; i< iDrawer.GetFloatingItemCount(); i++) + { + TMmFloatingItem& current = iDrawer.GetFloatingItemAtIndex(i); + if (current.GetFloatingItemType() == EZoomTransition && + current.GetDrawnItemIndex() == aItemIndex ) + { + current.InvalidateFloatingItem(); + floatingItem.SetSizeStep( current.GetCurrentZoomRatio(), + (aZoomIn) ? KZoomStateZoomRatio : KNormalStateZoomRatio); + animationFound = ETrue; + break; + } + } + + if ( (aZoomIn != EFalse || animationFound != EFalse) ) + { + // This covers the situation, when a zoom out animation is requested + // whilst no zoom in occured earlier. In this case the request is + // neglected. + iDrawer.AddFloatingItemL( floatingItem ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::SetNextRedrawToWholeScreen() + { + iPreviousRefreshRect = iDrawer.Widget()->View()->ViewRect(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmDrawerAnimator::PrepareForGarbage() + { +// Cancel any outstanding requests + Cancel(); + iPreparedForGarbage = ETrue; + } +//End of file