2 * Copyright (c) 2014 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/slider/slider-impl.h>
23 #include <dali/public-api/events/touch-event.h>
24 #include <dali/public-api/object/type-registry.h>
25 #include <dali/public-api/images/resource-image.h>
28 #include <dali-toolkit/public-api/controls/control-impl.h>
39 const Property::Index Slider::LOWER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX;
40 const Property::Index Slider::UPPER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 1;
42 const Property::Index Slider::VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 2;
43 const Property::Index Slider::HIT_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 3;
44 const Property::Index Slider::BACKING_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 4;
45 const Property::Index Slider::HANDLE_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 5;
47 const Property::Index Slider::BACKING_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 6;
48 const Property::Index Slider::HANDLE_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 7;
49 const Property::Index Slider::PROGRESS_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 8;
50 const Property::Index Slider::POPUP_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 9;
51 const Property::Index Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 10;
53 const Property::Index Slider::DISABLE_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 11;
54 const Property::Index Slider::POPUP_TEXT_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 12;
56 const Property::Index Slider::VALUE_PRECISION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 13;
58 const Property::Index Slider::SHOW_POPUP_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 14;
59 const Property::Index Slider::SHOW_VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 15;
61 const Property::Index Slider::ENABLED_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 16;
63 const Property::Index Slider::MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 17;
64 const Property::Index Slider::SNAP_TO_MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 18;
65 const Property::Index Slider::MARK_TOLERANCE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 19;
72 const float BACKING_Z = -0.1f;
73 const float PROGRESS_Z = 0.1f;
74 const float HANDLE_Z = 1.0f;
75 const float VALUE_TEXT_INCREMENT = 0.01f;
76 const float HANDLE_VALUE_DISPLAY_TEXT_Z = HANDLE_Z + VALUE_TEXT_INCREMENT;
77 const float VALUE_DISPLAY_TEXT_Z = VALUE_TEXT_INCREMENT + VALUE_TEXT_INCREMENT; // Put above HANDLE_VALUE_DISPLAY_TEXT_Z (parented to handle)
79 const float MARK_SNAP_TOLERANCE = 0.05f; // 5% of slider width
81 const int VALUE_VIEW_SHOW_DURATION = 1000; // millisec
82 const int VALUE_VIEW_SHOW_DURATION_LONG = 2000; // millisec
84 const float VALUE_VERTICAL_OFFSET = 48.0f;
86 const float DEFAULT_WIDTH = 0.0f;
87 const float DEFAULT_HEIGHT = 27.0f;
88 const float DEFAULT_HIT_HEIGHT = 72.0f;
89 const float DEFAULT_HANDLE_HEIGHT = DEFAULT_HIT_HEIGHT;
91 const char* SKINNED_BACKING_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin.9.png";
92 const char* SKINNED_HANDLE_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-handle.png";;
93 const char* SKINNED_PROGRESS_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-progress.9.png";
94 const char* SKINNED_POPUP_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup.9.png";
95 const char* SKINNED_POPUP_ARROW_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup-arrow.png";
97 const Vector2 DEFAULT_HIT_REGION( DEFAULT_WIDTH, DEFAULT_HIT_HEIGHT );
98 const Vector2 DEFAULT_BACKING_REGION( DEFAULT_WIDTH, DEFAULT_HEIGHT );
99 const Vector2 DEFAULT_HANDLE_REGION( DEFAULT_HANDLE_HEIGHT, DEFAULT_HANDLE_HEIGHT );
101 const Vector4 DEFAULT_DISABLE_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
102 const Vector4 DEFAULT_POPUP_TEXT_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
104 const float VALUE_POPUP_MARGIN = 10.0f;
105 const float VALUE_POPUP_HEIGHT = 81.0f;
106 const float VALUE_POPUP_MIN_WIDTH = 54.0f;
107 const Vector2 VALUE_POPUP_ARROW_SIZE( 18.0f, 18.0f );
109 const float DEFAULT_LOWER_BOUND = 0.0f;
110 const float DEFAULT_UPPER_BOUND = 1.0f;
111 const float DEFAULT_VALUE = 0.0f;
112 const int DEFAULT_VALUE_PRECISION = 0;
113 const bool DEFAULT_SHOW_POPUP = false;
114 const bool DEFAULT_SHOW_VALUE = true;
115 const bool DEFAULT_ENABLED = true;
116 const bool DEFAULT_SNAP_TO_MARKS = false;
120 const char* const SIGNAL_VALUE_CHANGED = "value-changed";
121 const char* const SIGNAL_MARK = "mark";
125 return Dali::Toolkit::Slider::New();
128 TypeRegistration typeRegistration( typeid( Dali::Toolkit::Slider ), typeid( Dali::Toolkit::Control ), Create );
130 SignalConnectorType signalConnector1( typeRegistration, SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
131 SignalConnectorType signalConnector2( typeRegistration, SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
133 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
134 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
135 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
137 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
138 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
139 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
141 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
142 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
143 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
144 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
145 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
147 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
148 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
150 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
152 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
153 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
155 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
157 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
158 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
159 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
163 ///////////////////////////////////////////////////////////////////////////////////////////////////
165 ///////////////////////////////////////////////////////////////////////////////////////////////////
167 Dali::Toolkit::Slider Slider::New()
169 // Create the implementation
170 SliderPtr slider( new Slider() );
172 // Pass ownership to CustomActor via derived handle
173 Dali::Toolkit::Slider handle( *slider );
175 // Second-phase init of the implementation
176 // This can only be done after the CustomActor connection has been made...
177 slider->Initialize();
183 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
185 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
186 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
187 mHitRegion( 0.0f, 0.0f ),
188 mBackingRegion( 0.0f, 0.0f ),
189 mHandleRegionSize( 0.0f, 0.0f ),
193 mMarkTolerance( 0.0f ),
194 mValuePrecision( 0 ),
197 mSnapToMarks( false )
205 void Slider::OnInitialize()
213 SetHitRegion( DEFAULT_HIT_REGION );
214 SetBackingRegion( DEFAULT_BACKING_REGION );
215 SetHandleRegion( DEFAULT_HANDLE_REGION );
217 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
218 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
219 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
220 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
221 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
223 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
225 SetShowPopup( DEFAULT_SHOW_POPUP );
226 SetShowValue( DEFAULT_SHOW_VALUE );
228 SetEnabled( DEFAULT_ENABLED );
229 SetDisableColor( DEFAULT_DISABLE_COLOR );
231 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
232 SetMarkTolerance( MARK_SNAP_TOLERANCE );
234 SetLowerBound( DEFAULT_LOWER_BOUND );
235 SetUpperBound( DEFAULT_UPPER_BOUND );
237 SetValuePrecision( DEFAULT_VALUE_PRECISION );
238 mValue = DEFAULT_VALUE;
239 DisplayValue( mValue, false ); // Run this last to display the correct value
241 // Size the Slider actor to a default
242 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
245 void Slider::OnControlSizeSet( const Vector3& size )
247 // Factor in handle overshoot into size of backing
248 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
249 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
252 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
254 if( mState != DISABLED )
256 TouchPoint::State touchState = event.GetPoint(0).state;
258 if( touchState == TouchPoint::Down )
262 float percentage = MapPercentage( event.GetPoint(0).local );
263 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
265 DisplayPopup( value );
267 else if( touchState == TouchPoint::Up)
269 if( mState == PRESSED )
272 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
280 void Slider::OnPan( Actor actor, const PanGesture& gesture )
282 // gesture.position is in local actor coordinates
283 if( mState != DISABLED )
285 switch( gesture.state )
287 case Gesture::Continuing:
289 if( mState == PRESSED )
291 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
293 DisplayPopup( value );
297 case Gesture::Finished:
299 if( mState == PRESSED )
301 if( GetSnapToMarks() )
303 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
305 DisplayPopup( value );
307 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
321 float Slider::HitSpaceToDomain( float x )
323 float halfRegionWidth = GetHitRegion().x * 0.5f;
324 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
325 float endDiff = halfRegionWidth - halfDomainWidth;
330 float Slider::MapPercentage( const Vector2& point )
332 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
335 float Slider::MapValuePercentage( float value )
337 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
340 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
342 return lowerBound + percent * ( upperBound - lowerBound );
345 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
347 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
350 void Slider::DisplayValue( float value, bool raiseSignals )
352 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
354 float percent = MapValuePercentage( clampledValue );
356 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
358 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
363 if( clampledValue > 0.0f )
365 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
366 mProgress.SetSize( x, GetBackingRegion().y );
370 mProgress.SetVisible( false );
377 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
378 mValueChangedSignal.Emit( self, clampledValue );
381 if( MarkReached( percent, markIndex ) )
383 mMarkSignal.Emit( self, markIndex );
388 void Slider::SetMarks( const MarkList& marks )
391 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
393 const Property::Value& propertyValue = *it;
394 propertyValue.Get( value );
396 mMarks.push_back( value );
400 const Slider::MarkList& Slider::GetMarks() const
405 void Slider::SetSnapToMarks( bool snap )
410 bool Slider::GetSnapToMarks() const
415 Actor Slider::CreateHitRegion()
417 Actor hitRegion = Actor::New();
418 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
419 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
420 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
425 ImageActor Slider::CreateBacking()
427 ImageActor backing = ImageActor::New();
428 backing.SetParentOrigin( ParentOrigin::CENTER );
429 backing.SetAnchorPoint( AnchorPoint::CENTER );
430 backing.SetZ( BACKING_Z );
435 void Slider::SetBackingImageName( const std::string& imageName )
437 if( mBacking && ( imageName.size() > 0 ) )
439 Image image = ResourceImage::New( imageName );
440 mBacking.SetImage( image );
444 std::string Slider::GetBackingImageName()
448 return ResourceImage::DownCast( mBacking.GetImage() ).GetUrl();
451 return std::string( "" );
454 ImageActor Slider::CreateProgress()
456 ImageActor progress = ImageActor::New();
457 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
458 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
459 progress.SetZ( PROGRESS_Z );
464 void Slider::SetProgressImageName( const std::string& imageName )
466 if( mProgress && ( imageName.size() > 0 ) )
468 Image image = ResourceImage::New( imageName );
469 mProgress.SetImage( image );
473 std::string Slider::GetProgressImageName()
477 return ResourceImage::DownCast( mProgress.GetImage()).GetUrl();
480 return std::string( "" );
483 void Slider::SetPopupImageName( const std::string& imageName )
485 mPopupImageName = imageName;
488 std::string Slider::GetPopupImageName()
490 return mPopupImageName;
493 void Slider::CreatePopupImage( const std::string& imageName )
495 if( mPopup && ( imageName.size() > 0 ) )
497 Image image = ResourceImage::New( imageName );
498 mPopup.SetImage( image );
502 void Slider::SetPopupArrowImageName( const std::string& imageName )
504 mPopupArrowImageName = imageName;
507 std::string Slider::GetPopupArrowImageName()
509 return mPopupArrowImageName;
512 void Slider::CreatePopupArrowImage( const std::string& imageName )
514 if( mPopupArrow && ( imageName.size() > 0 ) )
516 Image image = ResourceImage::New( imageName );
517 mPopupArrow.SetImage( image );
521 void Slider::ResizeProgressRegion( const Vector2& region )
525 mProgress.SetSize( region );
529 ImageActor Slider::CreateHandle()
531 ImageActor handle = ImageActor::New();
532 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
533 handle.SetAnchorPoint( AnchorPoint::CENTER );
534 handle.SetZ( HANDLE_Z );
539 ImageActor Slider::CreatePopupArrow()
541 ImageActor arrow = ImageActor::New();
542 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
543 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
544 arrow.SetZ( HANDLE_Z );
549 //Toolkit::TextView Slider::CreatePopupText()
553 ImageActor Slider::CreatePopup()
555 ImageActor popup = ImageActor::New();
556 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
557 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
562 void Slider::SetHandleImageName( const std::string& imageName )
564 if( mHandle && ( imageName.size() > 0 ) )
566 Image image = ResourceImage::New( imageName );
567 mHandle.SetImage( image );
571 std::string Slider::GetHandleImageName()
575 return ResourceImage::DownCast( mHandle.GetImage() ).GetUrl();
578 return std::string( "" );
581 void Slider::ResizeHandleRegion( const Vector2& region )
585 mHandle.SetSize( region );
589 void Slider::CreateHandleValueDisplay()
593 void Slider::DestroyHandleValueDisplay()
597 void Slider::SetPopupTextColor( const Vector4& color )
599 mPopupTextColor = color;
602 Actor Slider::CreateValueDisplay()
604 Actor popup = Actor::New();
605 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
606 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
608 mPopupArrow = CreatePopupArrow();
609 popup.Add( mPopupArrow );
611 mPopup = CreatePopup();
612 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
613 mPopupArrow.Add( mPopup );
618 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
620 return mValueChangedSignal;
623 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
625 return mSlidingFinishedSignal;
628 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
633 void Slider::UpdateSkin()
639 mBacking.SetColor( Color::WHITE );
640 mHandle.SetColor( Color::WHITE );
641 mProgress.SetColor( Color::WHITE );
646 Vector4 disableColor = GetDisableColor();
647 mBacking.SetColor( disableColor );
648 mHandle.SetColor( disableColor );
649 mProgress.SetColor( disableColor );
663 void Slider::CreateChildren()
668 mHitArea = CreateHitRegion();
669 mPanDetector = PanGestureDetector::New();
670 mPanDetector.Attach( mHitArea );
671 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
672 self.Add( mHitArea );
675 mBacking = CreateBacking();
676 self.Add( mBacking );
679 mProgress = CreateProgress();
680 mBacking.Add( mProgress );
683 mHandle = CreateHandle();
684 mBacking.Add( mHandle );
687 void Slider::SetHitRegion( const Vector2& size )
693 mHitArea.SetSize( mHitRegion );
697 const Vector2& Slider::GetHitRegion() const
702 void Slider::AddPopup()
706 mValueDisplay = CreateValueDisplay();
707 mValueDisplay.SetVisible( false );
708 mHandle.Add( mValueDisplay );
710 CreatePopupImage( GetPopupImageName() );
711 CreatePopupArrowImage( GetPopupArrowImageName() );
713 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
714 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
718 void Slider::RemovePopup()
725 mPopupArrow.Unparent();
728 mValueDisplay.Unparent();
729 mValueDisplay.Reset();
731 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
737 float Slider::MarkFilter( float value )
739 const float MARK_TOLERANCE = GetMarkTolerance();
742 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
744 const Property::Value& propertyValue = *it;
745 propertyValue.Get( mark );
746 mark = MapValuePercentage( mark );
748 // If close to a mark, return the mark
749 if( fabsf( mark - value ) < MARK_TOLERANCE )
758 float Slider::SnapToMark( float value )
760 float closestMark = value;
761 float closestDist = std::numeric_limits<float>::max();
764 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
766 const Property::Value& propertyValue = *it;
767 propertyValue.Get( mark );
768 mark = MapValuePercentage( mark );
770 float dist = fabsf( mark - value );
771 if( dist < closestDist )
781 bool Slider::MarkReached( float value, int& outIndex )
783 const float MARK_TOLERANCE = GetMarkTolerance();
787 tail = mMarks.size() - 1;
791 while( head <= tail )
793 current = head + ( tail - head ) / 2;
795 const Property::Value& propertyValue = mMarks[ current ];
796 propertyValue.Get( mark );
797 mark = MapValuePercentage( mark );
799 if( fabsf( mark - value ) < MARK_TOLERANCE )
820 bool Slider::HideValueView()
824 mValueDisplay.SetVisible( false );
830 void Slider::SetLowerBound( float bound )
833 DisplayValue( GetValue(), false );
836 float Slider::GetLowerBound() const
841 void Slider::SetUpperBound( float bound )
844 DisplayValue( GetValue(), false );
847 float Slider::GetUpperBound() const
852 void Slider::SetValue( float value )
855 DisplayValue( mValue, true );
858 float Slider::GetValue() const
863 void Slider::SetBackingRegion( const Vector2& region )
865 mBackingRegion = region;
869 mBacking.SetSize( mBackingRegion );
872 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
874 mDomain = CalcDomain( mBackingRegion );
876 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
879 const Vector2& Slider::GetBackingRegion() const
881 return mBackingRegion;
884 void Slider::SetHandleRegion( const Vector2& region )
886 mHandleRegionSize = region;
888 ResizeHandleRegion( mHandleRegionSize );
890 Vector2 hitRegion = GetHitRegion();
891 hitRegion.x += mHandleRegionSize.x;
892 SetHitRegion( hitRegion );
895 const Vector2& Slider::GetHandleRegion() const
897 return mHandleRegionSize;
900 void Slider::SetDisableColor( const Vector4& color )
902 mDisableColor = color;
907 Vector4 Slider::GetDisableColor() const
909 return mDisableColor;
912 Vector4 Slider::GetPopupTextColor() const
914 return mPopupTextColor;
917 void Slider::SetValuePrecision( int precision )
919 mValuePrecision = precision;
922 int Slider::GetValuePrecision() const
924 return mValuePrecision;
927 void Slider::SetShowPopup( bool showPopup )
929 mShowPopup = showPopup;
942 bool Slider::GetShowPopup() const
947 void Slider::SetShowValue( bool showValue )
949 mShowValue = showValue;
953 CreateHandleValueDisplay();
957 DestroyHandleValueDisplay();
961 bool Slider::GetShowValue() const
966 void Slider::SetEnabled( bool enabled )
980 bool Slider::IsEnabled() const
982 return mState != DISABLED;
985 void Slider::SetMarkTolerance( float tolerance )
987 mMarkTolerance = tolerance;
990 float Slider::GetMarkTolerance() const
992 return mMarkTolerance;
995 // Static class method to support script connecting signals
996 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
998 Dali::BaseHandle handle( object );
1000 bool connected = true;
1001 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1003 if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
1005 slider.ValueChangedSignal().Connect( tracker, functor );
1007 else if( 0 == strcmp( signalName.c_str(), SIGNAL_MARK ) )
1009 slider.MarkSignal().Connect( tracker, functor );
1013 // signalName does not match any signal
1020 void Slider::DisplayPopup( float value )
1024 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1026 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1030 Slider& sliderImpl( GetImpl( slider ) );
1032 switch ( propertyIndex )
1034 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1036 sliderImpl.SetLowerBound( value.Get< float >() );
1040 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1042 sliderImpl.SetUpperBound( value.Get< float >() );
1046 case Toolkit::Slider::VALUE_PROPERTY:
1048 sliderImpl.SetValue( value.Get< float >() );
1052 case Toolkit::Slider::HIT_REGION_PROPERTY:
1054 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1058 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1060 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1064 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1066 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1070 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1072 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1076 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1078 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1082 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1084 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1088 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1090 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1094 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1096 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1100 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1102 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1106 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1108 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1112 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1114 sliderImpl.SetValuePrecision( value.Get< int >() );
1118 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1120 sliderImpl.SetShowPopup( value.Get< bool >() );
1124 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1126 sliderImpl.SetShowValue( value.Get< bool >() );
1130 case Toolkit::Slider::ENABLED_PROPERTY:
1132 sliderImpl.SetEnabled( value.Get< bool >() );
1136 case Toolkit::Slider::MARKS_PROPERTY:
1138 sliderImpl.SetMarks( value.Get< Property::Array >() );
1142 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1144 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1148 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1150 sliderImpl.SetMarkTolerance( value.Get< float >() );
1157 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1159 Property::Value value;
1161 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1165 Slider& sliderImpl( GetImpl( slider ) );
1167 switch ( propertyIndex )
1169 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1171 value = sliderImpl.GetLowerBound();
1175 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1177 value = sliderImpl.GetUpperBound();
1181 case Toolkit::Slider::VALUE_PROPERTY:
1183 value = sliderImpl.GetValue();
1187 case Toolkit::Slider::HIT_REGION_PROPERTY:
1189 value = sliderImpl.GetHitRegion();
1193 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1195 value = sliderImpl.GetBackingRegion();
1199 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1201 value = sliderImpl.GetHandleRegion();
1205 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1207 value = sliderImpl.GetBackingImageName();
1211 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1213 value = sliderImpl.GetHandleImageName();
1217 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1219 value = sliderImpl.GetProgressImageName();
1223 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1225 value = sliderImpl.GetPopupImageName();
1229 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1231 value = sliderImpl.GetPopupArrowImageName();
1235 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1237 value = sliderImpl.GetDisableColor();
1241 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1243 value = sliderImpl.GetPopupTextColor();
1247 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1249 value = sliderImpl.GetValuePrecision();
1253 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1255 value = sliderImpl.GetShowPopup();
1259 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1261 value = sliderImpl.GetShowValue();
1265 case Toolkit::Slider::ENABLED_PROPERTY:
1267 value = sliderImpl.IsEnabled();
1271 case Toolkit::Slider::MARKS_PROPERTY:
1273 // TODO: Need to be able to return a PropertyArray
1274 // value = sliderImpl.GetMarks();
1278 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1280 value = sliderImpl.GetSnapToMarks();
1284 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1286 value = sliderImpl.GetMarkTolerance();
1295 } // namespace Internal
1297 } // namespace Toolkit