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.
18 #include <dali-toolkit/internal/controls/slider/slider-impl.h>
19 #include <dali-toolkit/public-api/controls/control-impl.h>
33 const Property::Index Slider::LOWER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX;
34 const Property::Index Slider::UPPER_BOUND_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 1;
36 const Property::Index Slider::VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 2;
37 const Property::Index Slider::HIT_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 3;
38 const Property::Index Slider::BACKING_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 4;
39 const Property::Index Slider::HANDLE_REGION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 5;
41 const Property::Index Slider::BACKING_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 6;
42 const Property::Index Slider::HANDLE_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 7;
43 const Property::Index Slider::PROGRESS_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 8;
44 const Property::Index Slider::POPUP_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 9;
45 const Property::Index Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 10;
47 const Property::Index Slider::DISABLE_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 11;
48 const Property::Index Slider::POPUP_TEXT_COLOR_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 12;
50 const Property::Index Slider::VALUE_PRECISION_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 13;
52 const Property::Index Slider::SHOW_POPUP_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 14;
53 const Property::Index Slider::SHOW_VALUE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 15;
55 const Property::Index Slider::ENABLED_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 16;
57 const Property::Index Slider::MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 17;
58 const Property::Index Slider::SNAP_TO_MARKS_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 18;
59 const Property::Index Slider::MARK_TOLERANCE_PROPERTY = Internal::Slider::SLIDER_PROPERTY_START_INDEX + 19;
66 const float BACKING_Z = -0.1f;
67 const float PROGRESS_Z = 0.1f;
68 const float HANDLE_Z = 1.0f;
69 const float VALUE_TEXT_INCREMENT = 0.01f;
70 const float HANDLE_VALUE_DISPLAY_TEXT_Z = HANDLE_Z + VALUE_TEXT_INCREMENT;
71 const float VALUE_DISPLAY_TEXT_Z = VALUE_TEXT_INCREMENT + VALUE_TEXT_INCREMENT; // Put above HANDLE_VALUE_DISPLAY_TEXT_Z (parented to handle)
73 const float MARK_SNAP_TOLERANCE = 0.05f; // 5% of slider width
75 const int VALUE_VIEW_SHOW_DURATION = 1000; // millisec
76 const int VALUE_VIEW_SHOW_DURATION_LONG = 2000; // millisec
78 const float VALUE_VERTICAL_OFFSET = 48.0f;
80 const float DEFAULT_WIDTH = 0.0f;
81 const float DEFAULT_HEIGHT = 27.0f;
82 const float DEFAULT_HIT_HEIGHT = 72.0f;
83 const float DEFAULT_HANDLE_HEIGHT = DEFAULT_HIT_HEIGHT;
85 const char* SKINNED_BACKING_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin.9.png";
86 const char* SKINNED_HANDLE_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-handle.png";;
87 const char* SKINNED_PROGRESS_IMAGE_NAME = DALI_IMAGE_DIR "slider-skin-progress.9.png";
88 const char* SKINNED_POPUP_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup.9.png";
89 const char* SKINNED_POPUP_ARROW_IMAGE_NAME = DALI_IMAGE_DIR "slider-popup-arrow.png";
91 const Vector2 DEFAULT_HIT_REGION( DEFAULT_WIDTH, DEFAULT_HIT_HEIGHT );
92 const Vector2 DEFAULT_BACKING_REGION( DEFAULT_WIDTH, DEFAULT_HEIGHT );
93 const Vector2 DEFAULT_HANDLE_REGION( DEFAULT_HANDLE_HEIGHT, DEFAULT_HANDLE_HEIGHT );
95 const Vector4 DEFAULT_DISABLE_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
96 const Vector4 DEFAULT_POPUP_TEXT_COLOR( 0.5f, 0.5f, 0.5f, 1.0f );
98 const float VALUE_POPUP_MARGIN = 10.0f;
99 const float VALUE_POPUP_HEIGHT = 81.0f;
100 const float VALUE_POPUP_MIN_WIDTH = 54.0f;
101 const Vector2 VALUE_POPUP_ARROW_SIZE( 18.0f, 18.0f );
103 const float DEFAULT_LOWER_BOUND = 0.0f;
104 const float DEFAULT_UPPER_BOUND = 1.0f;
105 const float DEFAULT_VALUE = 0.0f;
106 const int DEFAULT_VALUE_PRECISION = 0;
107 const bool DEFAULT_SHOW_POPUP = false;
108 const bool DEFAULT_SHOW_VALUE = true;
109 const bool DEFAULT_ENABLED = true;
110 const bool DEFAULT_SNAP_TO_MARKS = false;
114 return Dali::Toolkit::Slider::New();
117 TypeRegistration typeRegistration( typeid(Dali::Toolkit::Slider), typeid(Dali::Toolkit::Control), Create );
119 SignalConnectorType signalConnector1( typeRegistration, Toolkit::Slider::SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
120 SignalConnectorType signalConnector2( typeRegistration, Toolkit::Slider::SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
122 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
123 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
124 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
126 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
127 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
128 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
130 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
131 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
132 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
133 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
134 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
136 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
137 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
139 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
141 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
142 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
144 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
146 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
147 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
148 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
152 ///////////////////////////////////////////////////////////////////////////////////////////////////
154 ///////////////////////////////////////////////////////////////////////////////////////////////////
156 Dali::Toolkit::Slider Slider::New()
158 // Create the implementation
159 SliderPtr slider( new Slider() );
161 // Pass ownership to CustomActor via derived handle
162 Dali::Toolkit::Slider handle( *slider );
164 // Second-phase init of the implementation
165 // This can only be done after the CustomActor connection has been made...
166 slider->Initialize();
172 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
174 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
175 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
176 mHitRegion( 0.0f, 0.0f ),
177 mBackingRegion( 0.0f, 0.0f ),
178 mHandleRegionSize( 0.0f, 0.0f ),
182 mMarkTolerance( 0.0f ),
183 mValuePrecision( 0 ),
186 mSnapToMarks( false )
194 void Slider::OnInitialize()
202 SetHitRegion( DEFAULT_HIT_REGION );
203 SetBackingRegion( DEFAULT_BACKING_REGION );
204 SetHandleRegion( DEFAULT_HANDLE_REGION );
206 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
207 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
208 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
209 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
210 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
212 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
214 SetShowPopup( DEFAULT_SHOW_POPUP );
215 SetShowValue( DEFAULT_SHOW_VALUE );
217 SetEnabled( DEFAULT_ENABLED );
218 SetDisableColor( DEFAULT_DISABLE_COLOR );
220 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
221 SetMarkTolerance( MARK_SNAP_TOLERANCE );
223 SetLowerBound( DEFAULT_LOWER_BOUND );
224 SetUpperBound( DEFAULT_UPPER_BOUND );
226 SetValuePrecision( DEFAULT_VALUE_PRECISION );
227 mValue = DEFAULT_VALUE;
228 DisplayValue( mValue, false ); // Run this last to display the correct value
230 // Size the Slider actor to a default
231 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
234 void Slider::OnControlSizeSet( const Vector3& size )
236 // Factor in handle overshoot into size of backing
237 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
238 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
241 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
243 if( mState != DISABLED )
245 TouchPoint::State touchState = event.GetPoint(0).state;
247 if( touchState == TouchPoint::Down )
251 float percentage = MapPercentage( event.GetPoint(0).local );
252 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
254 DisplayPopup( value );
256 else if( touchState == TouchPoint::Up)
258 if( mState == PRESSED )
261 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
269 void Slider::OnPan( Actor actor, PanGesture gesture )
271 // gesture.position is in local actor coordinates
272 if( mState != DISABLED )
274 switch( gesture.state )
276 case Gesture::Continuing:
278 if( mState == PRESSED )
280 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
282 DisplayPopup( value );
286 case Gesture::Finished:
288 if( mState == PRESSED )
290 if( GetSnapToMarks() )
292 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
294 DisplayPopup( value );
296 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
310 float Slider::HitSpaceToDomain( float x )
312 float halfRegionWidth = GetHitRegion().x * 0.5f;
313 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
314 float endDiff = halfRegionWidth - halfDomainWidth;
319 float Slider::MapPercentage( const Vector2& point )
321 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
324 float Slider::MapValuePercentage( float value )
326 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
329 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
331 return lowerBound + percent * ( upperBound - lowerBound );
334 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
336 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
339 void Slider::DisplayValue( float value, bool raiseSignals )
341 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
343 float percent = MapValuePercentage( clampledValue );
345 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
347 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
352 if( clampledValue > 0.0f )
354 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
355 mProgress.SetSize( x, GetBackingRegion().y );
359 mProgress.SetVisible( false );
366 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
367 mValueChangedSignal.Emit( self, clampledValue );
370 if( MarkReached( percent, markIndex ) )
372 mMarkSignal.Emit( self, markIndex );
376 if( mHandleValueTextView )
378 std::stringstream ss;
379 ss.precision( GetValuePrecision() );
380 ss << fixed << clampledValue;
381 mHandleValueTextView.SetText( ss.str() );
385 void Slider::SetMarks( const MarkList& marks )
388 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
390 const Property::Value& propertyValue = *it;
391 propertyValue.Get( value );
393 mMarks.push_back( value );
397 const Slider::MarkList& Slider::GetMarks() const
402 void Slider::SetSnapToMarks( bool snap )
407 bool Slider::GetSnapToMarks() const
412 Actor Slider::CreateHitRegion()
414 Actor hitRegion = Actor::New();
415 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
416 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
417 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
422 ImageActor Slider::CreateBacking()
424 ImageActor backing = ImageActor::New();
425 backing.SetParentOrigin( ParentOrigin::CENTER );
426 backing.SetAnchorPoint( AnchorPoint::CENTER );
427 backing.SetZ( BACKING_Z );
432 void Slider::SetBackingImageName( const std::string& imageName )
434 if( mBacking && imageName != String::EMPTY )
436 Image image = Image::New( imageName );
437 mBacking.SetImage( image );
441 std::string Slider::GetBackingImageName()
445 return mBacking.GetImage().GetFilename();
448 return std::string( "" );
451 ImageActor Slider::CreateProgress()
453 ImageActor progress = ImageActor::New();
454 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
455 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
456 progress.SetZ( PROGRESS_Z );
461 void Slider::SetProgressImageName( const std::string& imageName )
463 if( mProgress && imageName != String::EMPTY )
465 Image image = Image::New( imageName );
466 mProgress.SetImage( image );
470 std::string Slider::GetProgressImageName()
474 return mProgress.GetImage().GetFilename();
477 return std::string( "" );
480 void Slider::SetPopupImageName( const std::string& imageName )
482 mPopupImageName = imageName;
485 std::string Slider::GetPopupImageName()
487 return mPopupImageName;
490 void Slider::CreatePopupImage( const std::string& imageName )
492 if( mPopup && imageName != String::EMPTY )
494 Image image = Image::New( imageName );
495 mPopup.SetImage( image );
499 void Slider::SetPopupArrowImageName( const std::string& imageName )
501 mPopupArrowImageName = imageName;
504 std::string Slider::GetPopupArrowImageName()
506 return mPopupArrowImageName;
509 void Slider::CreatePopupArrowImage( const std::string& imageName )
511 if( mPopupArrow && imageName != String::EMPTY )
513 Image image = Image::New( imageName );
514 mPopupArrow.SetImage( image );
518 void Slider::ResizeProgressRegion( const Vector2& region )
522 mProgress.SetSize( region );
526 ImageActor Slider::CreateHandle()
528 ImageActor handle = ImageActor::New();
529 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
530 handle.SetAnchorPoint( AnchorPoint::CENTER );
531 handle.SetZ( HANDLE_Z );
536 ImageActor Slider::CreatePopupArrow()
538 ImageActor arrow = ImageActor::New();
539 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
540 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
541 arrow.SetZ( HANDLE_Z );
546 Toolkit::TextView Slider::CreatePopupText()
548 Toolkit::TextView textView = Toolkit::TextView::New();
549 textView.SetParentOrigin( ParentOrigin::CENTER );
550 textView.SetAnchorPoint( AnchorPoint::CENTER );
551 textView.SetSizePolicy( Toolkit::Control::Flexible, Toolkit::Control::Flexible );
552 textView.SetZ( VALUE_DISPLAY_TEXT_Z );
556 ImageActor Slider::CreatePopup()
558 ImageActor popup = ImageActor::New();
559 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
560 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
562 mValueTextView = CreatePopupText();
563 popup.Add( mValueTextView );
568 void Slider::SetHandleImageName( const std::string& imageName )
570 if( mHandle && imageName != String::EMPTY )
572 Image image = Image::New( imageName );
573 mHandle.SetImage( image );
577 std::string Slider::GetHandleImageName()
581 return mHandle.GetImage().GetFilename();
584 return std::string( "" );
587 void Slider::ResizeHandleRegion( const Vector2& region )
591 mHandle.SetSize( region );
595 void Slider::CreateHandleValueDisplay()
597 if( mHandle && !mHandleValueTextView )
599 mHandleValueTextView = Toolkit::TextView::New();
600 mHandleValueTextView.SetParentOrigin( ParentOrigin::CENTER );
601 mHandleValueTextView.SetAnchorPoint( AnchorPoint::CENTER );
602 mHandleValueTextView.SetSize( GetHandleRegion() );
603 mHandleValueTextView.SetZ( HANDLE_VALUE_DISPLAY_TEXT_Z );
604 mHandle.Add( mHandleValueTextView );
608 void Slider::DestroyHandleValueDisplay()
610 if(mHandleValueTextView)
612 mHandleValueTextView.Unparent();
613 mHandleValueTextView.Reset();
617 void Slider::SetPopupTextColor( const Vector4& color )
619 mPopupTextColor = color;
622 Actor Slider::CreateValueDisplay()
624 Actor popup = Actor::New();
625 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
626 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
628 mPopupArrow = CreatePopupArrow();
629 popup.Add( mPopupArrow );
631 mPopup = CreatePopup();
632 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
633 mPopupArrow.Add( mPopup );
638 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
640 return mValueChangedSignal;
643 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
645 return mSlidingFinishedSignal;
648 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
653 void Slider::UpdateSkin()
659 mBacking.SetColor( Color::WHITE );
660 mHandle.SetColor( Color::WHITE );
661 mProgress.SetColor( Color::WHITE );
666 Vector4 disableColor = GetDisableColor();
667 mBacking.SetColor( disableColor );
668 mHandle.SetColor( disableColor );
669 mProgress.SetColor( disableColor );
683 void Slider::CreateChildren()
688 mHitArea = CreateHitRegion();
689 mPanDetector = PanGestureDetector::New();
690 mPanDetector.Attach( mHitArea );
691 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
692 self.Add( mHitArea );
695 mBacking = CreateBacking();
696 self.Add( mBacking );
699 mProgress = CreateProgress();
700 mBacking.Add( mProgress );
703 mHandle = CreateHandle();
704 mBacking.Add( mHandle );
707 void Slider::SetHitRegion( const Vector2& size )
713 mHitArea.SetSize( mHitRegion );
717 const Vector2& Slider::GetHitRegion() const
722 void Slider::AddPopup()
726 mValueDisplay = CreateValueDisplay();
727 mValueDisplay.SetVisible( false );
728 mHandle.Add( mValueDisplay );
730 CreatePopupImage( GetPopupImageName() );
731 CreatePopupArrowImage( GetPopupArrowImageName() );
733 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
734 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
738 void Slider::RemovePopup()
745 mPopupArrow.Unparent();
748 mValueDisplay.Unparent();
749 mValueDisplay.Reset();
751 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
757 float Slider::MarkFilter( float value )
759 const float MARK_TOLERANCE = GetMarkTolerance();
762 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
764 const Property::Value& propertyValue = *it;
765 propertyValue.Get( mark );
766 mark = MapValuePercentage( mark );
768 // If close to a mark, return the mark
769 if( fabsf( mark - value ) < MARK_TOLERANCE )
778 float Slider::SnapToMark( float value )
780 float closestMark = value;
781 float closestDist = std::numeric_limits<float>::max();
784 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
786 const Property::Value& propertyValue = *it;
787 propertyValue.Get( mark );
788 mark = MapValuePercentage( mark );
790 float dist = fabsf( mark - value );
791 if( dist < closestDist )
801 bool Slider::MarkReached( float value, int& outIndex )
803 const float MARK_TOLERANCE = GetMarkTolerance();
807 tail = mMarks.size() - 1;
811 while( head <= tail )
813 current = head + ( tail - head ) / 2;
815 const Property::Value& propertyValue = mMarks[ current ];
816 propertyValue.Get( mark );
817 mark = MapValuePercentage( mark );
819 if( fabsf( mark - value ) < MARK_TOLERANCE )
840 bool Slider::HideValueView()
844 mValueDisplay.SetVisible( false );
850 void Slider::SetLowerBound( float bound )
853 DisplayValue( GetValue(), false );
856 float Slider::GetLowerBound() const
861 void Slider::SetUpperBound( float bound )
864 DisplayValue( GetValue(), false );
867 float Slider::GetUpperBound() const
872 void Slider::SetValue( float value )
875 DisplayValue( mValue, true );
878 float Slider::GetValue() const
883 void Slider::SetBackingRegion( const Vector2& region )
885 mBackingRegion = region;
889 mBacking.SetSize( mBackingRegion );
892 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
894 mDomain = CalcDomain( mBackingRegion );
896 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
899 const Vector2& Slider::GetBackingRegion() const
901 return mBackingRegion;
904 void Slider::SetHandleRegion( const Vector2& region )
906 mHandleRegionSize = region;
908 ResizeHandleRegion( mHandleRegionSize );
910 Vector2 hitRegion = GetHitRegion();
911 hitRegion.x += mHandleRegionSize.x;
912 SetHitRegion( hitRegion );
915 const Vector2& Slider::GetHandleRegion() const
917 return mHandleRegionSize;
920 void Slider::SetDisableColor( const Vector4& color )
922 mDisableColor = color;
927 Vector4 Slider::GetDisableColor() const
929 return mDisableColor;
932 Vector4 Slider::GetPopupTextColor() const
934 return mPopupTextColor;
937 void Slider::SetValuePrecision( int precision )
939 mValuePrecision = precision;
942 int Slider::GetValuePrecision() const
944 return mValuePrecision;
947 void Slider::SetShowPopup( bool showPopup )
949 mShowPopup = showPopup;
962 bool Slider::GetShowPopup() const
967 void Slider::SetShowValue( bool showValue )
969 mShowValue = showValue;
973 CreateHandleValueDisplay();
977 DestroyHandleValueDisplay();
981 bool Slider::GetShowValue() const
986 void Slider::SetEnabled( bool enabled )
1000 bool Slider::IsEnabled() const
1002 return mState != DISABLED;
1005 void Slider::SetMarkTolerance( float tolerance )
1007 mMarkTolerance = tolerance;
1010 float Slider::GetMarkTolerance() const
1012 return mMarkTolerance;
1015 // static class method to support script connecting signals
1017 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
1019 Dali::BaseHandle handle( object );
1021 bool connected = true;
1022 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1024 if( signalName == Dali::Toolkit::Slider::SIGNAL_VALUE_CHANGED )
1026 slider.ValueChangedSignal().Connect( tracker, functor );
1028 else if( signalName == Dali::Toolkit::Slider::SIGNAL_MARK )
1030 slider.MarkSignal().Connect( tracker, functor );
1034 // signalName does not match any signal
1041 void Slider::DisplayPopup( float value )
1043 // Value displayDoConnectSignal
1044 if( mValueTextView )
1046 std::stringstream ss;
1047 ss.precision( GetValuePrecision() );
1048 ss << fixed << value;
1049 mValueTextView.SetText( ss.str() );
1051 style.SetTextColor( GetPopupTextColor() );
1052 mValueTextView.SetStyleToCurrentText( style, TextStyle::COLOR);
1056 Font font = Font::New();
1057 float popupWidth = font.MeasureText( ss.str() ).x + VALUE_POPUP_MARGIN * 2.0f;
1058 if( popupWidth < VALUE_POPUP_MIN_WIDTH )
1060 popupWidth = VALUE_POPUP_MIN_WIDTH;
1063 mPopup.SetSize( popupWidth, VALUE_POPUP_HEIGHT );
1064 mValueDisplay.SetVisible( true );
1066 mValueTimer.SetInterval( VALUE_VIEW_SHOW_DURATION );
1071 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1073 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1077 Slider& sliderImpl( GetImpl( slider ) );
1079 switch ( propertyIndex )
1081 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1083 sliderImpl.SetLowerBound( value.Get< float >() );
1087 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1089 sliderImpl.SetUpperBound( value.Get< float >() );
1093 case Toolkit::Slider::VALUE_PROPERTY:
1095 sliderImpl.SetValue( value.Get< float >() );
1099 case Toolkit::Slider::HIT_REGION_PROPERTY:
1101 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1105 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1107 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1111 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1113 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1117 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1119 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1123 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1125 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1129 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1131 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1135 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1137 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1141 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1143 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1147 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1149 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1153 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1155 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1159 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1161 sliderImpl.SetValuePrecision( value.Get< int >() );
1165 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1167 sliderImpl.SetShowPopup( value.Get< bool >() );
1171 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1173 sliderImpl.SetShowValue( value.Get< bool >() );
1177 case Toolkit::Slider::ENABLED_PROPERTY:
1179 sliderImpl.SetEnabled( value.Get< bool >() );
1183 case Toolkit::Slider::MARKS_PROPERTY:
1185 sliderImpl.SetMarks( value.Get< Property::Array >() );
1189 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1191 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1195 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1197 sliderImpl.SetMarkTolerance( value.Get< float >() );
1204 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1206 Property::Value value;
1208 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1212 Slider& sliderImpl( GetImpl( slider ) );
1214 switch ( propertyIndex )
1216 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1218 value = sliderImpl.GetLowerBound();
1222 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1224 value = sliderImpl.GetUpperBound();
1228 case Toolkit::Slider::VALUE_PROPERTY:
1230 value = sliderImpl.GetValue();
1234 case Toolkit::Slider::HIT_REGION_PROPERTY:
1236 value = sliderImpl.GetHitRegion();
1240 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1242 value = sliderImpl.GetBackingRegion();
1246 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1248 value = sliderImpl.GetHandleRegion();
1252 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1254 value = sliderImpl.GetBackingImageName();
1258 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1260 value = sliderImpl.GetHandleImageName();
1264 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1266 value = sliderImpl.GetProgressImageName();
1270 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1272 value = sliderImpl.GetPopupImageName();
1276 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1278 value = sliderImpl.GetPopupArrowImageName();
1282 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1284 value = sliderImpl.GetDisableColor();
1288 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1290 value = sliderImpl.GetPopupTextColor();
1294 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1296 value = sliderImpl.GetValuePrecision();
1300 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1302 value = sliderImpl.GetShowPopup();
1306 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1308 value = sliderImpl.GetShowValue();
1312 case Toolkit::Slider::ENABLED_PROPERTY:
1314 value = sliderImpl.IsEnabled();
1318 case Toolkit::Slider::MARKS_PROPERTY:
1320 // TODO: Need to be able to return a PropertyArray
1321 // value = sliderImpl.GetMarks();
1325 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1327 value = sliderImpl.GetSnapToMarks();
1331 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1333 value = sliderImpl.GetMarkTolerance();
1342 } // namespace Internal
1344 } // namespace Toolkit