X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Fscrollable%2Fitem-view%2Fitem-view-impl.cpp;h=6d4d4b8ab9e50dfe0a6c7116b0c7a66f51378537;hb=421b1cb023ab3a51842d1c7dab553e241c2301d0;hp=345a24702787a3420b811f1d74d413681e295612;hpb=68621df06ebaa3ddcfc8d7fe5cfa76f1aae52684;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/base/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp b/base/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp index 345a247..6d4d4b8 100644 --- a/base/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp +++ b/base/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp @@ -59,8 +59,6 @@ const float MILLISECONDS_PER_SECONDS = 1000.0f; const Vector2 OVERSHOOT_BOUNCE_ACTOR_DEFAULT_SIZE( 720.0f, 42.0f ); const float OVERSHOOT_BOUNCE_ACTOR_RESIZE_THRESHOLD = 180.0f; const Vector4 OVERSHOOT_OVERLAY_NINE_PATCH_BORDER(0.0f, 0.0f, 1.0f, 12.0f); -const float MAXIMUM_OVERSHOOT_HEIGHT = 36.0f; // 36 pixels -const float DEFAULT_OVERSHOOT_ANIMATION_DURATION = 0.5f; // 0.5 second const float DEFAULT_KEYBOARD_FOCUS_SCROLL_DURATION = 0.2f; const string LAYOUT_POSITION_PROPERTY_NAME( "item-view-layout-position" ); @@ -724,16 +722,20 @@ void ItemView::InsertItem( Item newItem, float durationSeconds ) displacedActor = temp; iter->second.RemoveConstraints(); - mActiveLayout->ApplyConstraints(iter->second, iter->first, durationSeconds, mScrollPositionObject, Self() ); + mActiveLayout->ApplyConstraints( iter->second, iter->first, durationSeconds, mScrollPositionObject, Self() ); } // Create last item - ItemId lastId = mItemPool.rbegin()->first; - Item lastItem( lastId + 1, displacedActor ); - mItemPool.insert( lastItem ); + ItemPool::reverse_iterator lastIter = mItemPool.rbegin(); + if ( lastIter != mItemPool.rend() ) + { + ItemId lastId = lastIter->first; + Item lastItem( lastId + 1, displacedActor ); + mItemPool.insert( lastItem ); - lastItem.second.RemoveConstraints(); - mActiveLayout->ApplyConstraints(lastItem.second, lastItem.first, durationSeconds, mScrollPositionObject, Self() ); + lastItem.second.RemoveConstraints(); + mActiveLayout->ApplyConstraints( lastItem.second, lastItem.first, durationSeconds, mScrollPositionObject, Self() ); + } } CalculateDomainSize(Self().GetCurrentSize()); @@ -1252,23 +1254,18 @@ void ItemView::OnPan( const PanGesture& gesture ) float firstItemScrollPosition = ClampFirstItemPosition(layoutPositionDelta, layoutSize, *mActiveLayout); + float currentOvershoot = mScrollPositionObject.GetProperty(ScrollConnector::OVERSHOOT); + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); self.SetProperty(mPropertyPosition, GetScrollPosition(firstItemScrollPosition, layoutSize)); - mTotalPanDisplacement += gesture.displacement; - mScrollOvershoot = layoutPositionDelta - firstItemScrollPosition; - if( mScrollOvershoot > Math::MACHINE_EPSILON_1 ) - { - AnimateScrollOvershoot(1.0f); - } - else if( mScrollOvershoot < -Math::MACHINE_EPSILON_1 ) - { - AnimateScrollOvershoot(-1.0f); - } - else + if( (firstItemScrollPosition >= 0.0f && currentOvershoot < 1.0f) || (firstItemScrollPosition <= mActiveLayout->GetMinimumLayoutPosition(mItemFactory.GetNumberOfItems(), layoutSize) && currentOvershoot > -1.0f) ) { - AnimateScrollOvershoot(0.0f); + mTotalPanDisplacement += gesture.displacement; } + + mScrollOvershoot = CalculateScrollOvershoot(); + mScrollPositionObject.SetProperty( ScrollConnector::OVERSHOOT, mScrollOvershoot ); } break; @@ -1596,7 +1593,6 @@ void ItemView::SetOvershootEnabled( bool enable ) OvershootOverlayVisibilityConstraint() ); mOvershootOverlay.ApplyConstraint(constraint); - Actor self = Self(); constraint = Constraint::New( effectOvershootPropertyIndex, Source( mScrollPositionObject, ScrollConnector::OVERSHOOT ), EqualToConstraint() ); @@ -1629,7 +1625,7 @@ float ItemView::CalculateScrollOvershoot() overshoot = positionDelta - clamppedPosition; } - return overshoot; + return overshoot > 0.0f ? std::min(overshoot, 1.0f) : std::max(overshoot, -1.0f); } void ItemView::AnimateScrollOvershoot(float overshootAmount, bool animateBack) @@ -1645,17 +1641,23 @@ void ItemView::AnimateScrollOvershoot(float overshootAmount, bool animateBack) return; } - Actor self = Self(); - float currentOvershoot = mScrollPositionObject.GetProperty(ScrollConnector::OVERSHOOT); - float duration = DEFAULT_OVERSHOOT_ANIMATION_DURATION * (animatingOn ? (1.0f - fabsf(currentOvershoot)) : fabsf(currentOvershoot)); + if(mOvershootAnimationSpeed > Math::MACHINE_EPSILON_0) + { + float currentOvershoot = mScrollPositionObject.GetProperty(ScrollConnector::OVERSHOOT); + float duration = mOvershootOverlay.GetCurrentSize().height * (animatingOn ? (1.0f - fabsf(currentOvershoot)) : fabsf(currentOvershoot)) / mOvershootAnimationSpeed; - RemoveAnimation(mScrollOvershootAnimation); - mScrollOvershootAnimation = Animation::New(duration); - mScrollOvershootAnimation.FinishedSignal().Connect(this, &ItemView::OnOvershootOnFinished); - mScrollOvershootAnimation.AnimateTo( Property(mScrollPositionObject, ScrollConnector::OVERSHOOT), overshootAmount, TimePeriod(0.0f, duration) ); - mScrollOvershootAnimation.Play(); + RemoveAnimation(mScrollOvershootAnimation); + mScrollOvershootAnimation = Animation::New(duration); + mScrollOvershootAnimation.FinishedSignal().Connect(this, &ItemView::OnOvershootOnFinished); + mScrollOvershootAnimation.AnimateTo( Property(mScrollPositionObject, ScrollConnector::OVERSHOOT), overshootAmount, TimePeriod(0.0f, duration) ); + mScrollOvershootAnimation.Play(); - mAnimatingOvershootOn = animatingOn; + mAnimatingOvershootOn = animatingOn; + } + else + { + mScrollPositionObject.SetProperty( ScrollConnector::OVERSHOOT, overshootAmount ); + } } void ItemView::SetItemsParentOrigin( const Vector3& parentOrigin )