From: Julien Heanley Date: Wed, 11 Jun 2014 12:37:11 +0000 (+0100) Subject: ScrollView - Fix for scroll effect issues found due to ruler disabling not updating... X-Git-Tag: dali_1.0.0~54 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2f4e949a884fbafbcdffd630720ea59513ee1c93 ScrollView - Fix for scroll effect issues found due to ruler disabling not updating min/max scroll positions [problem] Scrolling could result in page disappearing during scrolling due to incorrect scroll domain (change homescreen scroll effect to outer cube/spiral) [solution] Added code to deal with ruler being disabled, now the min/max values for that ruler are reset to 0 Change-Id: I34e95761fb58dfe4d2bc3580671415f1f6f2e707 Signed-off-by: Julien Heanley Signed-off-by: Adeel Kazmi --- 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 8b51d82..38c3555 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 @@ -623,7 +623,9 @@ ScrollView::ScrollView() mWrapMode(false), mAxisAutoLock(false), mAlterChild(false), - mDefaultMaxOvershoot(true) + mDefaultMaxOvershoot(true), + mCanScrollHorizontal(true), + mCanScrollVertical(true) { SetRequiresMouseWheelEvents(true); } @@ -939,8 +941,8 @@ void ScrollView::UpdatePropertyDomain(const Vector3& size) if(mRulerX->IsEnabled()) { const Toolkit::RulerDomain& rulerDomain = mRulerX->GetDomain(); - if( fabsf(min.x - rulerDomain.min) > Math::MACHINE_EPSILON_10000 - || fabsf(max.x - rulerDomain.max) > Math::MACHINE_EPSILON_10000 ) + if( fabsf(min.x - rulerDomain.min) > Math::MACHINE_EPSILON_100 + || fabsf(max.x - rulerDomain.max) > Math::MACHINE_EPSILON_100 ) { domainChanged = true; min.x = rulerDomain.min; @@ -954,17 +956,26 @@ void ScrollView::UpdatePropertyDomain(const Vector3& size) mScrollPrePosition.x = Clamp(mScrollPrePosition.x, -(max.x - size.x), -min.x); } } - if( (fabsf(rulerDomain.max - rulerDomain.min) - size.x) > Math::MACHINE_EPSILON_10000 ) + if( (fabsf(rulerDomain.max - rulerDomain.min) - size.x) > Math::MACHINE_EPSILON_100 ) { canScrollHorizontal = true; } } + else if( fabs(min.x) > Math::MACHINE_EPSILON_100 + || fabs(max.x) > Math::MACHINE_EPSILON_100 ) + { + // need to reset to 0 + domainChanged = true; + min.x = 0.0f; + max.x = 0.0f; + canScrollHorizontal = false; + } if(mRulerY->IsEnabled()) { const Toolkit::RulerDomain& rulerDomain = mRulerY->GetDomain(); - if( fabsf(min.y - rulerDomain.min) > Math::MACHINE_EPSILON_10000 - || fabsf(max.y - rulerDomain.max) > Math::MACHINE_EPSILON_10000 ) + if( fabsf(min.y - rulerDomain.min) > Math::MACHINE_EPSILON_100 + || fabsf(max.y - rulerDomain.max) > Math::MACHINE_EPSILON_100 ) { domainChanged = true; min.y = rulerDomain.min; @@ -978,18 +989,30 @@ void ScrollView::UpdatePropertyDomain(const Vector3& size) mScrollPrePosition.y = Clamp(mScrollPrePosition.y, -(max.y - size.y), -min.y); } } - if( (fabsf(rulerDomain.max - rulerDomain.min) - size.y) > Math::MACHINE_EPSILON_10000 ) + if( (fabsf(rulerDomain.max - rulerDomain.min) - size.y) > Math::MACHINE_EPSILON_100 ) { canScrollVertical = true; } } + else if( fabs(min.y) > Math::MACHINE_EPSILON_100 + || fabs(max.y) > Math::MACHINE_EPSILON_100 ) + { + // need to reset to 0 + domainChanged = true; + min.y = 0.0f; + max.y = 0.0f; + canScrollHorizontal = false; + } + // avoid setting properties if possible, otherwise this will cause an entire update as well as triggering constraints using each property we update - if( self.GetProperty(mPropertyCanScrollVertical) != canScrollVertical ) + if( mCanScrollVertical != canScrollVertical ) { + mCanScrollVertical = canScrollVertical; self.SetProperty(mPropertyCanScrollVertical, canScrollVertical); } - if( self.GetProperty(mPropertyCanScrollHorizontal) != canScrollHorizontal ) + if( mCanScrollHorizontal != canScrollHorizontal ) { + mCanScrollHorizontal = canScrollHorizontal; self.SetProperty(mPropertyCanScrollHorizontal, canScrollHorizontal); } if( scrollPositionChanged ) @@ -1000,8 +1023,8 @@ void ScrollView::UpdatePropertyDomain(const Vector3& size) { mMinScroll = min; mMaxScroll = max; - self.SetProperty(mPropertyPositionMin, min ); - self.SetProperty(mPropertyPositionMax, max ); + self.SetProperty(mPropertyPositionMin, mMinScroll ); + self.SetProperty(mPropertyPositionMax, mMaxScroll ); } } 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 77587b7..3f8562f 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 @@ -991,6 +991,8 @@ private: bool mAlterChild:1; ///< Internal flag to control behavior of OnChildAdd/OnChildRemove when Adding internal Actors. bool mDefaultMaxOvershoot:1; ///< Whether to use default max overshoot or application defined one bool mUserSetPosition:1; ///< SetScrollPosition has been called, return this position until internals get control of scroll position again + bool mCanScrollHorizontal:1; ///< Local value of our property to check against + bool mCanScrollVertical:1; ///< Local value of our property to check against }; } // namespace Internal