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>
27 #include <dali/public-api/images/resource-image.h>
40 const Property::Index Slider::LOWER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX;
41 const Property::Index Slider::UPPER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 1;
43 const Property::Index Slider::VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 2;
44 const Property::Index Slider::HIT_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 3;
45 const Property::Index Slider::BACKING_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 4;
46 const Property::Index Slider::HANDLE_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 5;
48 const Property::Index Slider::BACKING_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 6;
49 const Property::Index Slider::HANDLE_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 7;
50 const Property::Index Slider::PROGRESS_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 8;
51 const Property::Index Slider::POPUP_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 9;
52 const Property::Index Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 10;
54 const Property::Index Slider::DISABLE_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 11;
55 const Property::Index Slider::POPUP_TEXT_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 12;
57 const Property::Index Slider::VALUE_PRECISION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 13;
59 const Property::Index Slider::SHOW_POPUP_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 14;
60 const Property::Index Slider::SHOW_VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 15;
62 const Property::Index Slider::ENABLED_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 16;
64 const Property::Index Slider::MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 17;
65 const Property::Index Slider::SNAP_TO_MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 18;
66 const Property::Index Slider::MARK_TOLERANCE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 19;
73 const float BACKING_Z = -0.1f;
74 const float PROGRESS_Z = 0.1f;
75 const float HANDLE_Z = 1.0f;
76 const float VALUE_TEXT_INCREMENT = 0.01f;
77 const float HANDLE_VALUE_DISPLAY_TEXT_Z = HANDLE_Z + VALUE_TEXT_INCREMENT;
78 const float VALUE_DISPLAY_TEXT_Z = VALUE_TEXT_INCREMENT + VALUE_TEXT_INCREMENT; // Put above HANDLE_VALUE_DISPLAY_TEXT_Z (parented to handle)
80 const float MARK_SNAP_TOLERANCE = 0.05f; // 5% of slider width
82 const int VALUE_VIEW_SHOW_DURATION = 1000; // millisec
83 const int VALUE_VIEW_SHOW_DURATION_LONG = 2000; // millisec
85 const float VALUE_VERTICAL_OFFSET = 48.0f;
87 const float DEFAULT_WIDTH = 0.0f;
88 const float DEFAULT_HEIGHT = 27.0f;
89 const float DEFAULT_HIT_HEIGHT = 72.0f;
90 const float DEFAULT_HANDLE_HEIGHT = DEFAULT_HIT_HEIGHT;
92 const char* SKINNED_BACKING_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin.9.png";
93 const char* SKINNED_HANDLE_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-handle.png";;
94 const char* SKINNED_PROGRESS_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-progress.9.png";
95 const char* SKINNED_POPUP_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup.9.png";
96 const char* SKINNED_POPUP_ARROW_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup-arrow.png";
98 const Vector2 DEFAULT_HIT_REGION( DEFAULT_WIDTH, DEFAULT_HIT_HEIGHT );
99 const Vector2 DEFAULT_BACKING_REGION( DEFAULT_WIDTH, DEFAULT_HEIGHT );
100 const Vector2 DEFAULT_HANDLE_REGION( DEFAULT_HANDLE_HEIGHT, DEFAULT_HANDLE_HEIGHT );
102 const Vector4 DEFAULT_DISABLE_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
103 const Vector4 DEFAULT_POPUP_TEXT_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
105 const float VALUE_POPUP_MARGIN = 10.0f;
106 const float VALUE_POPUP_HEIGHT = 81.0f;
107 const float VALUE_POPUP_MIN_WIDTH = 54.0f;
108 const Vector2 VALUE_POPUP_ARROW_SIZE( 18.0f, 18.0f );
110 const float DEFAULT_LOWER_BOUND = 0.0f;
111 const float DEFAULT_UPPER_BOUND = 1.0f;
112 const float DEFAULT_VALUE = 0.0f;
113 const int DEFAULT_VALUE_PRECISION = 0;
114 const bool DEFAULT_SHOW_POPUP = false;
115 const bool DEFAULT_SHOW_VALUE = true;
116 const bool DEFAULT_ENABLED = true;
117 const bool DEFAULT_SNAP_TO_MARKS = false;
121 const char* const SIGNAL_VALUE_CHANGED = "value-changed";
122 const char* const SIGNAL_MARK = "mark";
126 return Dali::Toolkit::Slider::New();
129 TypeRegistration typeRegistration( typeid( Dali::Toolkit::Slider ), typeid( Dali::Toolkit::Control ), Create );
131 SignalConnectorType signalConnector1( typeRegistration, SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
132 SignalConnectorType signalConnector2( typeRegistration, SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
134 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
135 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
136 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
138 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
139 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
140 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
142 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
143 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
144 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
145 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
146 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
148 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
149 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
151 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
153 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
154 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
156 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
158 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
159 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
160 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
164 ///////////////////////////////////////////////////////////////////////////////////////////////////
166 ///////////////////////////////////////////////////////////////////////////////////////////////////
168 Dali::Toolkit::Slider Slider::New()
170 // Create the implementation
171 SliderPtr slider( new Slider() );
173 // Pass ownership to CustomActor via derived handle
174 Dali::Toolkit::Slider handle( *slider );
176 // Second-phase init of the implementation
177 // This can only be done after the CustomActor connection has been made...
178 slider->Initialize();
184 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
186 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
187 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
188 mHitRegion( 0.0f, 0.0f ),
189 mBackingRegion( 0.0f, 0.0f ),
190 mHandleRegionSize( 0.0f, 0.0f ),
194 mMarkTolerance( 0.0f ),
195 mValuePrecision( 0 ),
198 mSnapToMarks( false )
206 void Slider::OnInitialize()
214 SetHitRegion( DEFAULT_HIT_REGION );
215 SetBackingRegion( DEFAULT_BACKING_REGION );
216 SetHandleRegion( DEFAULT_HANDLE_REGION );
218 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
219 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
220 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
221 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
222 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
224 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
226 SetShowPopup( DEFAULT_SHOW_POPUP );
227 SetShowValue( DEFAULT_SHOW_VALUE );
229 SetEnabled( DEFAULT_ENABLED );
230 SetDisableColor( DEFAULT_DISABLE_COLOR );
232 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
233 SetMarkTolerance( MARK_SNAP_TOLERANCE );
235 SetLowerBound( DEFAULT_LOWER_BOUND );
236 SetUpperBound( DEFAULT_UPPER_BOUND );
238 SetValuePrecision( DEFAULT_VALUE_PRECISION );
239 mValue = DEFAULT_VALUE;
240 DisplayValue( mValue, false ); // Run this last to display the correct value
242 // Size the Slider actor to a default
243 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
246 void Slider::OnControlSizeSet( const Vector3& size )
248 // Factor in handle overshoot into size of backing
249 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
250 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
253 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
255 if( mState != DISABLED )
257 TouchPoint::State touchState = event.GetPoint(0).state;
259 if( touchState == TouchPoint::Down )
263 float percentage = MapPercentage( event.GetPoint(0).local );
264 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
266 DisplayPopup( value );
268 else if( touchState == TouchPoint::Up)
270 if( mState == PRESSED )
273 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
281 void Slider::OnPan( Actor actor, const PanGesture& gesture )
283 // gesture.position is in local actor coordinates
284 if( mState != DISABLED )
286 switch( gesture.state )
288 case Gesture::Continuing:
290 if( mState == PRESSED )
292 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
294 DisplayPopup( value );
298 case Gesture::Finished:
300 if( mState == PRESSED )
302 if( GetSnapToMarks() )
304 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
306 DisplayPopup( value );
308 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
322 float Slider::HitSpaceToDomain( float x )
324 float halfRegionWidth = GetHitRegion().x * 0.5f;
325 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
326 float endDiff = halfRegionWidth - halfDomainWidth;
331 float Slider::MapPercentage( const Vector2& point )
333 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
336 float Slider::MapValuePercentage( float value )
338 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
341 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
343 return lowerBound + percent * ( upperBound - lowerBound );
346 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
348 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
351 void Slider::DisplayValue( float value, bool raiseSignals )
353 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
355 float percent = MapValuePercentage( clampledValue );
357 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
359 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
364 if( clampledValue > 0.0f )
366 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
367 mProgress.SetSize( x, GetBackingRegion().y );
371 mProgress.SetVisible( false );
378 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
379 mValueChangedSignal.Emit( self, clampledValue );
382 if( MarkReached( percent, markIndex ) )
384 mMarkSignal.Emit( self, markIndex );
388 if( mHandleValueTextView )
390 std::stringstream ss;
391 ss.precision( GetValuePrecision() );
392 ss << std::fixed << clampledValue;
393 mHandleValueTextView.SetText( ss.str() );
397 void Slider::SetMarks( const MarkList& marks )
400 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
402 const Property::Value& propertyValue = *it;
403 propertyValue.Get( value );
405 mMarks.push_back( value );
409 const Slider::MarkList& Slider::GetMarks() const
414 void Slider::SetSnapToMarks( bool snap )
419 bool Slider::GetSnapToMarks() const
424 Actor Slider::CreateHitRegion()
426 Actor hitRegion = Actor::New();
427 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
428 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
429 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
434 ImageActor Slider::CreateBacking()
436 ImageActor backing = ImageActor::New();
437 backing.SetParentOrigin( ParentOrigin::CENTER );
438 backing.SetAnchorPoint( AnchorPoint::CENTER );
439 backing.SetZ( BACKING_Z );
444 void Slider::SetBackingImageName( const std::string& imageName )
446 if( mBacking && imageName != String::EMPTY )
448 Image image = ResourceImage::New( imageName );
449 mBacking.SetImage( image );
453 std::string Slider::GetBackingImageName()
457 return ResourceImage::DownCast( mBacking.GetImage() ).GetUrl();
460 return std::string( "" );
463 ImageActor Slider::CreateProgress()
465 ImageActor progress = ImageActor::New();
466 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
467 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
468 progress.SetZ( PROGRESS_Z );
473 void Slider::SetProgressImageName( const std::string& imageName )
475 if( mProgress && imageName != String::EMPTY )
477 Image image = ResourceImage::New( imageName );
478 mProgress.SetImage( image );
482 std::string Slider::GetProgressImageName()
486 return ResourceImage::DownCast( mProgress.GetImage()).GetUrl();
489 return std::string( "" );
492 void Slider::SetPopupImageName( const std::string& imageName )
494 mPopupImageName = imageName;
497 std::string Slider::GetPopupImageName()
499 return mPopupImageName;
502 void Slider::CreatePopupImage( const std::string& imageName )
504 if( mPopup && imageName != String::EMPTY )
506 Image image = ResourceImage::New( imageName );
507 mPopup.SetImage( image );
511 void Slider::SetPopupArrowImageName( const std::string& imageName )
513 mPopupArrowImageName = imageName;
516 std::string Slider::GetPopupArrowImageName()
518 return mPopupArrowImageName;
521 void Slider::CreatePopupArrowImage( const std::string& imageName )
523 if( mPopupArrow && imageName != String::EMPTY )
525 Image image = ResourceImage::New( imageName );
526 mPopupArrow.SetImage( image );
530 void Slider::ResizeProgressRegion( const Vector2& region )
534 mProgress.SetSize( region );
538 ImageActor Slider::CreateHandle()
540 ImageActor handle = ImageActor::New();
541 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
542 handle.SetAnchorPoint( AnchorPoint::CENTER );
543 handle.SetZ( HANDLE_Z );
548 ImageActor Slider::CreatePopupArrow()
550 ImageActor arrow = ImageActor::New();
551 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
552 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
553 arrow.SetZ( HANDLE_Z );
558 Toolkit::TextView Slider::CreatePopupText()
560 Toolkit::TextView textView = Toolkit::TextView::New();
561 textView.SetParentOrigin( ParentOrigin::CENTER );
562 textView.SetAnchorPoint( AnchorPoint::CENTER );
563 textView.SetSizePolicy( Toolkit::Control::Flexible, Toolkit::Control::Flexible );
564 textView.SetZ( VALUE_DISPLAY_TEXT_Z );
568 ImageActor Slider::CreatePopup()
570 ImageActor popup = ImageActor::New();
571 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
572 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
574 mValueTextView = CreatePopupText();
575 popup.Add( mValueTextView );
580 void Slider::SetHandleImageName( const std::string& imageName )
582 if( mHandle && imageName != String::EMPTY )
584 Image image = ResourceImage::New( imageName );
585 mHandle.SetImage( image );
589 std::string Slider::GetHandleImageName()
593 return ResourceImage::DownCast( mHandle.GetImage() ).GetUrl();
596 return std::string( "" );
599 void Slider::ResizeHandleRegion( const Vector2& region )
603 mHandle.SetSize( region );
607 void Slider::CreateHandleValueDisplay()
609 if( mHandle && !mHandleValueTextView )
611 mHandleValueTextView = Toolkit::TextView::New();
612 mHandleValueTextView.SetParentOrigin( ParentOrigin::CENTER );
613 mHandleValueTextView.SetAnchorPoint( AnchorPoint::CENTER );
614 mHandleValueTextView.SetSize( GetHandleRegion() );
615 mHandleValueTextView.SetZ( HANDLE_VALUE_DISPLAY_TEXT_Z );
616 mHandle.Add( mHandleValueTextView );
620 void Slider::DestroyHandleValueDisplay()
622 if(mHandleValueTextView)
624 mHandleValueTextView.Unparent();
625 mHandleValueTextView.Reset();
629 void Slider::SetPopupTextColor( const Vector4& color )
631 mPopupTextColor = color;
634 Actor Slider::CreateValueDisplay()
636 Actor popup = Actor::New();
637 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
638 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
640 mPopupArrow = CreatePopupArrow();
641 popup.Add( mPopupArrow );
643 mPopup = CreatePopup();
644 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
645 mPopupArrow.Add( mPopup );
650 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
652 return mValueChangedSignal;
655 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
657 return mSlidingFinishedSignal;
660 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
665 void Slider::UpdateSkin()
671 mBacking.SetColor( Color::WHITE );
672 mHandle.SetColor( Color::WHITE );
673 mProgress.SetColor( Color::WHITE );
678 Vector4 disableColor = GetDisableColor();
679 mBacking.SetColor( disableColor );
680 mHandle.SetColor( disableColor );
681 mProgress.SetColor( disableColor );
695 void Slider::CreateChildren()
700 mHitArea = CreateHitRegion();
701 mPanDetector = PanGestureDetector::New();
702 mPanDetector.Attach( mHitArea );
703 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
704 self.Add( mHitArea );
707 mBacking = CreateBacking();
708 self.Add( mBacking );
711 mProgress = CreateProgress();
712 mBacking.Add( mProgress );
715 mHandle = CreateHandle();
716 mBacking.Add( mHandle );
719 void Slider::SetHitRegion( const Vector2& size )
725 mHitArea.SetSize( mHitRegion );
729 const Vector2& Slider::GetHitRegion() const
734 void Slider::AddPopup()
738 mValueDisplay = CreateValueDisplay();
739 mValueDisplay.SetVisible( false );
740 mHandle.Add( mValueDisplay );
742 CreatePopupImage( GetPopupImageName() );
743 CreatePopupArrowImage( GetPopupArrowImageName() );
745 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
746 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
750 void Slider::RemovePopup()
757 mPopupArrow.Unparent();
760 mValueDisplay.Unparent();
761 mValueDisplay.Reset();
763 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
769 float Slider::MarkFilter( float value )
771 const float MARK_TOLERANCE = GetMarkTolerance();
774 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
776 const Property::Value& propertyValue = *it;
777 propertyValue.Get( mark );
778 mark = MapValuePercentage( mark );
780 // If close to a mark, return the mark
781 if( fabsf( mark - value ) < MARK_TOLERANCE )
790 float Slider::SnapToMark( float value )
792 float closestMark = value;
793 float closestDist = std::numeric_limits<float>::max();
796 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
798 const Property::Value& propertyValue = *it;
799 propertyValue.Get( mark );
800 mark = MapValuePercentage( mark );
802 float dist = fabsf( mark - value );
803 if( dist < closestDist )
813 bool Slider::MarkReached( float value, int& outIndex )
815 const float MARK_TOLERANCE = GetMarkTolerance();
819 tail = mMarks.size() - 1;
823 while( head <= tail )
825 current = head + ( tail - head ) / 2;
827 const Property::Value& propertyValue = mMarks[ current ];
828 propertyValue.Get( mark );
829 mark = MapValuePercentage( mark );
831 if( fabsf( mark - value ) < MARK_TOLERANCE )
852 bool Slider::HideValueView()
856 mValueDisplay.SetVisible( false );
862 void Slider::SetLowerBound( float bound )
865 DisplayValue( GetValue(), false );
868 float Slider::GetLowerBound() const
873 void Slider::SetUpperBound( float bound )
876 DisplayValue( GetValue(), false );
879 float Slider::GetUpperBound() const
884 void Slider::SetValue( float value )
887 DisplayValue( mValue, true );
890 float Slider::GetValue() const
895 void Slider::SetBackingRegion( const Vector2& region )
897 mBackingRegion = region;
901 mBacking.SetSize( mBackingRegion );
904 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
906 mDomain = CalcDomain( mBackingRegion );
908 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
911 const Vector2& Slider::GetBackingRegion() const
913 return mBackingRegion;
916 void Slider::SetHandleRegion( const Vector2& region )
918 mHandleRegionSize = region;
920 ResizeHandleRegion( mHandleRegionSize );
922 Vector2 hitRegion = GetHitRegion();
923 hitRegion.x += mHandleRegionSize.x;
924 SetHitRegion( hitRegion );
927 const Vector2& Slider::GetHandleRegion() const
929 return mHandleRegionSize;
932 void Slider::SetDisableColor( const Vector4& color )
934 mDisableColor = color;
939 Vector4 Slider::GetDisableColor() const
941 return mDisableColor;
944 Vector4 Slider::GetPopupTextColor() const
946 return mPopupTextColor;
949 void Slider::SetValuePrecision( int precision )
951 mValuePrecision = precision;
954 int Slider::GetValuePrecision() const
956 return mValuePrecision;
959 void Slider::SetShowPopup( bool showPopup )
961 mShowPopup = showPopup;
974 bool Slider::GetShowPopup() const
979 void Slider::SetShowValue( bool showValue )
981 mShowValue = showValue;
985 CreateHandleValueDisplay();
989 DestroyHandleValueDisplay();
993 bool Slider::GetShowValue() const
998 void Slider::SetEnabled( bool enabled )
1012 bool Slider::IsEnabled() const
1014 return mState != DISABLED;
1017 void Slider::SetMarkTolerance( float tolerance )
1019 mMarkTolerance = tolerance;
1022 float Slider::GetMarkTolerance() const
1024 return mMarkTolerance;
1027 // Static class method to support script connecting signals
1028 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
1030 Dali::BaseHandle handle( object );
1032 bool connected = true;
1033 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1035 if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
1037 slider.ValueChangedSignal().Connect( tracker, functor );
1039 else if( 0 == strcmp( signalName.c_str(), SIGNAL_MARK ) )
1041 slider.MarkSignal().Connect( tracker, functor );
1045 // signalName does not match any signal
1052 void Slider::DisplayPopup( float value )
1054 // Value displayDoConnectSignal
1055 if( mValueTextView )
1057 std::stringstream ss;
1058 ss.precision( GetValuePrecision() );
1059 ss << std::fixed << value;
1060 mValueTextView.SetText( ss.str() );
1062 style.SetTextColor( GetPopupTextColor() );
1063 mValueTextView.SetStyleToCurrentText( style, TextStyle::COLOR);
1067 Font font = Font::New();
1068 float popupWidth = font.MeasureText( ss.str() ).x + VALUE_POPUP_MARGIN * 2.0f;
1069 if( popupWidth < VALUE_POPUP_MIN_WIDTH )
1071 popupWidth = VALUE_POPUP_MIN_WIDTH;
1074 mPopup.SetSize( popupWidth, VALUE_POPUP_HEIGHT );
1075 mValueDisplay.SetVisible( true );
1077 mValueTimer.SetInterval( VALUE_VIEW_SHOW_DURATION );
1082 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1084 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1088 Slider& sliderImpl( GetImpl( slider ) );
1090 switch ( propertyIndex )
1092 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1094 sliderImpl.SetLowerBound( value.Get< float >() );
1098 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1100 sliderImpl.SetUpperBound( value.Get< float >() );
1104 case Toolkit::Slider::VALUE_PROPERTY:
1106 sliderImpl.SetValue( value.Get< float >() );
1110 case Toolkit::Slider::HIT_REGION_PROPERTY:
1112 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1116 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1118 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1122 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1124 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1128 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1130 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1134 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1136 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1140 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1142 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1146 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1148 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1152 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1154 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1158 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1160 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1164 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1166 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1170 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1172 sliderImpl.SetValuePrecision( value.Get< int >() );
1176 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1178 sliderImpl.SetShowPopup( value.Get< bool >() );
1182 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1184 sliderImpl.SetShowValue( value.Get< bool >() );
1188 case Toolkit::Slider::ENABLED_PROPERTY:
1190 sliderImpl.SetEnabled( value.Get< bool >() );
1194 case Toolkit::Slider::MARKS_PROPERTY:
1196 sliderImpl.SetMarks( value.Get< Property::Array >() );
1200 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1202 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1206 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1208 sliderImpl.SetMarkTolerance( value.Get< float >() );
1215 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1217 Property::Value value;
1219 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1223 Slider& sliderImpl( GetImpl( slider ) );
1225 switch ( propertyIndex )
1227 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1229 value = sliderImpl.GetLowerBound();
1233 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1235 value = sliderImpl.GetUpperBound();
1239 case Toolkit::Slider::VALUE_PROPERTY:
1241 value = sliderImpl.GetValue();
1245 case Toolkit::Slider::HIT_REGION_PROPERTY:
1247 value = sliderImpl.GetHitRegion();
1251 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1253 value = sliderImpl.GetBackingRegion();
1257 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1259 value = sliderImpl.GetHandleRegion();
1263 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1265 value = sliderImpl.GetBackingImageName();
1269 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1271 value = sliderImpl.GetHandleImageName();
1275 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1277 value = sliderImpl.GetProgressImageName();
1281 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1283 value = sliderImpl.GetPopupImageName();
1287 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1289 value = sliderImpl.GetPopupArrowImageName();
1293 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1295 value = sliderImpl.GetDisableColor();
1299 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1301 value = sliderImpl.GetPopupTextColor();
1305 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1307 value = sliderImpl.GetValuePrecision();
1311 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1313 value = sliderImpl.GetShowPopup();
1317 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1319 value = sliderImpl.GetShowValue();
1323 case Toolkit::Slider::ENABLED_PROPERTY:
1325 value = sliderImpl.IsEnabled();
1329 case Toolkit::Slider::MARKS_PROPERTY:
1331 // TODO: Need to be able to return a PropertyArray
1332 // value = sliderImpl.GetMarks();
1336 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1338 value = sliderImpl.GetSnapToMarks();
1342 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1344 value = sliderImpl.GetMarkTolerance();
1353 } // namespace Internal
1355 } // namespace Toolkit