2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
17 #include <dali-toolkit/internal/controls/slider/slider-impl.h>
18 #include <dali-toolkit/public-api/controls/control-impl.h>
32 const Property::Index Slider::LOWER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX;
33 const Property::Index Slider::UPPER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 1;
35 const Property::Index Slider::VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 2;
36 const Property::Index Slider::HIT_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 3;
37 const Property::Index Slider::BACKING_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 4;
38 const Property::Index Slider::HANDLE_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 5;
40 const Property::Index Slider::BACKING_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 6;
41 const Property::Index Slider::HANDLE_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 7;
42 const Property::Index Slider::PROGRESS_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 8;
43 const Property::Index Slider::POPUP_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 9;
44 const Property::Index Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 10;
46 const Property::Index Slider::DISABLE_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 11;
47 const Property::Index Slider::POPUP_TEXT_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 12;
49 const Property::Index Slider::VALUE_PRECISION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 13;
51 const Property::Index Slider::SHOW_POPUP_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 14;
52 const Property::Index Slider::SHOW_VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 15;
54 const Property::Index Slider::ENABLED_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 16;
56 const Property::Index Slider::MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 17;
57 const Property::Index Slider::SNAP_TO_MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 18;
58 const Property::Index Slider::MARK_TOLERANCE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 19;
65 const float BACKING_Z = -0.1f;
66 const float PROGRESS_Z = 0.1f;
67 const float HANDLE_Z = 1.0f;
68 const float VALUE_TEXT_INCREMENT = 0.01f;
69 const float HANDLE_VALUE_DISPLAY_TEXT_Z = HANDLE_Z + VALUE_TEXT_INCREMENT;
70 const float VALUE_DISPLAY_TEXT_Z = VALUE_TEXT_INCREMENT + VALUE_TEXT_INCREMENT; // Put above HANDLE_VALUE_DISPLAY_TEXT_Z (parented to handle)
72 const float MARK_SNAP_TOLERANCE = 0.05f; // 5% of slider width
74 const int VALUE_VIEW_SHOW_DURATION = 1000; // millisec
75 const int VALUE_VIEW_SHOW_DURATION_LONG = 2000; // millisec
77 const float VALUE_VERTICAL_OFFSET = 48.0f;
79 const float DEFAULT_WIDTH = 0.0f;
80 const float DEFAULT_HEIGHT = 27.0f;
81 const float DEFAULT_HIT_HEIGHT = 72.0f;
82 const float DEFAULT_HANDLE_HEIGHT = DEFAULT_HIT_HEIGHT;
84 const char* SKINNED_BACKING_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin.9.png";
85 const char* SKINNED_HANDLE_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-handle.png";;
86 const char* SKINNED_PROGRESS_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-progress.9.png";
87 const char* SKINNED_POPUP_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup.9.png";
88 const char* SKINNED_POPUP_ARROW_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup-arrow.png";
90 const Vector2 DEFAULT_HIT_REGION( DEFAULT_WIDTH, DEFAULT_HIT_HEIGHT );
91 const Vector2 DEFAULT_BACKING_REGION( DEFAULT_WIDTH, DEFAULT_HEIGHT );
92 const Vector2 DEFAULT_HANDLE_REGION( DEFAULT_HANDLE_HEIGHT, DEFAULT_HANDLE_HEIGHT );
94 const Vector4 DEFAULT_DISABLE_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
95 const Vector4 DEFAULT_POPUP_TEXT_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
97 const float VALUE_POPUP_MARGIN = 10.0f;
98 const float VALUE_POPUP_HEIGHT = 81.0f;
99 const float VALUE_POPUP_MIN_WIDTH = 54.0f;
100 const Vector2 VALUE_POPUP_ARROW_SIZE( 18.0f, 18.0f );
102 const float DEFAULT_LOWER_BOUND = 0.0f;
103 const float DEFAULT_UPPER_BOUND = 1.0f;
104 const float DEFAULT_VALUE = 0.0f;
105 const int DEFAULT_VALUE_PRECISION = 0;
106 const bool DEFAULT_SHOW_POPUP = false;
107 const bool DEFAULT_SHOW_VALUE = true;
108 const bool DEFAULT_ENABLED = true;
109 const bool DEFAULT_SNAP_TO_MARKS = false;
113 return Dali::Toolkit::Slider::New();
116 TypeRegistration typeRegistration( typeid(Dali::Toolkit::Slider), typeid(Dali::Toolkit::Control), Create );
118 SignalConnectorType signalConnector1( typeRegistration, Toolkit::Slider::SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
119 SignalConnectorType signalConnector2( typeRegistration, Toolkit::Slider::SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
121 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
122 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
123 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
125 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
126 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
127 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
129 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
130 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
131 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
132 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
133 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
135 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
136 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
138 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
140 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
141 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
143 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
145 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
146 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
147 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
151 ///////////////////////////////////////////////////////////////////////////////////////////////////
153 ///////////////////////////////////////////////////////////////////////////////////////////////////
155 Dali::Toolkit::Slider Slider::New()
157 // Create the implementation
158 SliderPtr slider( new Slider() );
160 // Pass ownership to CustomActor via derived handle
161 Dali::Toolkit::Slider handle( *slider );
163 // Second-phase init of the implementation
164 // This can only be done after the CustomActor connection has been made...
165 slider->Initialize();
173 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
174 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
175 mHitRegion( 0.0f, 0.0f ),
176 mBackingRegion( 0.0f, 0.0f ),
177 mHandleRegionSize( 0.0f, 0.0f ),
181 mMarkTolerance( 0.0f ),
182 mValuePrecision( 0 ),
185 mSnapToMarks( false )
193 void Slider::OnInitialize()
201 SetHitRegion( DEFAULT_HIT_REGION );
202 SetBackingRegion( DEFAULT_BACKING_REGION );
203 SetHandleRegion( DEFAULT_HANDLE_REGION );
205 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
206 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
207 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
208 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
209 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
211 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
213 SetShowPopup( DEFAULT_SHOW_POPUP );
214 SetShowValue( DEFAULT_SHOW_VALUE );
216 SetEnabled( DEFAULT_ENABLED );
217 SetDisableColor( DEFAULT_DISABLE_COLOR );
219 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
220 SetMarkTolerance( MARK_SNAP_TOLERANCE );
222 SetLowerBound( DEFAULT_LOWER_BOUND );
223 SetUpperBound( DEFAULT_UPPER_BOUND );
225 SetValuePrecision( DEFAULT_VALUE_PRECISION );
226 mValue = DEFAULT_VALUE;
227 DisplayValue( mValue, false ); // Run this last to display the correct value
229 // Size the Slider actor to a default
230 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
233 void Slider::OnControlSizeSet( const Vector3& size )
235 // Factor in handle overshoot into size of backing
236 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
237 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
240 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
242 if( mState != DISABLED )
244 TouchPoint::State touchState = event.GetPoint(0).state;
246 if( touchState == TouchPoint::Down )
250 float percentage = MapPercentage( event.GetPoint(0).local );
251 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
253 DisplayPopup( value );
255 else if( touchState == TouchPoint::Up)
257 if( mState == PRESSED )
260 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
268 void Slider::OnPan( Actor actor, PanGesture gesture )
270 // gesture.position is in local actor coordinates
271 if( mState != DISABLED )
273 switch( gesture.state )
275 case Gesture::Continuing:
277 if( mState == PRESSED )
279 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
281 DisplayPopup( value );
285 case Gesture::Finished:
287 if( mState == PRESSED )
289 if( GetSnapToMarks() )
291 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
293 DisplayPopup( value );
295 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
309 float Slider::HitSpaceToDomain( float x )
311 float halfRegionWidth = GetHitRegion().x * 0.5f;
312 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
313 float endDiff = halfRegionWidth - halfDomainWidth;
318 float Slider::MapPercentage( const Vector2& point )
320 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
323 float Slider::MapValuePercentage( float value )
325 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
328 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
330 return lowerBound + percent * ( upperBound - lowerBound );
333 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
335 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
338 void Slider::DisplayValue( float value, bool raiseSignals )
340 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
342 float percent = MapValuePercentage( clampledValue );
344 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
346 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
351 if( clampledValue > 0.0f )
353 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
354 mProgress.SetSize( x, GetBackingRegion().y );
358 mProgress.SetVisible( false );
365 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
366 mValueChangedSignal.Emit( self, clampledValue );
369 if( MarkReached( percent, markIndex ) )
371 mMarkSignal.Emit( self, markIndex );
375 if( mHandleValueTextView )
377 std::stringstream ss;
378 ss.precision( GetValuePrecision() );
379 ss << fixed << clampledValue;
380 mHandleValueTextView.SetText( ss.str() );
384 void Slider::SetMarks( const MarkList& marks )
387 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
389 const Property::Value& propertyValue = *it;
390 propertyValue.Get( value );
392 mMarks.push_back( value );
396 const Slider::MarkList& Slider::GetMarks() const
401 void Slider::SetSnapToMarks( bool snap )
406 bool Slider::GetSnapToMarks() const
411 Actor Slider::CreateHitRegion()
413 Actor hitRegion = Actor::New();
414 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
415 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
416 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
421 ImageActor Slider::CreateBacking()
423 ImageActor backing = ImageActor::New();
424 backing.SetParentOrigin( ParentOrigin::CENTER );
425 backing.SetAnchorPoint( AnchorPoint::CENTER );
426 backing.SetZ( BACKING_Z );
431 void Slider::SetBackingImageName( const std::string& imageName )
433 if( mBacking && imageName != String::EMPTY )
435 Image image = Image::New( imageName );
436 mBacking.SetImage( image );
440 std::string Slider::GetBackingImageName()
444 return mBacking.GetImage().GetFilename();
447 return std::string( "" );
450 ImageActor Slider::CreateProgress()
452 ImageActor progress = ImageActor::New();
453 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
454 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
455 progress.SetZ( PROGRESS_Z );
460 void Slider::SetProgressImageName( const std::string& imageName )
462 if( mProgress && imageName != String::EMPTY )
464 Image image = Image::New( imageName );
465 mProgress.SetImage( image );
469 std::string Slider::GetProgressImageName()
473 return mProgress.GetImage().GetFilename();
476 return std::string( "" );
479 void Slider::SetPopupImageName( const std::string& imageName )
481 mPopupImageName = imageName;
484 std::string Slider::GetPopupImageName()
486 return mPopupImageName;
489 void Slider::CreatePopupImage( const std::string& imageName )
491 if( mPopup && imageName != String::EMPTY )
493 Image image = Image::New( imageName );
494 mPopup.SetImage( image );
498 void Slider::SetPopupArrowImageName( const std::string& imageName )
500 mPopupArrowImageName = imageName;
503 std::string Slider::GetPopupArrowImageName()
505 return mPopupArrowImageName;
508 void Slider::CreatePopupArrowImage( const std::string& imageName )
510 if( mPopupArrow && imageName != String::EMPTY )
512 Image image = Image::New( imageName );
513 mPopupArrow.SetImage( image );
517 void Slider::ResizeProgressRegion( const Vector2& region )
521 mProgress.SetSize( region );
525 ImageActor Slider::CreateHandle()
527 ImageActor handle = ImageActor::New();
528 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
529 handle.SetAnchorPoint( AnchorPoint::CENTER );
530 handle.SetZ( HANDLE_Z );
535 ImageActor Slider::CreatePopupArrow()
537 ImageActor arrow = ImageActor::New();
538 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
539 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
540 arrow.SetZ( HANDLE_Z );
545 Toolkit::TextView Slider::CreatePopupText()
547 Toolkit::TextView textView = Toolkit::TextView::New();
548 textView.SetParentOrigin( ParentOrigin::CENTER );
549 textView.SetAnchorPoint( AnchorPoint::CENTER );
550 textView.SetSizePolicy( Toolkit::Control::Flexible, Toolkit::Control::Flexible );
551 textView.SetZ( VALUE_DISPLAY_TEXT_Z );
555 ImageActor Slider::CreatePopup()
557 ImageActor popup = ImageActor::New();
558 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
559 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
561 mValueTextView = CreatePopupText();
562 popup.Add( mValueTextView );
567 void Slider::SetHandleImageName( const std::string& imageName )
569 if( mHandle && imageName != String::EMPTY )
571 Image image = Image::New( imageName );
572 mHandle.SetImage( image );
576 std::string Slider::GetHandleImageName()
580 return mHandle.GetImage().GetFilename();
583 return std::string( "" );
586 void Slider::ResizeHandleRegion( const Vector2& region )
590 mHandle.SetSize( region );
594 void Slider::CreateHandleValueDisplay()
596 if( mHandle && !mHandleValueTextView )
598 mHandleValueTextView = Toolkit::TextView::New();
599 mHandleValueTextView.SetParentOrigin( ParentOrigin::CENTER );
600 mHandleValueTextView.SetAnchorPoint( AnchorPoint::CENTER );
601 mHandleValueTextView.SetSize( GetHandleRegion() );
602 mHandleValueTextView.SetZ( HANDLE_VALUE_DISPLAY_TEXT_Z );
603 mHandle.Add( mHandleValueTextView );
607 void Slider::DestroyHandleValueDisplay()
609 if(mHandleValueTextView)
611 mHandleValueTextView.Unparent();
612 mHandleValueTextView.Reset();
616 void Slider::SetPopupTextColor( const Vector4& color )
618 mPopupTextColor = color;
621 Actor Slider::CreateValueDisplay()
623 Actor popup = Actor::New();
624 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
625 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
627 mPopupArrow = CreatePopupArrow();
628 popup.Add( mPopupArrow );
630 mPopup = CreatePopup();
631 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
632 mPopupArrow.Add( mPopup );
637 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
639 return mValueChangedSignal;
642 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
644 return mSlidingFinishedSignal;
647 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
652 void Slider::UpdateSkin()
658 mBacking.SetColor( Color::WHITE );
659 mHandle.SetColor( Color::WHITE );
660 mProgress.SetColor( Color::WHITE );
665 Vector4 disableColor = GetDisableColor();
666 mBacking.SetColor( disableColor );
667 mHandle.SetColor( disableColor );
668 mProgress.SetColor( disableColor );
682 void Slider::CreateChildren()
687 mHitArea = CreateHitRegion();
688 mPanDetector = PanGestureDetector::New();
689 mPanDetector.Attach( mHitArea );
690 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
691 self.Add( mHitArea );
694 mBacking = CreateBacking();
695 self.Add( mBacking );
698 mProgress = CreateProgress();
699 mBacking.Add( mProgress );
702 mHandle = CreateHandle();
703 mBacking.Add( mHandle );
706 void Slider::SetHitRegion( const Vector2& size )
712 mHitArea.SetSize( mHitRegion );
716 const Vector2& Slider::GetHitRegion() const
721 void Slider::AddPopup()
725 mValueDisplay = CreateValueDisplay();
726 mValueDisplay.SetVisible( false );
727 mHandle.Add( mValueDisplay );
729 CreatePopupImage( GetPopupImageName() );
730 CreatePopupArrowImage( GetPopupArrowImageName() );
732 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
733 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
737 void Slider::RemovePopup()
744 mPopupArrow.Unparent();
747 mValueDisplay.Unparent();
748 mValueDisplay.Reset();
750 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
756 float Slider::MarkFilter( float value )
758 const float MARK_TOLERANCE = GetMarkTolerance();
761 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
763 const Property::Value& propertyValue = *it;
764 propertyValue.Get( mark );
765 mark = MapValuePercentage( mark );
767 // If close to a mark, return the mark
768 if( fabsf( mark - value ) < MARK_TOLERANCE )
777 float Slider::SnapToMark( float value )
779 float closestMark = value;
780 float closestDist = std::numeric_limits<float>::max();
783 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
785 const Property::Value& propertyValue = *it;
786 propertyValue.Get( mark );
787 mark = MapValuePercentage( mark );
789 float dist = fabsf( mark - value );
790 if( dist < closestDist )
800 bool Slider::MarkReached( float value, int& outIndex )
802 const float MARK_TOLERANCE = GetMarkTolerance();
806 tail = mMarks.size() - 1;
810 while( head <= tail )
812 current = head + ( tail - head ) / 2;
814 const Property::Value& propertyValue = mMarks[ current ];
815 propertyValue.Get( mark );
816 mark = MapValuePercentage( mark );
818 if( fabsf( mark - value ) < MARK_TOLERANCE )
839 bool Slider::HideValueView()
843 mValueDisplay.SetVisible( false );
849 void Slider::SetLowerBound( float bound )
852 DisplayValue( GetValue(), false );
855 float Slider::GetLowerBound() const
860 void Slider::SetUpperBound( float bound )
863 DisplayValue( GetValue(), false );
866 float Slider::GetUpperBound() const
871 void Slider::SetValue( float value )
874 DisplayValue( mValue, true );
877 float Slider::GetValue() const
882 void Slider::SetBackingRegion( const Vector2& region )
884 mBackingRegion = region;
888 mBacking.SetSize( mBackingRegion );
891 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
893 mDomain = CalcDomain( mBackingRegion );
895 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
898 const Vector2& Slider::GetBackingRegion() const
900 return mBackingRegion;
903 void Slider::SetHandleRegion( const Vector2& region )
905 mHandleRegionSize = region;
907 ResizeHandleRegion( mHandleRegionSize );
909 Vector2 hitRegion = GetHitRegion();
910 hitRegion.x += mHandleRegionSize.x;
911 SetHitRegion( hitRegion );
914 const Vector2& Slider::GetHandleRegion() const
916 return mHandleRegionSize;
919 void Slider::SetDisableColor( const Vector4& color )
921 mDisableColor = color;
926 Vector4 Slider::GetDisableColor() const
928 return mDisableColor;
931 Vector4 Slider::GetPopupTextColor() const
933 return mPopupTextColor;
936 void Slider::SetValuePrecision( int precision )
938 mValuePrecision = precision;
941 int Slider::GetValuePrecision() const
943 return mValuePrecision;
946 void Slider::SetShowPopup( bool showPopup )
948 mShowPopup = showPopup;
961 bool Slider::GetShowPopup() const
966 void Slider::SetShowValue( bool showValue )
968 mShowValue = showValue;
972 CreateHandleValueDisplay();
976 DestroyHandleValueDisplay();
980 bool Slider::GetShowValue() const
985 void Slider::SetEnabled( bool enabled )
999 bool Slider::IsEnabled() const
1001 return mState != DISABLED;
1004 void Slider::SetMarkTolerance( float tolerance )
1006 mMarkTolerance = tolerance;
1009 float Slider::GetMarkTolerance() const
1011 return mMarkTolerance;
1014 // static class method to support script connecting signals
1016 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
1018 Dali::BaseHandle handle( object );
1020 bool connected = true;
1021 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1023 if( signalName == Dali::Toolkit::Slider::SIGNAL_VALUE_CHANGED )
1025 slider.ValueChangedSignal().Connect( tracker, functor );
1027 else if( signalName == Dali::Toolkit::Slider::SIGNAL_MARK )
1029 slider.MarkSignal().Connect( tracker, functor );
1033 // signalName does not match any signal
1040 void Slider::DisplayPopup( float value )
1042 // Value displayDoConnectSignal
1043 if( mValueTextView )
1045 std::stringstream ss;
1046 ss.precision( GetValuePrecision() );
1047 ss << fixed << value;
1048 mValueTextView.SetText( ss.str() );
1050 style.SetTextColor( GetPopupTextColor() );
1051 mValueTextView.SetStyleToCurrentText( style, TextStyle::COLOR);
1055 Font font = Font::New();
1056 float popupWidth = font.MeasureText( ss.str() ).x + VALUE_POPUP_MARGIN * 2.0f;
1057 if( popupWidth < VALUE_POPUP_MIN_WIDTH )
1059 popupWidth = VALUE_POPUP_MIN_WIDTH;
1062 mPopup.SetSize( popupWidth, VALUE_POPUP_HEIGHT );
1063 mValueDisplay.SetVisible( true );
1065 mValueTimer.SetInterval( VALUE_VIEW_SHOW_DURATION );
1070 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1072 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1076 Slider& sliderImpl( GetImpl( slider ) );
1078 switch ( propertyIndex )
1080 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1082 sliderImpl.SetLowerBound( value.Get< float >() );
1086 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1088 sliderImpl.SetUpperBound( value.Get< float >() );
1092 case Toolkit::Slider::VALUE_PROPERTY:
1094 sliderImpl.SetValue( value.Get< float >() );
1098 case Toolkit::Slider::HIT_REGION_PROPERTY:
1100 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1104 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1106 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1110 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1112 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1116 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1118 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1122 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1124 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1128 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1130 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1134 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1136 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1140 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1142 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1146 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1148 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1152 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1154 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1158 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1160 sliderImpl.SetValuePrecision( value.Get< int >() );
1164 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1166 sliderImpl.SetShowPopup( value.Get< bool >() );
1170 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1172 sliderImpl.SetShowValue( value.Get< bool >() );
1176 case Toolkit::Slider::ENABLED_PROPERTY:
1178 sliderImpl.SetEnabled( value.Get< bool >() );
1182 case Toolkit::Slider::MARKS_PROPERTY:
1184 sliderImpl.SetMarks( value.Get< Property::Array >() );
1188 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1190 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1194 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1196 sliderImpl.SetMarkTolerance( value.Get< float >() );
1203 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1205 Property::Value value;
1207 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1211 Slider& sliderImpl( GetImpl( slider ) );
1213 switch ( propertyIndex )
1215 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1217 value = sliderImpl.GetLowerBound();
1221 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1223 value = sliderImpl.GetUpperBound();
1227 case Toolkit::Slider::VALUE_PROPERTY:
1229 value = sliderImpl.GetValue();
1233 case Toolkit::Slider::HIT_REGION_PROPERTY:
1235 value = sliderImpl.GetHitRegion();
1239 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1241 value = sliderImpl.GetBackingRegion();
1245 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1247 value = sliderImpl.GetHandleRegion();
1251 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1253 value = sliderImpl.GetBackingImageName();
1257 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1259 value = sliderImpl.GetHandleImageName();
1263 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1265 value = sliderImpl.GetProgressImageName();
1269 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1271 value = sliderImpl.GetPopupImageName();
1275 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1277 value = sliderImpl.GetPopupArrowImageName();
1281 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1283 value = sliderImpl.GetDisableColor();
1287 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1289 value = sliderImpl.GetPopupTextColor();
1293 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1295 value = sliderImpl.GetValuePrecision();
1299 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1301 value = sliderImpl.GetShowPopup();
1305 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1307 value = sliderImpl.GetShowValue();
1311 case Toolkit::Slider::ENABLED_PROPERTY:
1313 value = sliderImpl.IsEnabled();
1317 case Toolkit::Slider::MARKS_PROPERTY:
1319 // TODO: Need to be able to return a PropertyArray
1320 // value = sliderImpl.GetMarks();
1324 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1326 value = sliderImpl.GetSnapToMarks();
1330 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1332 value = sliderImpl.GetMarkTolerance();
1341 } // namespace Internal
1343 } // namespace Toolkit