X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Fscrollable%2Fitem-view%2Fitem-view-impl.cpp;h=708d98f1d0b8cfb4397022fa42680c0ceb2ed5ce;hp=7aca7ff433f3ce1ccc21eaa493b5f09fef7ba48c;hb=24b3e26d147f772b0396937442484ff75b327aa7;hpb=865bc7d9efba2ba1ddc5e365ce99fa94ae3e9187 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 7aca7ff..708d98f 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 @@ -20,14 +20,20 @@ // EXTERNAL INCLUDES #include +#include +#include +#include +#include +#include +#include // INTERNAL INCLUDES -#include #include #include #include -using namespace std; +using std::string; +using std::set; using namespace Dali; namespace // unnamed namespace @@ -331,6 +337,7 @@ ItemView::ItemView(ItemFactory& factory) mRefreshOrderHint(true/*Refresh item 0 first*/), mMinimumSwipeSpeed(DEFAULT_MINIMUM_SWIPE_SPEED), mMinimumSwipeDistance(DEFAULT_MINIMUM_SWIPE_DISTANCE), + mMouseWheelScrollDistanceStep(0.0f), mScrollDistance(0.0f), mScrollSpeed(0.0f), mTotalPanDisplacement(Vector2::ZERO), @@ -338,6 +345,9 @@ ItemView::ItemView(ItemFactory& factory) mIsFlicking(false), mGestureState(Gesture::Clear), mAddingItems(false), + mPropertyPosition(Property::INVALID_INDEX), + mPropertyMinimumLayoutPosition(Property::INVALID_INDEX), + mPropertyScrollSpeed(Property::INVALID_INDEX), mRefreshEnabled(true), mItemsParentOrigin( ParentOrigin::CENTER), mItemsAnchorPoint( AnchorPoint::CENTER) @@ -620,7 +630,7 @@ float ItemView::GetAnchoringDuration() const void ItemView::SetRefreshInterval(float intervalLayoutPositions) { - if(mRefreshIntervalLayoutPositions != intervalLayoutPositions) + if( !Equals(mRefreshIntervalLayoutPositions, intervalLayoutPositions) ) { mRefreshIntervalLayoutPositions = intervalLayoutPositions; @@ -676,37 +686,58 @@ void ItemView::InsertItem( Item newItem, float durationSeconds ) { mAddingItems = true; - SetupActor( newItem, durationSeconds ); - Self().Add( newItem.second ); + Actor displacedActor; + ItemPoolIter afterDisplacedIter = mItemPool.end(); ItemPoolIter foundIter = mItemPool.find( newItem.first ); if( mItemPool.end() != foundIter ) { - Actor moveMe = foundIter->second; + SetupActor( newItem, durationSeconds ); + Self().Add( newItem.second ); + + displacedActor = foundIter->second; foundIter->second = newItem.second; + afterDisplacedIter = ++foundIter; + } + else + { + // Inserting before the existing item range? + ItemPoolIter iter = mItemPool.begin(); + if( iter != mItemPool.end() && + iter->first > newItem.first ) + { + displacedActor = iter->second; + mItemPool.erase( iter++ ); // iter is still valid after the erase + + afterDisplacedIter = iter; + } + } + + if( displacedActor ) + { // Move the existing actors to make room - for( ItemPoolIter iter = ++foundIter; mItemPool.end() != iter; ++iter ) + for( ItemPoolIter iter = afterDisplacedIter; mItemPool.end() != iter; ++iter ) { Actor temp = iter->second; - iter->second = moveMe; - moveMe = temp; + iter->second = displacedActor; + 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, moveMe ); - 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() ); - } - else - { - mItemPool.insert( newItem ); + lastItem.second.RemoveConstraints(); + mActiveLayout->ApplyConstraints( lastItem.second, lastItem.first, durationSeconds, mScrollPositionObject, Self() ); + } } CalculateDomainSize(Self().GetCurrentSize()); @@ -719,18 +750,16 @@ void ItemView::InsertItems( const ItemContainer& newItems, float durationSeconds mAddingItems = true; // Insert from lowest id to highest - set sortedItems; + std::set sortedItems; for( ConstItemIter iter = newItems.begin(); newItems.end() != iter; ++iter ) { sortedItems.insert( *iter ); } - for( set::iterator iter = sortedItems.begin(); sortedItems.end() != iter; ++iter ) + for( std::set::iterator iter = sortedItems.begin(); sortedItems.end() != iter; ++iter ) { Self().Add( iter->second ); - cout << "inserting item: " << iter->first << endl; - ItemPoolIter foundIter = mItemPool.find( iter->first ); if( mItemPool.end() != foundIter ) { @@ -778,16 +807,18 @@ void ItemView::InsertItems( const ItemContainer& newItems, float durationSeconds void ItemView::RemoveItem( unsigned int itemId, float durationSeconds ) { - bool actorRemoved = RemoveActor( itemId ); - if( actorRemoved ) + bool actorsReordered = RemoveActor( itemId ); + if( actorsReordered ) { ReapplyAllConstraints( durationSeconds ); + + OnItemsRemoved(); } } void ItemView::RemoveItems( const ItemIdContainer& itemIds, float durationSeconds ) { - bool actorRemoved( false ); + bool actorsReordered( false ); // Remove from highest id to lowest set sortedItems; @@ -800,27 +831,44 @@ void ItemView::RemoveItems( const ItemIdContainer& itemIds, float durationSecond { if( RemoveActor( *iter ) ) { - actorRemoved = true; + actorsReordered = true; } } - if( actorRemoved ) + if( actorsReordered ) { ReapplyAllConstraints( durationSeconds ); + + OnItemsRemoved(); } } bool ItemView::RemoveActor(unsigned int itemId) { - bool removed( false ); - - const ItemPoolIter removeIter = mItemPool.find( itemId ); + bool reordered( false ); + ItemPoolIter removeIter = mItemPool.find( itemId ); if( removeIter != mItemPool.end() ) { ReleaseActor(itemId, removeIter->second); + } + else + { + // Removing before the existing item range? + ItemPoolIter iter = mItemPool.begin(); + if( iter != mItemPool.end() && + iter->first > itemId ) + { + // In order to decrement the first visible item ID + mItemPool.insert( Item(iter->first - 1, Actor()) ); - removed = true; + removeIter = mItemPool.begin(); + } + } + + if( removeIter != mItemPool.end() ) + { + reordered = true; // Adjust the remaining item IDs, for example if item 2 is removed: // Initial actors: After insert: @@ -842,7 +890,7 @@ bool ItemView::RemoveActor(unsigned int itemId) } } - return removed; + return reordered; } void ItemView::ReplaceItem( Item replacementItem, float durationSeconds ) @@ -898,7 +946,7 @@ void ItemView::RemoveActorsOutsideRange( ItemRange range ) void ItemView::AddActorsWithinRange( ItemRange range, float durationSeconds ) { - range.end = min(mItemFactory.GetNumberOfItems(), range.end); + range.end = std::min(mItemFactory.GetNumberOfItems(), range.end); // The order of addition depends on the scroll direction. if (mRefreshOrderHint) @@ -1091,22 +1139,33 @@ void ItemView::ReapplyAllConstraints( float durationSeconds ) actor.RemoveConstraints(); mActiveLayout->ApplyConstraints(actor, id, durationSeconds, mScrollPositionObject, Self()); } +} +void ItemView::OnItemsRemoved() +{ CalculateDomainSize(Self().GetCurrentSize()); + + // Adjust scroll-position after an item is removed + if( mActiveLayout ) + { + float firstItemScrollPosition = ClampFirstItemPosition(GetCurrentLayoutPosition(0), Self().GetCurrentSize(), *mActiveLayout); + + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); + } } float ItemView::ClampFirstItemPosition(float targetPosition, const Vector3& targetSize, ItemLayout& layout) { Actor self = Self(); float minLayoutPosition = layout.GetMinimumLayoutPosition(mItemFactory.GetNumberOfItems(), targetSize); - float clamppedPosition = min(0.0f, max(minLayoutPosition, targetPosition)); + float clamppedPosition = std::min(0.0f, std::max(minLayoutPosition, targetPosition)); mScrollOvershoot = targetPosition - clamppedPosition; self.SetProperty(mPropertyMinimumLayoutPosition, minLayoutPosition); return clamppedPosition; } -void ItemView::OnPan(PanGesture gesture) +void ItemView::OnPan( const PanGesture& gesture ) { Actor self = Self(); const Vector3 layoutSize = Self().GetCurrentSize(); @@ -1146,7 +1205,7 @@ void ItemView::OnPan(PanGesture gesture) RemoveAnimation(mScrollAnimation); - float flickAnimationDuration = Clamp( mActiveLayout->GetItemFlickAnimationDuration() * max(1.0f, fabsf(firstItemScrollPosition - GetCurrentLayoutPosition(0))) + float flickAnimationDuration = Clamp( mActiveLayout->GetItemFlickAnimationDuration() * std::max(1.0f, fabsf(firstItemScrollPosition - GetCurrentLayoutPosition(0))) , DEFAULT_MINIMUM_SWIPE_DURATION, DEFAULT_MAXIMUM_SWIPE_DURATION); mScrollAnimation = Animation::New(flickAnimationDuration); @@ -1570,7 +1629,7 @@ float ItemView::CalculateScrollOvershoot() float positionDelta = GetCurrentLayoutPosition(0) + scrollDistance; float minLayoutPosition = mActiveLayout->GetMinimumLayoutPosition(mItemFactory.GetNumberOfItems(), Self().GetCurrentSize()); self.SetProperty(mPropertyMinimumLayoutPosition, minLayoutPosition); - float clamppedPosition = min(0.0f, max(minLayoutPosition, positionDelta)); + float clamppedPosition = std::min(0.0f, std::max(minLayoutPosition, positionDelta)); overshoot = positionDelta - clamppedPosition; } @@ -1639,8 +1698,16 @@ Vector3 ItemView::GetItemsAnchorPoint() const void ItemView::GetItemsRange(ItemRange& range) { - range.begin = mItemPool.begin()->first; - range.end = mItemPool.rbegin()->first + 1; + if( !mItemPool.empty() ) + { + range.begin = mItemPool.begin()->first; + range.end = mItemPool.rbegin()->first + 1; + } + else + { + range.begin = 0; + range.end = 0; + } } void ItemView::OnScrollPositionChanged( float position )