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>
30 #include <dali/devel-api/object/property-helper-devel.h>
31 #include <dali/devel-api/actors/actor-devel.h>
34 #include <dali-toolkit/devel-api/asset-manager/asset-manager.h>
35 #include <dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.h>
36 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
43 const char* DEFAULT_INDICATOR_IMAGE_FILE_NAME = "popup_scroll.9.png";
44 const float DEFAULT_SLIDER_DEPTH(1.0f);
45 const float DEFAULT_INDICATOR_SHOW_DURATION(0.5f);
46 const float DEFAULT_INDICATOR_HIDE_DURATION(0.5f);
47 const float DEFAULT_PAN_GESTURE_PROCESS_TIME(16.7f); // 16.7 milliseconds, i.e. one frame
48 const float DEFAULT_INDICATOR_FIXED_HEIGHT(80.0f);
49 const float DEFAULT_INDICATOR_MINIMUM_HEIGHT(0.0f);
50 const float DEFAULT_INDICATOR_START_PADDING(0.0f);
51 const float DEFAULT_INDICATOR_END_PADDING(0.0f);
52 const float DEFAULT_INDICATOR_TRANSIENT_DURATION(1.0f);
55 * Indicator size constraint
56 * Indicator size depends on both indicator's parent size and the scroll content size
58 struct IndicatorSizeConstraint
61 * @param[in] minimumHeight The minimum height for the indicator
62 * @param[in] padding The sum of the padding at the start & end of the indicator
64 IndicatorSizeConstraint( float minimumHeight, float padding )
65 : mMinimumHeight( minimumHeight ),
72 * @param[in] current The current indicator size
73 * @param[in] parentSizeProperty The parent size of scroll indicator.
74 * @return The new scroll indicator size.
76 void operator()( Vector3& current, const PropertyInputContainer& inputs )
78 const Vector3& parentSize = inputs[0]->GetVector3();
79 const float contentSize = inputs[1]->GetFloat();
81 // Take into account padding that may exist at the beginning and end of the indicator.
82 const float parentHeightMinusPadding = parentSize.height - mPadding;
84 float height = contentSize > parentHeightMinusPadding ?
85 parentHeightMinusPadding * ( parentHeightMinusPadding / contentSize ) :
86 parentHeightMinusPadding * ( ( parentHeightMinusPadding - contentSize * 0.5f ) / parentHeightMinusPadding );
88 current.y = std::max( mMinimumHeight, height );
96 * Indicator position constraint
97 * Positions the indicator to reflect the current scroll position within the scroll domain.
99 struct IndicatorPositionConstraint
102 * @param[in] startPadding The padding at the start of the indicator
103 * @param[in] endPadding The padding at the end of the indicator
105 IndicatorPositionConstraint( float startPadding, float endPadding )
106 : mStartPadding( startPadding ),
107 mEndPadding( endPadding )
112 * Constraint operator
113 * @param[in,out] current The current indicator position
114 * @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)
115 * @return The new indicator position is returned.
117 void operator()( Vector3& current, const PropertyInputContainer& inputs )
119 const Vector3& indicatorSize = inputs[0]->GetVector3();
120 const Vector3& parentSize = inputs[1]->GetVector3();
121 const float scrollPosition = -inputs[2]->GetFloat();
122 const float minimumScrollPosition = inputs[3]->GetFloat();
123 const float maximumScrollPosition = inputs[4]->GetFloat();
125 // Take into account padding that may exist at the beginning and end of the indicator.
126 const float parentHeightMinusPadding = parentSize.height - ( mStartPadding + mEndPadding );
128 float relativePosition = std::max( 0.0f, std::min( 1.0f, ( scrollPosition - minimumScrollPosition ) / ( maximumScrollPosition - minimumScrollPosition ) ) );
129 current.y = mStartPadding + ( parentHeightMinusPadding - indicatorSize.height ) * relativePosition;
130 current.z = DEFAULT_SLIDER_DEPTH;
137 } // unnamed namespace
151 using namespace Dali;
155 return Toolkit::ScrollBar::New();
158 // Setup properties, signals and actions using the type-registry.
159 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ScrollBar, Toolkit::Control, Create );
161 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollDirection", STRING, SCROLL_DIRECTION )
162 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHeightPolicy", STRING, INDICATOR_HEIGHT_POLICY )
163 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorFixedHeight", FLOAT, INDICATOR_FIXED_HEIGHT )
164 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorShowDuration", FLOAT, INDICATOR_SHOW_DURATION )
165 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorHideDuration", FLOAT, INDICATOR_HIDE_DURATION )
166 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervals", ARRAY, SCROLL_POSITION_INTERVALS )
167 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorMinimumHeight", FLOAT, INDICATOR_MINIMUM_HEIGHT )
168 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorStartPadding", FLOAT, INDICATOR_START_PADDING )
169 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorEndPadding", FLOAT, INDICATOR_END_PADDING )
170 DALI_PROPERTY_REGISTRATION( Toolkit, ScrollBar, "indicatorTransientDuration", FLOAT, INDICATOR_TRANSIENT_DURATION )
172 DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "panFinished", PAN_FINISHED_SIGNAL )
173 DALI_SIGNAL_REGISTRATION( Toolkit, ScrollBar, "scrollPositionIntervalReached", SCROLL_POSITION_INTERVAL_REACHED_SIGNAL )
175 DALI_ACTION_REGISTRATION( Toolkit, ScrollBar, "ShowIndicator", ACTION_SHOW_INDICATOR )
176 DALI_ACTION_REGISTRATION( Toolkit, ScrollBar, "HideIndicator", ACTION_HIDE_INDICATOR )
177 DALI_ACTION_REGISTRATION( Toolkit, ScrollBar, "ShowTransientIndicator", ACTION_SHOW_TRANSIENT_INDICATOR )
179 DALI_TYPE_REGISTRATION_END()
181 const char* SCROLL_DIRECTION_NAME[] = {"Vertical", "Horizontal"};
182 const char* INDICATOR_HEIGHT_POLICY_NAME[] = {"Variable", "Fixed"};
186 ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction)
187 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
188 mIndicatorShowAlpha(1.0f),
189 mDirection(direction),
190 mScrollableObject(WeakHandleBase()),
191 mPropertyScrollPosition(Property::INVALID_INDEX),
192 mPropertyMinScrollPosition(Property::INVALID_INDEX),
193 mPropertyMaxScrollPosition(Property::INVALID_INDEX),
194 mPropertyScrollContentSize(Property::INVALID_INDEX),
195 mIndicatorShowDuration(DEFAULT_INDICATOR_SHOW_DURATION),
196 mIndicatorHideDuration(DEFAULT_INDICATOR_HIDE_DURATION),
197 mTransientIndicatorDuration(DEFAULT_INDICATOR_TRANSIENT_DURATION),
199 mGestureDisplacement( Vector3::ZERO ),
200 mCurrentScrollPosition(0.0f),
201 mIndicatorHeightPolicy(Toolkit::ScrollBar::Variable),
202 mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT),
203 mIndicatorMinimumHeight(DEFAULT_INDICATOR_MINIMUM_HEIGHT),
204 mIndicatorStartPadding(DEFAULT_INDICATOR_START_PADDING),
205 mIndicatorEndPadding(DEFAULT_INDICATOR_END_PADDING),
207 mIndicatorFirstShow(true)
211 ScrollBar::~ScrollBar()
215 void ScrollBar::OnInitialize()
217 CreateDefaultIndicatorActor();
218 Self().SetDrawMode(DrawMode::OVERLAY_2D);
221 void ScrollBar::SetScrollPropertySource( Handle handle, Property::Index propertyScrollPosition, Property::Index propertyMinScrollPosition, Property::Index propertyMaxScrollPosition, Property::Index propertyScrollContentSize )
224 && propertyScrollPosition != Property::INVALID_INDEX
225 && propertyMinScrollPosition != Property::INVALID_INDEX
226 && propertyMaxScrollPosition != Property::INVALID_INDEX
227 && propertyScrollContentSize != Property::INVALID_INDEX )
229 mScrollableObject = WeakHandleBase(handle);
230 mPropertyScrollPosition = propertyScrollPosition;
231 mPropertyMinScrollPosition = propertyMinScrollPosition;
232 mPropertyMaxScrollPosition = propertyMaxScrollPosition;
233 mPropertyScrollContentSize = propertyScrollContentSize;
239 DALI_LOG_ERROR("Can not set empty handle of source object or invalid source property index\n");
243 void ScrollBar::CreateDefaultIndicatorActor()
245 const std::string imageDirPath = AssetManager::GetDaliImagePath();
246 Toolkit::ImageView indicator = Toolkit::ImageView::New( imageDirPath + DEFAULT_INDICATOR_IMAGE_FILE_NAME );
247 indicator.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
248 indicator.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
249 indicator.SetStyleName( "ScrollBarIndicator" );
250 indicator.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
251 SetScrollIndicator(indicator);
254 void ScrollBar::SetScrollIndicator( Actor indicator )
256 // Don't allow empty handle
259 // Remove current Indicator
262 Self().Remove( mIndicator );
264 mIndicator = indicator;
266 mIndicatorFirstShow = true;
267 Self().Add( mIndicator );
269 EnableGestureDetection( Gesture::Type( Gesture::Pan ) );
271 PanGestureDetector detector( GetPanGestureDetector() );
272 detector.DetachAll();
273 detector.Attach( mIndicator );
275 unsigned int childCount = mIndicator.GetChildCount();
276 for ( unsigned int index = 0; index < childCount; index++ )
278 Actor child = mIndicator.GetChildAt( index );
281 detector.Attach( child );
287 DALI_LOG_ERROR("Empty handle of scroll indicator\n");
291 Actor ScrollBar::GetScrollIndicator()
296 void ScrollBar::ApplyConstraints()
298 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
300 if( scrollableHandle )
302 if(mIndicatorSizeConstraint)
304 mIndicatorSizeConstraint.Remove();
307 // Set indicator height according to the indicator's height policy
308 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
310 mIndicator.SetSize(Self().GetCurrentProperty< Vector3 >( Actor::Property::SIZE ).width, mIndicatorFixedHeight);
314 mIndicatorSizeConstraint = Constraint::New<Vector3>( mIndicator, Actor::Property::SIZE,
315 IndicatorSizeConstraint( mIndicatorMinimumHeight, mIndicatorStartPadding + mIndicatorEndPadding ) );
316 mIndicatorSizeConstraint.AddSource( ParentSource( Actor::Property::SIZE ) );
317 mIndicatorSizeConstraint.AddSource( Source( scrollableHandle, mPropertyScrollContentSize ) );
318 mIndicatorSizeConstraint.Apply();
321 if(mIndicatorPositionConstraint)
323 mIndicatorPositionConstraint.Remove();
326 mIndicatorPositionConstraint = Constraint::New<Vector3>( mIndicator, Actor::Property::POSITION,
327 IndicatorPositionConstraint( mIndicatorStartPadding, mIndicatorEndPadding ) );
328 mIndicatorPositionConstraint.AddSource( LocalSource( Actor::Property::SIZE ) );
329 mIndicatorPositionConstraint.AddSource( ParentSource( Actor::Property::SIZE ) );
330 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyScrollPosition ) );
331 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMinScrollPosition ) );
332 mIndicatorPositionConstraint.AddSource( Source( scrollableHandle, mPropertyMaxScrollPosition ) );
333 mIndicatorPositionConstraint.Apply();
337 void ScrollBar::SetScrollPositionIntervals( const Dali::Vector<float>& positions )
339 mScrollPositionIntervals = positions;
341 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
343 if( scrollableHandle )
345 if( mPositionNotification )
347 scrollableHandle.RemovePropertyNotification(mPositionNotification);
350 mPositionNotification = scrollableHandle.AddPropertyNotification( mPropertyScrollPosition, VariableStepCondition(mScrollPositionIntervals) );
351 mPositionNotification.NotifySignal().Connect( this, &ScrollBar::OnScrollPositionIntervalReached );
355 Dali::Vector<float> ScrollBar::GetScrollPositionIntervals() const
357 return mScrollPositionIntervals;
360 void ScrollBar::OnScrollPositionIntervalReached(PropertyNotification& source)
362 // Emit the signal to notify the scroll position crossing
363 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
366 mScrollPositionIntervalReachedSignal.Emit( scrollableHandle.GetCurrentProperty< float >( mPropertyScrollPosition ) );
370 void ScrollBar::ShowIndicator()
372 // Cancel any animation
379 if( mIndicatorFirstShow )
381 // Preserve the alpha value from the stylesheet
382 mIndicatorShowAlpha = Self().GetCurrentProperty< Vector4 >( Actor::Property::COLOR ).a;
383 mIndicatorFirstShow = false;
386 if(mIndicatorShowDuration > 0.0f)
388 mAnimation = Animation::New( mIndicatorShowDuration );
389 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), mIndicatorShowAlpha, AlphaFunction::EASE_IN );
394 mIndicator.SetProperty( DevelActor::Property::OPACITY,mIndicatorShowAlpha);
398 void ScrollBar::HideIndicator()
400 // Cancel any animation
407 if(mIndicatorHideDuration > 0.0f)
409 mAnimation = Animation::New( mIndicatorHideDuration );
410 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), 0.0f, AlphaFunction::EASE_IN );
415 mIndicator.SetProperty( DevelActor::Property::OPACITY,0.0f);
419 void ScrollBar::ShowTransientIndicator()
421 // Cancel any animation
428 mAnimation = Animation::New( mIndicatorShowDuration + mTransientIndicatorDuration + mIndicatorHideDuration );
429 if(mIndicatorShowDuration > 0.0f)
431 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ),
432 mIndicatorShowAlpha, AlphaFunction::EASE_IN, TimePeriod(0, mIndicatorShowDuration) );
436 mIndicator.SetProperty( DevelActor::Property::OPACITY,mIndicatorShowAlpha);
438 mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ),
439 0.0f, AlphaFunction::EASE_IN, TimePeriod((mIndicatorShowDuration + mTransientIndicatorDuration), mIndicatorHideDuration) );
443 bool ScrollBar::OnPanGestureProcessTick()
445 // Update the scroll position property.
446 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
447 if( scrollableHandle )
449 scrollableHandle.SetProperty(mPropertyScrollPosition, mCurrentScrollPosition);
455 void ScrollBar::OnPan( const PanGesture& gesture )
457 Handle scrollableHandle = mScrollableObject.GetBaseHandle();
461 Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::DownCast(scrollableHandle);
463 switch(gesture.state)
465 case Gesture::Started:
467 if( !mPanProcessTimer )
469 // Make sure the pan gesture is only being processed once per frame.
470 mPanProcessTimer = Timer::New( DEFAULT_PAN_GESTURE_PROCESS_TIME );
471 mPanProcessTimer.TickSignal().Connect( this, &ScrollBar::OnPanGestureProcessTick );
472 mPanProcessTimer.Start();
476 mScrollStart = scrollableHandle.GetCurrentProperty< float >( mPropertyScrollPosition );
477 mGestureDisplacement = Vector3::ZERO;
482 case Gesture::Continuing:
484 mGestureDisplacement.x += gesture.displacement.x;
485 mGestureDisplacement.y += gesture.displacement.y;
487 float minScrollPosition = scrollableHandle.GetCurrentProperty<float>( mPropertyMinScrollPosition );
488 float maxScrollPosition = scrollableHandle.GetCurrentProperty<float>( mPropertyMaxScrollPosition );
490 // The domain size is the internal range
491 float domainSize = maxScrollPosition - minScrollPosition;
492 float logicalSize = Self().GetCurrentProperty< Vector3 >( Actor::Property::SIZE ).y - ( mIndicator.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ).y + mIndicatorStartPadding + mIndicatorEndPadding );
494 mCurrentScrollPosition = mScrollStart - ( ( mGestureDisplacement.y * domainSize ) / logicalSize );
495 mCurrentScrollPosition = -std::min( maxScrollPosition, std::max( -mCurrentScrollPosition, minScrollPosition ) );
503 if( mPanProcessTimer )
505 // Destroy the timer when pan gesture is finished.
506 mPanProcessTimer.Stop();
507 mPanProcessTimer.TickSignal().Disconnect( this, &ScrollBar::OnPanGestureProcessTick );
508 mPanProcessTimer.Reset();
513 // Refresh the ItemView cache with extra items
514 GetImpl(itemView).DoRefresh(mCurrentScrollPosition, true);
517 mPanFinishedSignal.Emit();
525 // Disable automatic refresh in ItemView during fast scrolling
526 GetImpl(itemView).SetRefreshEnabled(!mIsPanning);
531 void ScrollBar::OnSizeSet( const Vector3& size )
533 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
535 mIndicator.SetSize(size.width, mIndicatorFixedHeight);
538 Control::OnSizeSet( size );
541 void ScrollBar::SetScrollDirection( Toolkit::ScrollBar::Direction direction )
543 mDirection = direction;
546 Toolkit::ScrollBar::Direction ScrollBar::GetScrollDirection() const
551 void ScrollBar::SetIndicatorHeightPolicy( Toolkit::ScrollBar::IndicatorHeightPolicy policy )
553 if( policy != mIndicatorHeightPolicy )
555 mIndicatorHeightPolicy = policy;
560 Toolkit::ScrollBar::IndicatorHeightPolicy ScrollBar::GetIndicatorHeightPolicy() const
562 return mIndicatorHeightPolicy;
565 void ScrollBar::SetIndicatorFixedHeight( float height )
567 mIndicatorFixedHeight = height;
569 if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
571 mIndicator.SetSize(Self().GetCurrentProperty< Vector3 >( Actor::Property::SIZE ).width, mIndicatorFixedHeight);
575 float ScrollBar::GetIndicatorFixedHeight() const
577 return mIndicatorFixedHeight;
580 void ScrollBar::SetIndicatorShowDuration( float durationSeconds )
582 mIndicatorShowDuration = durationSeconds;
585 float ScrollBar::GetIndicatorShowDuration() const
587 return mIndicatorShowDuration;
590 void ScrollBar::SetIndicatorHideDuration( float durationSeconds )
592 mIndicatorHideDuration = durationSeconds;
595 float ScrollBar::GetIndicatorHideDuration() const
597 return mIndicatorHideDuration;
600 void ScrollBar::OnScrollDirectionPropertySet( Property::Value propertyValue )
602 std::string directionName( propertyValue.Get<std::string>() );
603 if(directionName == "Vertical")
605 SetScrollDirection(Toolkit::ScrollBar::Vertical);
607 else if(directionName == "Horizontal")
609 SetScrollDirection(Toolkit::ScrollBar::Horizontal);
613 DALI_ASSERT_ALWAYS( !"ScrollBar::OnScrollDirectionPropertySet(). Invalid Property value." );
617 void ScrollBar::OnIndicatorHeightPolicyPropertySet( Property::Value propertyValue )
619 std::string policyName( propertyValue.Get<std::string>() );
620 if(policyName == "Variable")
622 SetIndicatorHeightPolicy(Toolkit::ScrollBar::Variable);
624 else if(policyName == "Fixed")
626 SetIndicatorHeightPolicy(Toolkit::ScrollBar::Fixed);
630 DALI_ASSERT_ALWAYS( !"ScrollBar::OnIndicatorHeightPolicyPropertySet(). Invalid Property value." );
634 bool ScrollBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
636 Dali::BaseHandle handle( object );
638 bool connected( true );
639 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( handle );
641 if( 0 == strcmp( signalName.c_str(), PAN_FINISHED_SIGNAL ) )
643 scrollBar.PanFinishedSignal().Connect( tracker, functor );
645 else if( 0 == strcmp( signalName.c_str(), SCROLL_POSITION_INTERVAL_REACHED_SIGNAL ) )
647 scrollBar.ScrollPositionIntervalReachedSignal().Connect( tracker, functor );
651 // signalName does not match any signal
658 void ScrollBar::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
660 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( Dali::BaseHandle( object ) );
664 ScrollBar& scrollBarImpl( GetImpl( scrollBar ) );
667 case Toolkit::ScrollBar::Property::SCROLL_DIRECTION:
669 scrollBarImpl.OnScrollDirectionPropertySet( value );
672 case Toolkit::ScrollBar::Property::INDICATOR_HEIGHT_POLICY:
674 scrollBarImpl.OnIndicatorHeightPolicyPropertySet( value );
677 case Toolkit::ScrollBar::Property::INDICATOR_FIXED_HEIGHT:
679 scrollBarImpl.SetIndicatorFixedHeight(value.Get<float>());
682 case Toolkit::ScrollBar::Property::INDICATOR_SHOW_DURATION:
684 scrollBarImpl.SetIndicatorShowDuration(value.Get<float>());
687 case Toolkit::ScrollBar::Property::INDICATOR_HIDE_DURATION:
689 scrollBarImpl.SetIndicatorHideDuration(value.Get<float>());
692 case Toolkit::ScrollBar::Property::SCROLL_POSITION_INTERVALS:
694 Property::Array* array = value.GetArray();
697 Dali::Vector<float> positions;
698 size_t positionCount = array->Count();
699 positions.Resize( positionCount );
700 for( size_t i = 0; i != positionCount; ++i )
702 array->GetElementAt( i ).Get( positions[i] );
705 scrollBarImpl.SetScrollPositionIntervals(positions);
709 case Toolkit::ScrollBar::Property::INDICATOR_MINIMUM_HEIGHT:
711 scrollBarImpl.mIndicatorMinimumHeight = value.Get<float>();
712 scrollBarImpl.ApplyConstraints();
715 case Toolkit::ScrollBar::Property::INDICATOR_START_PADDING:
717 scrollBarImpl.mIndicatorStartPadding = value.Get<float>();
718 scrollBarImpl.ApplyConstraints();
721 case Toolkit::ScrollBar::Property::INDICATOR_END_PADDING:
723 scrollBarImpl.mIndicatorEndPadding = value.Get<float>();
724 scrollBarImpl.ApplyConstraints();
727 case Toolkit::ScrollBar::Property::INDICATOR_TRANSIENT_DURATION:
729 scrollBarImpl.mTransientIndicatorDuration = value.Get<float>();
736 Property::Value ScrollBar::GetProperty( BaseObject* object, Property::Index index )
738 Property::Value value;
740 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( Dali::BaseHandle( object ) );
744 ScrollBar& scrollBarImpl( GetImpl( scrollBar ) );
747 case Toolkit::ScrollBar::Property::SCROLL_DIRECTION:
749 value = SCROLL_DIRECTION_NAME[ scrollBarImpl.GetScrollDirection() ];
752 case Toolkit::ScrollBar::Property::INDICATOR_HEIGHT_POLICY:
754 value = INDICATOR_HEIGHT_POLICY_NAME[ scrollBarImpl.GetIndicatorHeightPolicy() ];
757 case Toolkit::ScrollBar::Property::INDICATOR_FIXED_HEIGHT:
759 value = scrollBarImpl.GetIndicatorFixedHeight();
762 case Toolkit::ScrollBar::Property::INDICATOR_SHOW_DURATION:
764 value = scrollBarImpl.GetIndicatorShowDuration();
767 case Toolkit::ScrollBar::Property::INDICATOR_HIDE_DURATION:
769 value = scrollBarImpl.GetIndicatorHideDuration();
772 case Toolkit::ScrollBar::Property::SCROLL_POSITION_INTERVALS:
774 Property::Value tempValue( Property::ARRAY );
775 Property::Array* array = tempValue.GetArray();
779 Dali::Vector<float> positions = scrollBarImpl.GetScrollPositionIntervals();
780 size_t positionCount( positions.Count() );
782 for( size_t i( 0 ); i != positionCount; ++i )
784 array->PushBack( positions[i] );
791 case Toolkit::ScrollBar::Property::INDICATOR_MINIMUM_HEIGHT:
793 value = scrollBarImpl.mIndicatorMinimumHeight;
796 case Toolkit::ScrollBar::Property::INDICATOR_START_PADDING:
798 value = scrollBarImpl.mIndicatorStartPadding;
801 case Toolkit::ScrollBar::Property::INDICATOR_END_PADDING:
803 value = scrollBarImpl.mIndicatorEndPadding;
806 case Toolkit::ScrollBar::Property::INDICATOR_TRANSIENT_DURATION:
808 value = scrollBarImpl.mTransientIndicatorDuration;
816 bool ScrollBar::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
820 Dali::BaseHandle handle( object );
822 Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( handle );
824 DALI_ASSERT_DEBUG( scrollBar );
828 if( 0 == strcmp( actionName.c_str(), ACTION_SHOW_INDICATOR ) )
830 GetImpl( scrollBar ).ShowIndicator();
833 else if( 0 == strcmp( actionName.c_str(), ACTION_HIDE_INDICATOR ) )
835 GetImpl( scrollBar ).HideIndicator();
838 else if( 0 == strcmp( actionName.c_str(), ACTION_SHOW_TRANSIENT_INDICATOR ) )
840 GetImpl( scrollBar ).ShowTransientIndicator();
848 Toolkit::ScrollBar ScrollBar::New(Toolkit::ScrollBar::Direction direction)
850 // Create the implementation, temporarily owned by this handle on stack
851 IntrusivePtr< ScrollBar > impl = new ScrollBar(direction);
853 // Pass ownership to CustomActor handle
854 Toolkit::ScrollBar handle( *impl );
856 // Second-phase init of the implementation
857 // This can only be done after the CustomActor connection has been made...
863 } // namespace Internal
865 } // namespace Toolkit