X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fscrollable%2Fitem-view%2Fitem-view-impl.cpp;h=acb74dc1f11fb6429c0cd597b1591305bf8a69a2;hp=a0d3be3e0980d13c8a9dce93ef79c14eb17537a6;hb=9e1677a45c8648371f0274d9697748800a656095;hpb=9a450f332b63de22521e3e2a70c3378e574ad77f;ds=sidebyside diff --git a/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp b/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp index a0d3be3..acb74dc 100644 --- a/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp +++ b/dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp @@ -23,6 +23,7 @@ // INTERNAL INCLUDES #include #include +#include using namespace std; using namespace Dali; @@ -516,7 +517,9 @@ void ItemView::OnInitialize() mOvershootOverlay.SetPixelArea(OVERSHOOT_BOUNCE_IMAGE_1_PIXEL_AREA); self.Add(mOvershootOverlay); - mPropertyLayoutPosition = self.RegisterProperty(LAYOUT_POSITION_PROPERTY_NAME, 0.0f); + mScrollConnector = Dali::Toolkit::ScrollConnector::New(); + mScrollPositionObject = mScrollConnector.GetScrollPositionObject(); + mPropertyMinimumLayoutPosition = self.RegisterProperty(MINIMUM_LAYOUT_POSITION_PROPERTY_NAME, 0.0f); mPropertyPosition = self.RegisterProperty(POSITION_PROPERTY_NAME, 0.0f); mPropertyScrollSpeed = self.RegisterProperty(SCROLL_SPEED_PROPERTY_NAME, 0.0f); @@ -545,6 +548,11 @@ ItemView::~ItemView() { } +Dali::Toolkit::ScrollConnector ItemView::GetScrollConnector() const +{ + return mScrollConnector; +} + unsigned int ItemView::GetLayoutCount() const { return mLayouts.size(); @@ -579,7 +587,7 @@ ItemLayoutPtr ItemView::GetActiveLayout() const float ItemView::GetCurrentLayoutPosition(unsigned int itemId) const { - return Self().GetProperty(mPropertyLayoutPosition) + static_cast(itemId); + return mScrollPositionObject.GetProperty( ScrollConnector::SCROLL_POSITION ) + static_cast( itemId ); } void ItemView::ActivateLayout(unsigned int layoutIndex, const Vector3& targetSize, float durationSeconds) @@ -657,7 +665,7 @@ void ItemView::ActivateLayout(unsigned int layoutIndex, const Vector3& targetSiz bool scrollAnimationNeeded(false); float firstItemScrollPosition(0.0f); - float current = self.GetProperty(mPropertyLayoutPosition); + float current = GetCurrentLayoutPosition(0); float minimum = ClampFirstItemPosition(current, targetSize, *mActiveLayout); self.SetProperty(mPropertyPosition, GetScrollPosition(current, targetSize)); @@ -676,7 +684,7 @@ void ItemView::ActivateLayout(unsigned int layoutIndex, const Vector3& targetSiz { RemoveAnimation(mScrollAnimation); mScrollAnimation = Animation::New(mAnchoringDuration); - mScrollAnimation.AnimateTo( Property(self, mPropertyLayoutPosition), firstItemScrollPosition, AlphaFunctions::EaseOut ); + mScrollAnimation.AnimateTo( Property( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), firstItemScrollPosition, AlphaFunctions::EaseOut ); mScrollAnimation.AnimateTo( Property(self, mPropertyPosition), GetScrollPosition(firstItemScrollPosition, targetSize), AlphaFunctions::EaseOut ); mScrollAnimation.Play(); } @@ -884,7 +892,7 @@ ItemRange ItemView::GetItemRange(ItemLayout& layout, const Vector3& layoutSize, ItemRange available(0u, itemCount); - ItemRange range = layout.GetItemsWithinArea(Self().GetProperty(mPropertyLayoutPosition), layoutSize); + ItemRange range = layout.GetItemsWithinArea( GetCurrentLayoutPosition(0), layoutSize ); if (reserveExtra) { @@ -932,9 +940,10 @@ bool ItemView::OnMouseWheelEvent(const MouseWheelEvent& event) { Actor self = Self(); const Vector3 layoutSize = Self().GetCurrentSize(); - float layoutPositionDelta = self.GetProperty(mPropertyLayoutPosition) + (event.z * mMouseWheelScrollDistanceStep * mActiveLayout->GetScrollSpeedFactor()); + float layoutPositionDelta = GetCurrentLayoutPosition(0) + (event.z * mMouseWheelScrollDistanceStep * mActiveLayout->GetScrollSpeedFactor()); float firstItemScrollPosition = ClampFirstItemPosition(layoutPositionDelta, layoutSize, *mActiveLayout); - self.SetProperty(mPropertyLayoutPosition, firstItemScrollPosition); + + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); self.SetProperty(mPropertyPosition, GetScrollPosition(firstItemScrollPosition, layoutSize)); mScrollStartedSignalV2.Emit(GetCurrentScrollPosition()); StartRefreshTimer(); @@ -985,7 +994,7 @@ void ItemView::ApplyConstraints(Actor& actor, ItemLayout& layout, unsigned int i WrappedVector3Constraint wrapped(positionConstraint, itemId); Constraint constraint = Constraint::New( Actor::POSITION, - ParentSource( mPropertyLayoutPosition ), + Source( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), ParentSource( mPropertyScrollSpeed ), ParentSource( Actor::SIZE ), wrapped ); @@ -1000,7 +1009,7 @@ void ItemView::ApplyConstraints(Actor& actor, ItemLayout& layout, unsigned int i WrappedQuaternionConstraint wrapped(rotationConstraint, itemId); Constraint constraint = Constraint::New( Actor::ROTATION, - ParentSource( mPropertyLayoutPosition ), + Source( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), ParentSource( mPropertyScrollSpeed ), ParentSource( Actor::SIZE ), wrapped ); @@ -1015,7 +1024,7 @@ void ItemView::ApplyConstraints(Actor& actor, ItemLayout& layout, unsigned int i WrappedVector3Constraint wrapped(scaleConstraint, itemId); Constraint constraint = Constraint::New( Actor::SCALE, - ParentSource( mPropertyLayoutPosition ), + Source( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), ParentSource( mPropertyScrollSpeed ), ParentSource( Actor::SIZE ), wrapped ); @@ -1030,7 +1039,7 @@ void ItemView::ApplyConstraints(Actor& actor, ItemLayout& layout, unsigned int i WrappedVector4Constraint wrapped(colorConstraint, itemId); Constraint constraint = Constraint::New( Actor::COLOR, - ParentSource( mPropertyLayoutPosition ), + Source( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), ParentSource( mPropertyScrollSpeed ), ParentSource( Actor::SIZE ), wrapped ); @@ -1049,7 +1058,7 @@ void ItemView::ApplyConstraints(Actor& actor, ItemLayout& layout, unsigned int i WrappedBoolConstraint wrapped(visibilityConstraint, itemId); Constraint constraint = Constraint::New( Actor::VISIBLE, - ParentSource( mPropertyLayoutPosition ), + Source( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), ParentSource( mPropertyScrollSpeed ), ParentSource( Actor::SIZE ), wrapped ); @@ -1102,7 +1111,7 @@ void ItemView::OnPan(PanGesture gesture) mRefreshOrderHint = true; - float currentLayoutPosition = self.GetProperty(mPropertyLayoutPosition); + float currentLayoutPosition = GetCurrentLayoutPosition(0); float firstItemScrollPosition = ClampFirstItemPosition(currentLayoutPosition + mScrollSpeed * direction, layoutSize, *mActiveLayout); @@ -1116,7 +1125,7 @@ void ItemView::OnPan(PanGesture gesture) float flickAnimationDuration = mActiveLayout->GetItemFlickAnimationDuration() * max(1.0f, fabsf(firstItemScrollPosition - GetCurrentLayoutPosition(0))); mScrollAnimation = Animation::New(flickAnimationDuration); - mScrollAnimation.AnimateTo( Property(self, mPropertyLayoutPosition), firstItemScrollPosition, AlphaFunctions::EaseOut ); + mScrollAnimation.AnimateTo( Property( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), firstItemScrollPosition, AlphaFunctions::EaseOut ); mScrollAnimation.AnimateTo( Property(self, mPropertyPosition), GetScrollPosition(firstItemScrollPosition, layoutSize), AlphaFunctions::EaseOut ); mScrollAnimation.AnimateTo( Property(self, mPropertyScrollSpeed), 0.0f, AlphaFunctions::EaseOut ); @@ -1162,11 +1171,11 @@ void ItemView::OnPan(PanGesture gesture) mScrollSpeedAnimation.AnimateTo( Property(self, mPropertyScrollSpeed), mScrollSpeed, AlphaFunctions::Linear ); mScrollSpeedAnimation.Play(); - float layoutPositionDelta = self.GetProperty(mPropertyLayoutPosition) + (mScrollDistance * mActiveLayout->GetScrollSpeedFactor()); + float layoutPositionDelta = GetCurrentLayoutPosition(0) + (mScrollDistance * mActiveLayout->GetScrollSpeedFactor()); float firstItemScrollPosition = ClampFirstItemPosition(layoutPositionDelta, layoutSize, *mActiveLayout); - self.SetProperty(mPropertyLayoutPosition, firstItemScrollPosition); + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); self.SetProperty(mPropertyPosition, GetScrollPosition(firstItemScrollPosition, layoutSize)); mScrollStartedSignalV2.Emit(GetCurrentScrollPosition()); @@ -1236,7 +1245,7 @@ Actor ItemView::GetNextKeyboardFocusableActor(Actor actor, Control::KeyboardFocu return nextFocusActor; } } - float layoutPosition = mActiveLayout->GetClosestAnchorPosition(Self().GetProperty(mPropertyLayoutPosition)); + float layoutPosition = mActiveLayout->GetClosestAnchorPosition( GetCurrentLayoutPosition(0) ); Vector3 layoutSize = Self().GetCurrentSize(); if(!nextFocusActor) { @@ -1255,7 +1264,7 @@ void ItemView::OnKeyboardFocusChangeCommitted(Actor commitedFocusableActor) if(commitedFocusableActor) { int nextItemID = GetItemId(commitedFocusableActor); - float layoutPosition = Self().GetProperty(mPropertyLayoutPosition); + float layoutPosition = GetCurrentLayoutPosition(0); Vector3 layoutSize = Self().GetCurrentSize(); Vector3 focusItemPosition = Vector3::ZERO; ItemLayout::Vector3Function itemPositionConstraint; @@ -1276,10 +1285,10 @@ Animation ItemView::DoAnchoring() if (mActiveLayout && mAnchoringEnabled) { - float anchorPosition = mActiveLayout->GetClosestAnchorPosition(Self().GetProperty(mPropertyLayoutPosition)); + float anchorPosition = mActiveLayout->GetClosestAnchorPosition( GetCurrentLayoutPosition(0) ); anchoringAnimation = Animation::New(mAnchoringDuration); - anchoringAnimation.AnimateTo( Property(self, mPropertyLayoutPosition), anchorPosition, AlphaFunctions::EaseOut ); + anchoringAnimation.AnimateTo( Property( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), anchorPosition, AlphaFunctions::EaseOut ); anchoringAnimation.AnimateTo( Property(self, mPropertyPosition), GetScrollPosition(anchorPosition, self.GetCurrentSize()), AlphaFunctions::EaseOut ); anchoringAnimation.AnimateTo( Property(self, mPropertyScrollSpeed), 0.0f, AlphaFunctions::EaseOut ); if(!mIsFlicking) @@ -1358,14 +1367,14 @@ void ItemView::ScrollToItem(unsigned int itemId, float durationSeconds) { RemoveAnimation(mScrollAnimation); mScrollAnimation = Animation::New(durationSeconds); - mScrollAnimation.AnimateTo( Property(self, mPropertyLayoutPosition), firstItemScrollPosition, AlphaFunctions::EaseOut ); + mScrollAnimation.AnimateTo( Property( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), firstItemScrollPosition, AlphaFunctions::EaseOut ); mScrollAnimation.AnimateTo( Property(self, mPropertyPosition), GetScrollPosition(firstItemScrollPosition, layoutSize), AlphaFunctions::EaseOut ); mScrollAnimation.FinishedSignal().Connect(this, &ItemView::OnScrollFinished); mScrollAnimation.Play(); } else { - self.SetProperty(mPropertyLayoutPosition, firstItemScrollPosition); + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); AnimateScrollOvershoot(0.0f); } @@ -1435,7 +1444,7 @@ bool ItemView::IsLayoutScrollable(const Vector3& layoutSize) { Actor self = Self(); - float currentLayoutPosition = ClampFirstItemPosition(self.GetProperty(mPropertyLayoutPosition), layoutSize, *mActiveLayout); + float currentLayoutPosition = ClampFirstItemPosition( GetCurrentLayoutPosition(0), layoutSize, *mActiveLayout ); float forwardClampedPosition = ClampFirstItemPosition(currentLayoutPosition + 1.0, layoutSize, *mActiveLayout); float backwardClampedPosition = ClampFirstItemPosition(currentLayoutPosition - 1.0, layoutSize, *mActiveLayout); @@ -1456,7 +1465,7 @@ float ItemView::GetScrollPosition(float layoutPosition, const Vector3& layoutSiz Vector3 ItemView::GetCurrentScrollPosition() const { - float currentLayoutPosition = Self().GetProperty(mPropertyLayoutPosition); + float currentLayoutPosition = GetCurrentLayoutPosition(0); return Vector3(0.0f, GetScrollPosition(currentLayoutPosition, Self().GetCurrentSize()), 0.0f); } @@ -1483,14 +1492,14 @@ void ItemView::ScrollTo(const Vector3& position, float duration) { RemoveAnimation(mScrollAnimation); mScrollAnimation = Animation::New(duration); - mScrollAnimation.AnimateTo( Property(self, mPropertyLayoutPosition), firstItemScrollPosition, AlphaFunctions::EaseOut ); + mScrollAnimation.AnimateTo( Property( mScrollPositionObject, ScrollConnector::SCROLL_POSITION ), firstItemScrollPosition, AlphaFunctions::EaseOut ); mScrollAnimation.AnimateTo( Property(self, mPropertyPosition), GetScrollPosition(firstItemScrollPosition, layoutSize), AlphaFunctions::EaseOut ); mScrollAnimation.FinishedSignal().Connect(this, &ItemView::OnScrollFinished); mScrollAnimation.Play(); } else { - self.SetProperty(mPropertyLayoutPosition, firstItemScrollPosition); + mScrollPositionObject.SetProperty( ScrollConnector::SCROLL_POSITION, firstItemScrollPosition ); AnimateScrollOvershoot(0.0f); } @@ -1543,7 +1552,7 @@ float ItemView::CalculateScrollOvershoot() // since the pan gesture starts. Actor self = Self(); float scrollDistance = CalculateScrollDistance(mTotalPanDisplacement, *mActiveLayout) * mActiveLayout->GetScrollSpeedFactor(); - float positionDelta = self.GetProperty(mPropertyLayoutPosition) + scrollDistance; + 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));