From: Paul Wisbey Date: Tue, 10 Jun 2014 04:36:21 +0000 (+0900) Subject: Stop rendering during idle state X-Git-Tag: dali_1.0.0~64 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=73a843c989185d86282edb116aeac40a5f3eb865;ds=sidebyside Stop rendering during idle state [problem] Sometimes rendering continues forever (even in idle state). [cause] ScrollView AnimateInternalXTo is playing Animations with invalid durations. It either uses a large duration which causes the issue, otherwise it plays with duration zero (also incorrect). [solution] Remove the redundant animation logic (since animating mPropertyPrePosition to itself is a NOOP) --- diff --git a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp index 2779369..d0f05ae 100644 --- a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp +++ b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp @@ -2223,7 +2223,9 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) scrollingFinished = true; } mInternalXAnimation.Reset(); - SnapInternalXTo(mScrollPostPosition.x); + + // erase current state flags + mScrollStateFlags &= ~SCROLL_X_STATE_MASK; } if( source == mInternalYAnimation ) @@ -2233,7 +2235,9 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) scrollingFinished = true; } mInternalYAnimation.Reset(); - SnapInternalYTo(mScrollPostPosition.y); + + // erase current state flags + mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; } if(scrollingFinished) @@ -2242,67 +2246,6 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) } } -void ScrollView::OnSnapInternalPositionFinished( Animation& source ) -{ - Actor self = Self(); - UpdateLocalScrollProperties(); - if( source == mInternalXAnimation ) - { - // clear internal x animation flags - mScrollStateFlags &= ~SCROLL_X_STATE_MASK; - mInternalXAnimation.Reset(); - WrapPosition(mScrollPrePosition); - } - if( source == mInternalYAnimation ) - { - mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; - mInternalYAnimation.Reset(); - WrapPosition(mScrollPrePosition); - } -} - -void ScrollView::SnapInternalXTo(float position) -{ - Actor self = Self(); - - StopAnimation(mInternalXAnimation); - - // erase current state flags - mScrollStateFlags &= ~SCROLL_X_STATE_MASK; - - // if internal x not equal to inputed parameter, animate it - float current = self.GetProperty(mPropertyPrePosition).x; - float duration = fabsf(position - current); - mInternalXAnimation = Animation::New(duration); - mInternalXAnimation.FinishedSignal().Connect(this, &ScrollView::OnSnapInternalPositionFinished); - mInternalXAnimation.AnimateTo(Property(self, mPropertyPrePosition, 0), position); - mInternalXAnimation.Play(); - - // add internal animation state flag - mScrollStateFlags |= SnappingInternalX; -} - -void ScrollView::SnapInternalYTo(float position) -{ - Actor self = Self(); - - StopAnimation(mInternalYAnimation); - - // erase current state flags - mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; - - // if internal y not equal to inputed parameter, animate it - float current = self.GetProperty(mPropertyPrePosition).y; - float duration = fabsf(position - current); - mInternalYAnimation = Animation::New(duration); - mInternalYAnimation.FinishedSignal().Connect(this, &ScrollView::OnSnapInternalPositionFinished); - mInternalYAnimation.AnimateTo(Property(self, mPropertyPrePosition, 1), position); - mInternalYAnimation.Play(); - - // add internal animation state flag - mScrollStateFlags |= SnappingInternalY; -} - void ScrollView::GestureStarted() { // we handle the first gesture. @@ -2477,14 +2420,6 @@ void ScrollView::FinishTransform() Self().SetProperty(mPropertyScrolling, false); Vector3 currentScrollPosition = GetCurrentScrollPosition(); mScrollCompletedSignalV2.Emit( currentScrollPosition ); - if( fabs(mScrollPrePosition.x - mScrollTargetPosition.x) > Math::MACHINE_EPSILON_10 ) - { - SnapInternalXTo(mScrollTargetPosition.x); - } - if( fabs(mScrollPrePosition.y - mScrollTargetPosition.y) > Math::MACHINE_EPSILON_10 ) - { - SnapInternalYTo(mScrollTargetPosition.y); - } } } diff --git a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h index 1591fb6..1315a66 100644 --- a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h +++ b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h @@ -649,27 +649,6 @@ private: void OnScrollAnimationFinished( Animation& source ); /** - * Called when either the X or Y internal scroll positions have finished snapping back to mPropertyPrePosition - * - * @param[in] source the Animation instance that has completed. - */ - void OnSnapInternalPositionFinished( Animation& source ); - - /** - * Called whenever a snap animation on the x-axis has completed and we need to snap pre scroll - * position to our clamped position - * @param[in] position The x position to snap pre scroll property to - */ - void SnapInternalXTo( float position ); - - /** - * Called whenever a snap animation on the y-axis has completed and we need to snap pre scroll - * position to our clamped position - * @param[in] position The y position to snap pre scroll property to - */ - void SnapInternalYTo( float position ); - - /** * This is called internally whenever the Scroll Rulers are * modified. This will update the properties: 'scroll-position-min' * and 'scroll-position-max' to reflect the changes.