2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.h>
22 #include <cstring> // for strcmp
23 #include <dali/public-api/animation/constraint.h>
24 #include <dali/public-api/animation/constraints.h>
25 #include <dali/public-api/images/resource-image.h>
26 #include <dali/public-api/object/type-registry.h>
27 #include <dali/public-api/object/property-array.h>
28 #include <dali/public-api/object/type-registry-helper.h>
29 #include <dali/integration-api/debug.h>
32 #include <dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.h>
33 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
40 const float DEFAULT_SLIDER_DEPTH(1.0f);
41 const float DEFAULT_INDICATOR_SHOW_DURATION(0.5f);
42 const float DEFAULT_INDICATOR_HIDE_DURATION(0.5f);
43 const float DEFAULT_PAN_GESTURE_PROCESS_TIME(16.7f); // 16.7 milliseconds, i.e. one frame
44 const float DEFAULT_INDICATOR_FIXED_HEIGHT(80.0f);
45 const float DEFAULT_INDICATOR_MINIMUM_HEIGHT(0.0f);
46 const float DEFAULT_INDICATOR_START_PADDING(0.0f);
47 const float DEFAULT_INDICATOR_END_PADDING(0.0f);
50 * Indicator size constraint
51 * Indicator size depends on both indicator's parent size and the scroll content size
53 struct IndicatorSizeConstraint
56 * @param[in] minimumHeight The minimum height for the indicator
57 * @param[in] padding The sum of the padding at the start & end of the indicator
59 IndicatorSizeConstraint( float minimumHeight, float padding )
60 : mMinimumHeight( minimumHeight ),
67 * @param[in] current The current indicator size
68 * @param[in] parentSizeProperty The parent size of scroll indicator.
69 * @return The new scroll indicator size.
71 void operator()( Vector3& current, const PropertyInputContainer& inputs )
73 const Vector3& parentSize = inputs[0]->GetVector3();
74 const float contentSize = inputs[1]->GetFloat();
76 // Take into account padding that may exist at the beginning and end of the indicator.
77 const float parentHeightMinusPadding = parentSize.height - mPadding;
79 float height = contentSize > parentHeightMinusPadding ?
80 parentHeightMinusPadding * ( parentHeightMinusPadding / contentSize ) :
81 parentHeightMinusPadding * ( ( parentHeightMinusPadding - contentSize * 0.5f ) / parentHeightMinusPadding );
83 current.y = std::max( mMinimumHeight, height );
91 * Indicator position constraint
92 * Positions the indicator to reflect the current scroll position within the scroll domain.
94 struct IndicatorPositionConstraint
97 * @param[in] startPadding The padding at the start of the indicator
98 * @param[in] endPadding The padding at the end of the indicator
100 IndicatorPositionConstraint( float startPadding, float endPadding )
101 : mStartPadding( startPadding ),
102 mEndPadding( endPadding )
107 * Constraint operator
108 * @param[in,out] current The current indicator position
109 * @param[in] inputs Contains the size of indicator, the size of indicator's parent, and the scroll position of the scrollable container (from 0.0 -> 1.0 in each axis)
110 * @return The new indicator position is returned.
112 void operator()( Vector3& current, const PropertyInputContainer& inputs )
114 const Vector3& indicatorSize = inputs[0]->GetVector3();
115 const Vector3& parentSize = inputs[1]->GetVector3();
116 const float scrollPosition = -inputs[2]->GetFloat();
117 const float minimumScrollPosition = inputs[3]->GetFloat();
118 const float maximumScrollPosition = inputs[4]->GetFloat();
120 // Take into account padding that may exist at the beginning and end of the indicator.
121 const float parentHeightMinusPadding = parentSize.height - ( mStartPadding + mEndPadding );
123 float relativePosition = std::max( 0.0f, std::min( 1.0f, ( scrollPosition - minimumScrollPosition ) / ( maximumScrollPosition - minimumScrollPosition ) ) );
124 current.y = mStartPadding + ( parentHeightMinusPadding - indicatorSize.height ) * relativePosition;
125 current.z = DEFAULT_SLIDER_DEPTH;
132 } // unnamed namespace
146 using namespace Dali;
150 return Toolkit::ScrollBar::New();
153 // Setup properties, signals and actions using the type-registry.
154 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ScrollBar, Toolkit::Control, Create );
156 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollDirection", STRING, SCROLL_DIRECTION )
157 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHeightPolicy", STRING, INDICATOR_HEIGHT_POLICY )
158 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorFixedHeight", FLOAT, INDICATOR_FIXED_HEIGHT )
159 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorShowDuration", FLOAT, INDICATOR_SHOW_DURATION )
160 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHideDuration", FLOAT, INDICATOR_HIDE_DURATION )
161 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervals", ARRAY, SCROLL_POSITION_INTERVALS )
162 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorMinimumHeight", FLOAT, INDICATOR_MINIMUM_HEIGHT )
163 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorStartPadding", FLOAT, INDICATOR_START_PADDING )
164 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorEndPadding", FLOAT, INDICATOR_END_PADDING )
166 DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "panFinished", PAN_FINISHED_SIGNAL )
167 DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervalReached", SCROLL_POSITION_INTERVAL_REACHED_SIGNAL )
169 DALI_TYPE_REGISTRATION_END()
171 const char* SCROLL_DIRECTION_NAME[] = {"Vertical", "Horizontal"};
172 const char* INDICATOR_HEIGHT_POLICY_NAME[] = {"Variable", "Fixed"};
176 ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction)
177 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
178 mIndicatorShowAlpha(1.0f),
179 mDirection(direction),
180 mScrollableObject(WeakHandleBase()),
181 mPropertyScrollPosition(Property::INVALID_INDEX),
182 mPropertyMinScrollPosition(Property::INVALID_INDEX),
183 mPropertyMaxScrollPosition(Property::INVALID_INDEX),
184 mPropertyScrollContentSize(Property::INVALID_INDEX),
185 mIndicatorShowDuration(DEFAULT_INDICATOR_SHOW_DURATION),
186 mIndicatorHideDuration(DEFAULT_INDICATOR_HIDE_DURATION),
188 mCurrentScrollPosition(0.0f),
189 mIndicatorHeightPolicy(Toolkit::ScrollBar::Variable),
190 mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT),
191 mIndicatorMinimumHeight(DEFAULT_INDICATOR_MINIMUM_HEIGHT),
192 mIndicatorStartPadding(DEFAULT_INDICATOR_START_PADDING),
193 mIndicatorEndPadding(DEFAULT_INDICATOR_END_PADDING),
195 mIndicatorFirstShow(true)
199 ScrollBar::~ScrollBar()
203 void ScrollBar::OnInitialize()
205 CreateDefaultIndicatorActor();
206 Self().SetDrawMode(DrawMode::OVERLAY_2D);
209 void ScrollBar::SetScrollPropertySource( Handle handle, Property::Index propertyScrollPosition, Property::Index propertyMinScrollPosition, Property::Index propertyMaxScrollPosition, Property::Index propertyScrollContentSize )
212 && propertyScrollPosition != Property::INVALID_INDEX
213 && propertyMinScrollPosition != Property::INVALID_INDEX
214 && propertyMaxScrollPosition != Property::INVALID_INDEX
215 && propertyScrollContentSize != Property::INVALID_INDEX )
217 mScrollableObject = WeakHandleBase(handle);
218 mPropertyScrollPosition = propertyScrollPosition;
219 mPropertyMinScrollPosition = propertyMinScrollPosition;
220 mPropertyMaxScrollPosition = propertyMaxScrollPosition;
221 mPropertyScrollContentSize = propertyScrollContentSize;
227 DALI_LOG_ERROR("Can not set empty handle of source object or invalid source property index\n");
231 void ScrollBar::CreateDefaultIndicatorActor()
233 Toolkit::ImageView indicator = Toolkit::ImageView::New();
234 indicator.SetParentOrigin( ParentOrigin::TOP_LEFT );
235 indicator.SetAnchorPoint( AnchorPoint::TOP_LEFT );
236 indicator.SetStyleName( "ScrollBarIndicator" );
237 mIndicator = indicator;
238 Self().Add( mIndicator );
240 EnableGestureDetection( Gesture::Type( Gesture::Pan ) );
241 PanGestureDetector detector( GetPanGestureDetector() );
242 detector.Attach( mIndicator );
245 void ScrollBar::SetScrollIndicator( Actor indicator )
247 // Don't allow empty handle
250 // Remove current Indicator
253 Self().Remove( mIndicator );
255 mIndicator = indicator;
256 mIndicatorFirstShow = true;
257 Self().Add(mIndicator);
259 EnableGestureDetection(Gesture::Type(Gesture::Pan));
261 PanGestureDetector detector( GetPanGestureDetector() );
262 detector.DetachAll();
263 detector.Attach( mIndicator );
265 unsigned int childCount = mIndicator.GetChildCount();
266 for ( unsigned int index = 0; index < childCount; index++ )
268 Actor child = mIndicator.GetChildAt( index );
271 detector.Attach( child );
277 DALI_LOG_ERROR("Empty handle of scroll indicator\n");
281 Actor ScrollBar::GetScrollIndicator()
286 void ScrollBar::ApplyConstraints()
288 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
290 if( scrollableHandle )
292 if(mIndicatorSizeConstraint)
294 mIndicatorSizeConstraint.Remove();
297 // Set indicator height according to the indicator's height policy
298 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
300 mIndicator.SetSize(Self().GetCurrentSize().width, mIndicatorFixedHeight);
304 mIndicatorSizeConstraint = Constraint::New<Vector3>( mIndicator, Actor::Property::SIZE,
305 IndicatorSizeConstraint( mIndicatorMinimumHeight, mIndicatorStartPadding + mIndicatorEndPadding ) );
306 mIndicatorSizeConstraint.AddSource( ParentSource( Actor::Property::SIZE ) );
307 mIndicatorSizeConstraint.AddSource( Source( scrollableHandle, mPropertyScrollContentSize ) );
308 mIndicatorSizeConstraint.Apply();
311 if(mIndicatorPositionConstraint)
313 mIndicatorPositionConstraint.Remove();
316 mIndicatorPositionConstraint = Constraint::New<Vector3>( mIndicator, Actor::Property::POSITION,
317 IndicatorPositionConstraint( mIndicatorStartPadding, mIndicatorEndPadding ) );
318 mIndicatorPositionConstraint.AddSource( LocalSource( Actor::Property::SIZE ) );
319 mIndicatorPositionConstraint.AddSource( ParentSource( Actor::Property::SIZE ) );
320 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyScrollPosition ) );
321 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMinScrollPosition ) );
322 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMaxScrollPosition ) );
323 mIndicatorPositionConstraint.Apply();
327 void ScrollBar::SetScrollPositionIntervals( const Dali::Vector<float>& positions )
329 mScrollPositionIntervals = positions;
331 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
333 if( scrollableHandle )
335 if( mPositionNotification )
337 scrollableHandle.RemovePropertyNotification(mPositionNotification);
340 mPositionNotification = scrollableHandle.AddPropertyNotification( mPropertyScrollPosition, VariableStepCondition(mScrollPositionIntervals) );
341 mPositionNotification.NotifySignal().Connect( this, &ScrollBar::OnScrollPositionIntervalReached );
345 Dali::Vector<float> ScrollBar::GetScrollPositionIntervals() const
347 return mScrollPositionIntervals;
350 void ScrollBar::OnScrollPositionIntervalReached(PropertyNotification& source)
352 // Emit the signal to notify the scroll position crossing
353 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
356 mScrollPositionIntervalReachedSignal.Emit(scrollableHandle.GetProperty<float>(mPropertyScrollPosition));
360 void ScrollBar::ShowIndicator()
362 // Cancel any animation
369 if( mIndicatorFirstShow )
371 // Preserve the alpha value from the stylesheet
372 mIndicatorShowAlpha = Self().GetCurrentColor().a;
373 mIndicatorFirstShow = false;
376 if(mIndicatorShowDuration > 0.0f)
378 mAnimation = Animation::New( mIndicatorShowDuration );
379 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), mIndicatorShowAlpha, AlphaFunction::EASE_IN );
384 mIndicator.SetOpacity(mIndicatorShowAlpha);
388 void ScrollBar::HideIndicator()
390 // Cancel any animation
397 if(mIndicatorHideDuration > 0.0f)
399 mAnimation = Animation::New( mIndicatorHideDuration );
400 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), 0.0f, AlphaFunction::EASE_IN );
405 mIndicator.SetOpacity(0.0f);
409 bool ScrollBar::OnPanGestureProcessTick()
411 // Update the scroll position property.
412 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
413 if( scrollableHandle )
415 scrollableHandle.SetProperty(mPropertyScrollPosition, mCurrentScrollPosition);
421 void ScrollBar::OnPan( const PanGesture& gesture )
423 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
427 Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::DownCast(scrollableHandle);
429 switch(gesture.state)
431 case Gesture::Started:
433 if( !mPanProcessTimer )
435 // Make sure the pan gesture is only being processed once per frame.
436 mPanProcessTimer = Timer::New( DEFAULT_PAN_GESTURE_PROCESS_TIME );
437 mPanProcessTimer.TickSignal().Connect( this, &ScrollBar::OnPanGestureProcessTick );
438 mPanProcessTimer.Start();
442 mScrollStart = scrollableHandle.GetProperty<float>(mPropertyScrollPosition);
443 mGestureDisplacement = Vector3::ZERO;
448 case Gesture::Continuing:
450 mGestureDisplacement.x += gesture.displacement.x;
451 mGestureDisplacement.y += gesture.displacement.y;
453 float minScrollPosition = scrollableHandle.GetProperty<float>( mPropertyMinScrollPosition );
454 float maxScrollPosition = scrollableHandle.GetProperty<float>( mPropertyMaxScrollPosition );
456 // The domain size is the internal range
457 float domainSize = maxScrollPosition - minScrollPosition;
458 float logicalSize = Self().GetCurrentSize().y - ( mIndicator.GetCurrentSize().y + mIndicatorStartPadding + mIndicatorEndPadding );
460 mCurrentScrollPosition = mScrollStart - ( ( mGestureDisplacement.y * domainSize ) / logicalSize );
461 mCurrentScrollPosition = -std::min( maxScrollPosition, std::max( -mCurrentScrollPosition, minScrollPosition ) );
469 if( mPanProcessTimer )
471 // Destroy the timer when pan gesture is finished.
472 mPanProcessTimer.Stop();
473 mPanProcessTimer.TickSignal().Disconnect( this, &ScrollBar::OnPanGestureProcessTick );
474 mPanProcessTimer.Reset();
479 // Refresh the ItemView cache with extra items
480 GetImpl(itemView).DoRefresh(mCurrentScrollPosition, true);
483 mPanFinishedSignal.Emit();
491 // Disable automatic refresh in ItemView during fast scrolling
492 GetImpl(itemView).SetRefreshEnabled(!mIsPanning);
497 void ScrollBar::OnSizeSet( const Vector3& size )
499 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
501 mIndicator.SetSize(size.width, mIndicatorFixedHeight);
505 void ScrollBar::SetScrollDirection( Toolkit::ScrollBar::Direction direction )
507 mDirection = direction;
510 Toolkit::ScrollBar::Direction ScrollBar::GetScrollDirection() const
515 void ScrollBar::SetIndicatorHeightPolicy( Toolkit::ScrollBar::IndicatorHeightPolicy policy )
517 if( policy != mIndicatorHeightPolicy )
519 mIndicatorHeightPolicy = policy;
524 Toolkit::ScrollBar::IndicatorHeightPolicy ScrollBar::GetIndicatorHeightPolicy() const
526 return mIndicatorHeightPolicy;
529 void ScrollBar::SetIndicatorFixedHeight( float height )
531 mIndicatorFixedHeight = height;
533 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
535 mIndicator.SetSize(Self().GetCurrentSize().width, mIndicatorFixedHeight);
539 float ScrollBar::GetIndicatorFixedHeight() const
541 return mIndicatorFixedHeight;
544 void ScrollBar::SetIndicatorShowDuration( float durationSeconds )
546 mIndicatorShowDuration = durationSeconds;
549 float ScrollBar::GetIndicatorShowDuration() const
551 return mIndicatorShowDuration;
554 void ScrollBar::SetIndicatorHideDuration( float durationSeconds )
556 mIndicatorHideDuration = durationSeconds;
559 float ScrollBar::GetIndicatorHideDuration() const
561 return mIndicatorHideDuration;
564 void ScrollBar::OnScrollDirectionPropertySet( Property::Value propertyValue )
566 std::string directionName( propertyValue.Get<std::string>() );
567 if(directionName == "Vertical")
569 SetScrollDirection(Toolkit::ScrollBar::Vertical);
571 else if(directionName == "Horizontal")
573 SetScrollDirection(Toolkit::ScrollBar::Horizontal);
577 DALI_ASSERT_ALWAYS( !"ScrollBar::OnScrollDirectionPropertySet(). Invalid Property value." );
581 void ScrollBar::OnIndicatorHeightPolicyPropertySet( Property::Value propertyValue )
583 std::string policyName( propertyValue.Get<std::string>() );
584 if(policyName == "Variable")
586 SetIndicatorHeightPolicy(Toolkit::ScrollBar::Variable);
588 else if(policyName == "Fixed")
590 SetIndicatorHeightPolicy(Toolkit::ScrollBar::Fixed);
594 DALI_ASSERT_ALWAYS( !"ScrollBar::OnIndicatorHeightPolicyPropertySet(). Invalid Property value." );
598 bool ScrollBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
600 Dali::BaseHandle handle( object );
602 bool connected( true );
603 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( handle );
605 if( 0 == strcmp( signalName.c_str(), PAN_FINISHED_SIGNAL ) )
607 scrollBar.PanFinishedSignal().Connect( tracker, functor );
609 else if( 0 == strcmp( signalName.c_str(), SCROLL_POSITION_INTERVAL_REACHED_SIGNAL ) )
611 scrollBar.ScrollPositionIntervalReachedSignal().Connect( tracker, functor );
615 // signalName does not match any signal
622 void ScrollBar::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
624 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( Dali::BaseHandle( object ) );
628 ScrollBar& scrollBarImpl( GetImpl( scrollBar ) );
631 case Toolkit::ScrollBar::Property::SCROLL_DIRECTION:
633 scrollBarImpl.OnScrollDirectionPropertySet( value );
636 case Toolkit::ScrollBar::Property::INDICATOR_HEIGHT_POLICY:
638 scrollBarImpl.OnIndicatorHeightPolicyPropertySet( value );
641 case Toolkit::ScrollBar::Property::INDICATOR_FIXED_HEIGHT:
643 scrollBarImpl.SetIndicatorFixedHeight(value.Get<float>());
646 case Toolkit::ScrollBar::Property::INDICATOR_SHOW_DURATION:
648 scrollBarImpl.SetIndicatorShowDuration(value.Get<float>());
651 case Toolkit::ScrollBar::Property::INDICATOR_HIDE_DURATION:
653 scrollBarImpl.SetIndicatorHideDuration(value.Get<float>());
656 case Toolkit::ScrollBar::Property::SCROLL_POSITION_INTERVALS:
658 Property::Array* array = value.GetArray();
661 Dali::Vector<float> positions;
662 size_t positionCount = array->Count();
663 positions.Resize( positionCount );
664 for( size_t i = 0; i != positionCount; ++i )
666 array->GetElementAt( i ).Get( positions[i] );
669 scrollBarImpl.SetScrollPositionIntervals(positions);
673 case Toolkit::ScrollBar::Property::INDICATOR_MINIMUM_HEIGHT:
675 scrollBarImpl.mIndicatorMinimumHeight = value.Get<float>();
676 scrollBarImpl.ApplyConstraints();
679 case Toolkit::ScrollBar::Property::INDICATOR_START_PADDING:
681 scrollBarImpl.mIndicatorStartPadding = value.Get<float>();
682 scrollBarImpl.ApplyConstraints();
685 case Toolkit::ScrollBar::Property::INDICATOR_END_PADDING:
687 scrollBarImpl.mIndicatorEndPadding = value.Get<float>();
688 scrollBarImpl.ApplyConstraints();
695 Property::Value ScrollBar::GetProperty( BaseObject* object, Property::Index index )
697 Property::Value value;
699 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( Dali::BaseHandle( object ) );
703 ScrollBar& scrollBarImpl( GetImpl( scrollBar ) );
706 case Toolkit::ScrollBar::Property::SCROLL_DIRECTION:
708 value = SCROLL_DIRECTION_NAME[ scrollBarImpl.GetScrollDirection() ];
711 case Toolkit::ScrollBar::Property::INDICATOR_HEIGHT_POLICY:
713 value = INDICATOR_HEIGHT_POLICY_NAME[ scrollBarImpl.GetIndicatorHeightPolicy() ];
716 case Toolkit::ScrollBar::Property::INDICATOR_FIXED_HEIGHT:
718 value = scrollBarImpl.GetIndicatorFixedHeight();
721 case Toolkit::ScrollBar::Property::INDICATOR_SHOW_DURATION:
723 value = scrollBarImpl.GetIndicatorShowDuration();
726 case Toolkit::ScrollBar::Property::INDICATOR_HIDE_DURATION:
728 value = scrollBarImpl.GetIndicatorHideDuration();
731 case Toolkit::ScrollBar::Property::SCROLL_POSITION_INTERVALS:
733 Property::Value value( Property::ARRAY );
734 Property::Array* array = value.GetArray();
738 Dali::Vector<float> positions = scrollBarImpl.GetScrollPositionIntervals();
739 size_t positionCount( array->Count() );
740 for( size_t i( 0 ); i != positionCount; ++i )
742 array->PushBack( positions[i] );
747 case Toolkit::ScrollBar::Property::INDICATOR_MINIMUM_HEIGHT:
749 value = scrollBarImpl.mIndicatorMinimumHeight;
752 case Toolkit::ScrollBar::Property::INDICATOR_START_PADDING:
754 value = scrollBarImpl.mIndicatorStartPadding;
757 case Toolkit::ScrollBar::Property::INDICATOR_END_PADDING:
759 value = scrollBarImpl.mIndicatorEndPadding;
767 Toolkit::ScrollBar ScrollBar::New(Toolkit::ScrollBar::Direction direction)
769 // Create the implementation, temporarily owned by this handle on stack
770 IntrusivePtr< ScrollBar > impl = new ScrollBar(direction);
772 // Pass ownership to CustomActor handle
773 Toolkit::ScrollBar handle( *impl );
775 // Second-phase init of the implementation
776 // This can only be done after the CustomActor connection has been made...
782 } // namespace Internal
784 } // namespace Toolkit