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>
22 #include <dali/public-api/events/touch-event.h>
23 #include <dali/public-api/object/type-registry.h>
26 #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 return Dali::Toolkit::Slider::New();
123 TypeRegistration typeRegistration( typeid(Dali::Toolkit::Slider), typeid(Dali::Toolkit::Control), Create );
125 SignalConnectorType signalConnector1( typeRegistration, Toolkit::Slider::SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
126 SignalConnectorType signalConnector2( typeRegistration, Toolkit::Slider::SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
128 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
129 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
130 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
132 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
133 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
134 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
136 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
137 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
138 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
139 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
140 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
142 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
143 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
145 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
147 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
148 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
150 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
152 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
153 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
154 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
158 ///////////////////////////////////////////////////////////////////////////////////////////////////
160 ///////////////////////////////////////////////////////////////////////////////////////////////////
162 Dali::Toolkit::Slider Slider::New()
164 // Create the implementation
165 SliderPtr slider( new Slider() );
167 // Pass ownership to CustomActor via derived handle
168 Dali::Toolkit::Slider handle( *slider );
170 // Second-phase init of the implementation
171 // This can only be done after the CustomActor connection has been made...
172 slider->Initialize();
178 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
180 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
181 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
182 mHitRegion( 0.0f, 0.0f ),
183 mBackingRegion( 0.0f, 0.0f ),
184 mHandleRegionSize( 0.0f, 0.0f ),
188 mMarkTolerance( 0.0f ),
189 mValuePrecision( 0 ),
192 mSnapToMarks( false )
200 void Slider::OnInitialize()
208 SetHitRegion( DEFAULT_HIT_REGION );
209 SetBackingRegion( DEFAULT_BACKING_REGION );
210 SetHandleRegion( DEFAULT_HANDLE_REGION );
212 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
213 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
214 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
215 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
216 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
218 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
220 SetShowPopup( DEFAULT_SHOW_POPUP );
221 SetShowValue( DEFAULT_SHOW_VALUE );
223 SetEnabled( DEFAULT_ENABLED );
224 SetDisableColor( DEFAULT_DISABLE_COLOR );
226 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
227 SetMarkTolerance( MARK_SNAP_TOLERANCE );
229 SetLowerBound( DEFAULT_LOWER_BOUND );
230 SetUpperBound( DEFAULT_UPPER_BOUND );
232 SetValuePrecision( DEFAULT_VALUE_PRECISION );
233 mValue = DEFAULT_VALUE;
234 DisplayValue( mValue, false ); // Run this last to display the correct value
236 // Size the Slider actor to a default
237 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
240 void Slider::OnControlSizeSet( const Vector3& size )
242 // Factor in handle overshoot into size of backing
243 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
244 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
247 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
249 if( mState != DISABLED )
251 TouchPoint::State touchState = event.GetPoint(0).state;
253 if( touchState == TouchPoint::Down )
257 float percentage = MapPercentage( event.GetPoint(0).local );
258 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
260 DisplayPopup( value );
262 else if( touchState == TouchPoint::Up)
264 if( mState == PRESSED )
267 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
275 void Slider::OnPan( Actor actor, const PanGesture& gesture )
277 // gesture.position is in local actor coordinates
278 if( mState != DISABLED )
280 switch( gesture.state )
282 case Gesture::Continuing:
284 if( mState == PRESSED )
286 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
288 DisplayPopup( value );
292 case Gesture::Finished:
294 if( mState == PRESSED )
296 if( GetSnapToMarks() )
298 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
300 DisplayPopup( value );
302 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
316 float Slider::HitSpaceToDomain( float x )
318 float halfRegionWidth = GetHitRegion().x * 0.5f;
319 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
320 float endDiff = halfRegionWidth - halfDomainWidth;
325 float Slider::MapPercentage( const Vector2& point )
327 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
330 float Slider::MapValuePercentage( float value )
332 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
335 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
337 return lowerBound + percent * ( upperBound - lowerBound );
340 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
342 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
345 void Slider::DisplayValue( float value, bool raiseSignals )
347 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
349 float percent = MapValuePercentage( clampledValue );
351 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
353 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
358 if( clampledValue > 0.0f )
360 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
361 mProgress.SetSize( x, GetBackingRegion().y );
365 mProgress.SetVisible( false );
372 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
373 mValueChangedSignal.Emit( self, clampledValue );
376 if( MarkReached( percent, markIndex ) )
378 mMarkSignal.Emit( self, markIndex );
383 void Slider::SetMarks( const MarkList& marks )
386 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
388 const Property::Value& propertyValue = *it;
389 propertyValue.Get( value );
391 mMarks.push_back( value );
395 const Slider::MarkList& Slider::GetMarks() const
400 void Slider::SetSnapToMarks( bool snap )
405 bool Slider::GetSnapToMarks() const
410 Actor Slider::CreateHitRegion()
412 Actor hitRegion = Actor::New();
413 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
414 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
415 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
420 ImageActor Slider::CreateBacking()
422 ImageActor backing = ImageActor::New();
423 backing.SetParentOrigin( ParentOrigin::CENTER );
424 backing.SetAnchorPoint( AnchorPoint::CENTER );
425 backing.SetZ( BACKING_Z );
430 void Slider::SetBackingImageName( const std::string& imageName )
432 if( mBacking && imageName != String::EMPTY )
434 Image image = Image::New( imageName );
435 mBacking.SetImage( image );
439 std::string Slider::GetBackingImageName()
443 return mBacking.GetImage().GetFilename();
446 return std::string( "" );
449 ImageActor Slider::CreateProgress()
451 ImageActor progress = ImageActor::New();
452 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
453 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
454 progress.SetZ( PROGRESS_Z );
459 void Slider::SetProgressImageName( const std::string& imageName )
461 if( mProgress && imageName != String::EMPTY )
463 Image image = Image::New( imageName );
464 mProgress.SetImage( image );
468 std::string Slider::GetProgressImageName()
472 return mProgress.GetImage().GetFilename();
475 return std::string( "" );
478 void Slider::SetPopupImageName( const std::string& imageName )
480 mPopupImageName = imageName;
483 std::string Slider::GetPopupImageName()
485 return mPopupImageName;
488 void Slider::CreatePopupImage( const std::string& imageName )
490 if( mPopup && imageName != String::EMPTY )
492 Image image = Image::New( imageName );
493 mPopup.SetImage( image );
497 void Slider::SetPopupArrowImageName( const std::string& imageName )
499 mPopupArrowImageName = imageName;
502 std::string Slider::GetPopupArrowImageName()
504 return mPopupArrowImageName;
507 void Slider::CreatePopupArrowImage( const std::string& imageName )
509 if( mPopupArrow && imageName != String::EMPTY )
511 Image image = Image::New( imageName );
512 mPopupArrow.SetImage( image );
516 void Slider::ResizeProgressRegion( const Vector2& region )
520 mProgress.SetSize( region );
524 ImageActor Slider::CreateHandle()
526 ImageActor handle = ImageActor::New();
527 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
528 handle.SetAnchorPoint( AnchorPoint::CENTER );
529 handle.SetZ( HANDLE_Z );
534 ImageActor Slider::CreatePopupArrow()
536 ImageActor arrow = ImageActor::New();
537 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
538 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
539 arrow.SetZ( HANDLE_Z );
544 //Toolkit::TextView Slider::CreatePopupText()
548 ImageActor Slider::CreatePopup()
550 ImageActor popup = ImageActor::New();
551 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
552 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
557 void Slider::SetHandleImageName( const std::string& imageName )
559 if( mHandle && imageName != String::EMPTY )
561 Image image = Image::New( imageName );
562 mHandle.SetImage( image );
566 std::string Slider::GetHandleImageName()
570 return mHandle.GetImage().GetFilename();
573 return std::string( "" );
576 void Slider::ResizeHandleRegion( const Vector2& region )
580 mHandle.SetSize( region );
584 void Slider::CreateHandleValueDisplay()
588 void Slider::DestroyHandleValueDisplay()
592 void Slider::SetPopupTextColor( const Vector4& color )
594 mPopupTextColor = color;
597 Actor Slider::CreateValueDisplay()
599 Actor popup = Actor::New();
600 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
601 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
603 mPopupArrow = CreatePopupArrow();
604 popup.Add( mPopupArrow );
606 mPopup = CreatePopup();
607 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
608 mPopupArrow.Add( mPopup );
613 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
615 return mValueChangedSignal;
618 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
620 return mSlidingFinishedSignal;
623 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
628 void Slider::UpdateSkin()
634 mBacking.SetColor( Color::WHITE );
635 mHandle.SetColor( Color::WHITE );
636 mProgress.SetColor( Color::WHITE );
641 Vector4 disableColor = GetDisableColor();
642 mBacking.SetColor( disableColor );
643 mHandle.SetColor( disableColor );
644 mProgress.SetColor( disableColor );
658 void Slider::CreateChildren()
663 mHitArea = CreateHitRegion();
664 mPanDetector = PanGestureDetector::New();
665 mPanDetector.Attach( mHitArea );
666 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
667 self.Add( mHitArea );
670 mBacking = CreateBacking();
671 self.Add( mBacking );
674 mProgress = CreateProgress();
675 mBacking.Add( mProgress );
678 mHandle = CreateHandle();
679 mBacking.Add( mHandle );
682 void Slider::SetHitRegion( const Vector2& size )
688 mHitArea.SetSize( mHitRegion );
692 const Vector2& Slider::GetHitRegion() const
697 void Slider::AddPopup()
701 mValueDisplay = CreateValueDisplay();
702 mValueDisplay.SetVisible( false );
703 mHandle.Add( mValueDisplay );
705 CreatePopupImage( GetPopupImageName() );
706 CreatePopupArrowImage( GetPopupArrowImageName() );
708 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
709 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
713 void Slider::RemovePopup()
720 mPopupArrow.Unparent();
723 mValueDisplay.Unparent();
724 mValueDisplay.Reset();
726 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
732 float Slider::MarkFilter( float value )
734 const float MARK_TOLERANCE = GetMarkTolerance();
737 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
739 const Property::Value& propertyValue = *it;
740 propertyValue.Get( mark );
741 mark = MapValuePercentage( mark );
743 // If close to a mark, return the mark
744 if( fabsf( mark - value ) < MARK_TOLERANCE )
753 float Slider::SnapToMark( float value )
755 float closestMark = value;
756 float closestDist = std::numeric_limits<float>::max();
759 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
761 const Property::Value& propertyValue = *it;
762 propertyValue.Get( mark );
763 mark = MapValuePercentage( mark );
765 float dist = fabsf( mark - value );
766 if( dist < closestDist )
776 bool Slider::MarkReached( float value, int& outIndex )
778 const float MARK_TOLERANCE = GetMarkTolerance();
782 tail = mMarks.size() - 1;
786 while( head <= tail )
788 current = head + ( tail - head ) / 2;
790 const Property::Value& propertyValue = mMarks[ current ];
791 propertyValue.Get( mark );
792 mark = MapValuePercentage( mark );
794 if( fabsf( mark - value ) < MARK_TOLERANCE )
815 bool Slider::HideValueView()
819 mValueDisplay.SetVisible( false );
825 void Slider::SetLowerBound( float bound )
828 DisplayValue( GetValue(), false );
831 float Slider::GetLowerBound() const
836 void Slider::SetUpperBound( float bound )
839 DisplayValue( GetValue(), false );
842 float Slider::GetUpperBound() const
847 void Slider::SetValue( float value )
850 DisplayValue( mValue, true );
853 float Slider::GetValue() const
858 void Slider::SetBackingRegion( const Vector2& region )
860 mBackingRegion = region;
864 mBacking.SetSize( mBackingRegion );
867 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
869 mDomain = CalcDomain( mBackingRegion );
871 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
874 const Vector2& Slider::GetBackingRegion() const
876 return mBackingRegion;
879 void Slider::SetHandleRegion( const Vector2& region )
881 mHandleRegionSize = region;
883 ResizeHandleRegion( mHandleRegionSize );
885 Vector2 hitRegion = GetHitRegion();
886 hitRegion.x += mHandleRegionSize.x;
887 SetHitRegion( hitRegion );
890 const Vector2& Slider::GetHandleRegion() const
892 return mHandleRegionSize;
895 void Slider::SetDisableColor( const Vector4& color )
897 mDisableColor = color;
902 Vector4 Slider::GetDisableColor() const
904 return mDisableColor;
907 Vector4 Slider::GetPopupTextColor() const
909 return mPopupTextColor;
912 void Slider::SetValuePrecision( int precision )
914 mValuePrecision = precision;
917 int Slider::GetValuePrecision() const
919 return mValuePrecision;
922 void Slider::SetShowPopup( bool showPopup )
924 mShowPopup = showPopup;
937 bool Slider::GetShowPopup() const
942 void Slider::SetShowValue( bool showValue )
944 mShowValue = showValue;
948 CreateHandleValueDisplay();
952 DestroyHandleValueDisplay();
956 bool Slider::GetShowValue() const
961 void Slider::SetEnabled( bool enabled )
975 bool Slider::IsEnabled() const
977 return mState != DISABLED;
980 void Slider::SetMarkTolerance( float tolerance )
982 mMarkTolerance = tolerance;
985 float Slider::GetMarkTolerance() const
987 return mMarkTolerance;
990 // static class method to support script connecting signals
992 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
994 Dali::BaseHandle handle( object );
996 bool connected = true;
997 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
999 if( signalName == Dali::Toolkit::Slider::SIGNAL_VALUE_CHANGED )
1001 slider.ValueChangedSignal().Connect( tracker, functor );
1003 else if( signalName == Dali::Toolkit::Slider::SIGNAL_MARK )
1005 slider.MarkSignal().Connect( tracker, functor );
1009 // signalName does not match any signal
1016 void Slider::DisplayPopup( float value )
1020 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1022 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1026 Slider& sliderImpl( GetImpl( slider ) );
1028 switch ( propertyIndex )
1030 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1032 sliderImpl.SetLowerBound( value.Get< float >() );
1036 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1038 sliderImpl.SetUpperBound( value.Get< float >() );
1042 case Toolkit::Slider::VALUE_PROPERTY:
1044 sliderImpl.SetValue( value.Get< float >() );
1048 case Toolkit::Slider::HIT_REGION_PROPERTY:
1050 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1054 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1056 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1060 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1062 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1066 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1068 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1072 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1074 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1078 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1080 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1084 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1086 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1090 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1092 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1096 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1098 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1102 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1104 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1108 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1110 sliderImpl.SetValuePrecision( value.Get< int >() );
1114 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1116 sliderImpl.SetShowPopup( value.Get< bool >() );
1120 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1122 sliderImpl.SetShowValue( value.Get< bool >() );
1126 case Toolkit::Slider::ENABLED_PROPERTY:
1128 sliderImpl.SetEnabled( value.Get< bool >() );
1132 case Toolkit::Slider::MARKS_PROPERTY:
1134 sliderImpl.SetMarks( value.Get< Property::Array >() );
1138 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1140 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1144 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1146 sliderImpl.SetMarkTolerance( value.Get< float >() );
1153 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1155 Property::Value value;
1157 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1161 Slider& sliderImpl( GetImpl( slider ) );
1163 switch ( propertyIndex )
1165 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1167 value = sliderImpl.GetLowerBound();
1171 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1173 value = sliderImpl.GetUpperBound();
1177 case Toolkit::Slider::VALUE_PROPERTY:
1179 value = sliderImpl.GetValue();
1183 case Toolkit::Slider::HIT_REGION_PROPERTY:
1185 value = sliderImpl.GetHitRegion();
1189 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1191 value = sliderImpl.GetBackingRegion();
1195 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1197 value = sliderImpl.GetHandleRegion();
1201 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1203 value = sliderImpl.GetBackingImageName();
1207 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1209 value = sliderImpl.GetHandleImageName();
1213 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1215 value = sliderImpl.GetProgressImageName();
1219 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1221 value = sliderImpl.GetPopupImageName();
1225 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1227 value = sliderImpl.GetPopupArrowImageName();
1231 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1233 value = sliderImpl.GetDisableColor();
1237 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1239 value = sliderImpl.GetPopupTextColor();
1243 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1245 value = sliderImpl.GetValuePrecision();
1249 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1251 value = sliderImpl.GetShowPopup();
1255 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1257 value = sliderImpl.GetShowValue();
1261 case Toolkit::Slider::ENABLED_PROPERTY:
1263 value = sliderImpl.IsEnabled();
1267 case Toolkit::Slider::MARKS_PROPERTY:
1269 // TODO: Need to be able to return a PropertyArray
1270 // value = sliderImpl.GetMarks();
1274 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1276 value = sliderImpl.GetSnapToMarks();
1280 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1282 value = sliderImpl.GetMarkTolerance();
1291 } // namespace Internal
1293 } // namespace Toolkit