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 );
382 if( mHandleValueTextView )
384 std::stringstream ss;
385 ss.precision( GetValuePrecision() );
386 ss << std::fixed << clampledValue;
387 mHandleValueTextView.SetText( ss.str() );
391 void Slider::SetMarks( const MarkList& marks )
394 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
396 const Property::Value& propertyValue = *it;
397 propertyValue.Get( value );
399 mMarks.push_back( value );
403 const Slider::MarkList& Slider::GetMarks() const
408 void Slider::SetSnapToMarks( bool snap )
413 bool Slider::GetSnapToMarks() const
418 Actor Slider::CreateHitRegion()
420 Actor hitRegion = Actor::New();
421 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
422 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
423 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
428 ImageActor Slider::CreateBacking()
430 ImageActor backing = ImageActor::New();
431 backing.SetParentOrigin( ParentOrigin::CENTER );
432 backing.SetAnchorPoint( AnchorPoint::CENTER );
433 backing.SetZ( BACKING_Z );
438 void Slider::SetBackingImageName( const std::string& imageName )
440 if( mBacking && imageName != String::EMPTY )
442 Image image = Image::New( imageName );
443 mBacking.SetImage( image );
447 std::string Slider::GetBackingImageName()
451 return mBacking.GetImage().GetFilename();
454 return std::string( "" );
457 ImageActor Slider::CreateProgress()
459 ImageActor progress = ImageActor::New();
460 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
461 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
462 progress.SetZ( PROGRESS_Z );
467 void Slider::SetProgressImageName( const std::string& imageName )
469 if( mProgress && imageName != String::EMPTY )
471 Image image = Image::New( imageName );
472 mProgress.SetImage( image );
476 std::string Slider::GetProgressImageName()
480 return mProgress.GetImage().GetFilename();
483 return std::string( "" );
486 void Slider::SetPopupImageName( const std::string& imageName )
488 mPopupImageName = imageName;
491 std::string Slider::GetPopupImageName()
493 return mPopupImageName;
496 void Slider::CreatePopupImage( const std::string& imageName )
498 if( mPopup && imageName != String::EMPTY )
500 Image image = Image::New( imageName );
501 mPopup.SetImage( image );
505 void Slider::SetPopupArrowImageName( const std::string& imageName )
507 mPopupArrowImageName = imageName;
510 std::string Slider::GetPopupArrowImageName()
512 return mPopupArrowImageName;
515 void Slider::CreatePopupArrowImage( const std::string& imageName )
517 if( mPopupArrow && imageName != String::EMPTY )
519 Image image = Image::New( imageName );
520 mPopupArrow.SetImage( image );
524 void Slider::ResizeProgressRegion( const Vector2& region )
528 mProgress.SetSize( region );
532 ImageActor Slider::CreateHandle()
534 ImageActor handle = ImageActor::New();
535 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
536 handle.SetAnchorPoint( AnchorPoint::CENTER );
537 handle.SetZ( HANDLE_Z );
542 ImageActor Slider::CreatePopupArrow()
544 ImageActor arrow = ImageActor::New();
545 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
546 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
547 arrow.SetZ( HANDLE_Z );
552 Toolkit::TextView Slider::CreatePopupText()
554 Toolkit::TextView textView = Toolkit::TextView::New();
555 textView.SetParentOrigin( ParentOrigin::CENTER );
556 textView.SetAnchorPoint( AnchorPoint::CENTER );
557 textView.SetSizePolicy( Toolkit::Control::Flexible, Toolkit::Control::Flexible );
558 textView.SetZ( VALUE_DISPLAY_TEXT_Z );
562 ImageActor Slider::CreatePopup()
564 ImageActor popup = ImageActor::New();
565 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
566 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
568 mValueTextView = CreatePopupText();
569 popup.Add( mValueTextView );
574 void Slider::SetHandleImageName( const std::string& imageName )
576 if( mHandle && imageName != String::EMPTY )
578 Image image = Image::New( imageName );
579 mHandle.SetImage( image );
583 std::string Slider::GetHandleImageName()
587 return mHandle.GetImage().GetFilename();
590 return std::string( "" );
593 void Slider::ResizeHandleRegion( const Vector2& region )
597 mHandle.SetSize( region );
601 void Slider::CreateHandleValueDisplay()
603 if( mHandle && !mHandleValueTextView )
605 mHandleValueTextView = Toolkit::TextView::New();
606 mHandleValueTextView.SetParentOrigin( ParentOrigin::CENTER );
607 mHandleValueTextView.SetAnchorPoint( AnchorPoint::CENTER );
608 mHandleValueTextView.SetSize( GetHandleRegion() );
609 mHandleValueTextView.SetZ( HANDLE_VALUE_DISPLAY_TEXT_Z );
610 mHandle.Add( mHandleValueTextView );
614 void Slider::DestroyHandleValueDisplay()
616 if(mHandleValueTextView)
618 mHandleValueTextView.Unparent();
619 mHandleValueTextView.Reset();
623 void Slider::SetPopupTextColor( const Vector4& color )
625 mPopupTextColor = color;
628 Actor Slider::CreateValueDisplay()
630 Actor popup = Actor::New();
631 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
632 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
634 mPopupArrow = CreatePopupArrow();
635 popup.Add( mPopupArrow );
637 mPopup = CreatePopup();
638 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
639 mPopupArrow.Add( mPopup );
644 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
646 return mValueChangedSignal;
649 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
651 return mSlidingFinishedSignal;
654 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
659 void Slider::UpdateSkin()
665 mBacking.SetColor( Color::WHITE );
666 mHandle.SetColor( Color::WHITE );
667 mProgress.SetColor( Color::WHITE );
672 Vector4 disableColor = GetDisableColor();
673 mBacking.SetColor( disableColor );
674 mHandle.SetColor( disableColor );
675 mProgress.SetColor( disableColor );
689 void Slider::CreateChildren()
694 mHitArea = CreateHitRegion();
695 mPanDetector = PanGestureDetector::New();
696 mPanDetector.Attach( mHitArea );
697 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
698 self.Add( mHitArea );
701 mBacking = CreateBacking();
702 self.Add( mBacking );
705 mProgress = CreateProgress();
706 mBacking.Add( mProgress );
709 mHandle = CreateHandle();
710 mBacking.Add( mHandle );
713 void Slider::SetHitRegion( const Vector2& size )
719 mHitArea.SetSize( mHitRegion );
723 const Vector2& Slider::GetHitRegion() const
728 void Slider::AddPopup()
732 mValueDisplay = CreateValueDisplay();
733 mValueDisplay.SetVisible( false );
734 mHandle.Add( mValueDisplay );
736 CreatePopupImage( GetPopupImageName() );
737 CreatePopupArrowImage( GetPopupArrowImageName() );
739 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
740 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
744 void Slider::RemovePopup()
751 mPopupArrow.Unparent();
754 mValueDisplay.Unparent();
755 mValueDisplay.Reset();
757 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
763 float Slider::MarkFilter( float value )
765 const float MARK_TOLERANCE = GetMarkTolerance();
768 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
770 const Property::Value& propertyValue = *it;
771 propertyValue.Get( mark );
772 mark = MapValuePercentage( mark );
774 // If close to a mark, return the mark
775 if( fabsf( mark - value ) < MARK_TOLERANCE )
784 float Slider::SnapToMark( float value )
786 float closestMark = value;
787 float closestDist = std::numeric_limits<float>::max();
790 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
792 const Property::Value& propertyValue = *it;
793 propertyValue.Get( mark );
794 mark = MapValuePercentage( mark );
796 float dist = fabsf( mark - value );
797 if( dist < closestDist )
807 bool Slider::MarkReached( float value, int& outIndex )
809 const float MARK_TOLERANCE = GetMarkTolerance();
813 tail = mMarks.size() - 1;
817 while( head <= tail )
819 current = head + ( tail - head ) / 2;
821 const Property::Value& propertyValue = mMarks[ current ];
822 propertyValue.Get( mark );
823 mark = MapValuePercentage( mark );
825 if( fabsf( mark - value ) < MARK_TOLERANCE )
846 bool Slider::HideValueView()
850 mValueDisplay.SetVisible( false );
856 void Slider::SetLowerBound( float bound )
859 DisplayValue( GetValue(), false );
862 float Slider::GetLowerBound() const
867 void Slider::SetUpperBound( float bound )
870 DisplayValue( GetValue(), false );
873 float Slider::GetUpperBound() const
878 void Slider::SetValue( float value )
881 DisplayValue( mValue, true );
884 float Slider::GetValue() const
889 void Slider::SetBackingRegion( const Vector2& region )
891 mBackingRegion = region;
895 mBacking.SetSize( mBackingRegion );
898 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
900 mDomain = CalcDomain( mBackingRegion );
902 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
905 const Vector2& Slider::GetBackingRegion() const
907 return mBackingRegion;
910 void Slider::SetHandleRegion( const Vector2& region )
912 mHandleRegionSize = region;
914 ResizeHandleRegion( mHandleRegionSize );
916 Vector2 hitRegion = GetHitRegion();
917 hitRegion.x += mHandleRegionSize.x;
918 SetHitRegion( hitRegion );
921 const Vector2& Slider::GetHandleRegion() const
923 return mHandleRegionSize;
926 void Slider::SetDisableColor( const Vector4& color )
928 mDisableColor = color;
933 Vector4 Slider::GetDisableColor() const
935 return mDisableColor;
938 Vector4 Slider::GetPopupTextColor() const
940 return mPopupTextColor;
943 void Slider::SetValuePrecision( int precision )
945 mValuePrecision = precision;
948 int Slider::GetValuePrecision() const
950 return mValuePrecision;
953 void Slider::SetShowPopup( bool showPopup )
955 mShowPopup = showPopup;
968 bool Slider::GetShowPopup() const
973 void Slider::SetShowValue( bool showValue )
975 mShowValue = showValue;
979 CreateHandleValueDisplay();
983 DestroyHandleValueDisplay();
987 bool Slider::GetShowValue() const
992 void Slider::SetEnabled( bool enabled )
1006 bool Slider::IsEnabled() const
1008 return mState != DISABLED;
1011 void Slider::SetMarkTolerance( float tolerance )
1013 mMarkTolerance = tolerance;
1016 float Slider::GetMarkTolerance() const
1018 return mMarkTolerance;
1021 // static class method to support script connecting signals
1023 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
1025 Dali::BaseHandle handle( object );
1027 bool connected = true;
1028 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1030 if( signalName == Dali::Toolkit::Slider::SIGNAL_VALUE_CHANGED )
1032 slider.ValueChangedSignal().Connect( tracker, functor );
1034 else if( signalName == Dali::Toolkit::Slider::SIGNAL_MARK )
1036 slider.MarkSignal().Connect( tracker, functor );
1040 // signalName does not match any signal
1047 void Slider::DisplayPopup( float value )
1049 // Value displayDoConnectSignal
1050 if( mValueTextView )
1052 std::stringstream ss;
1053 ss.precision( GetValuePrecision() );
1054 ss << std::fixed << value;
1055 mValueTextView.SetText( ss.str() );
1057 style.SetTextColor( GetPopupTextColor() );
1058 mValueTextView.SetStyleToCurrentText( style, TextStyle::COLOR);
1062 Font font = Font::New();
1063 float popupWidth = font.MeasureText( ss.str() ).x + VALUE_POPUP_MARGIN * 2.0f;
1064 if( popupWidth < VALUE_POPUP_MIN_WIDTH )
1066 popupWidth = VALUE_POPUP_MIN_WIDTH;
1069 mPopup.SetSize( popupWidth, VALUE_POPUP_HEIGHT );
1070 mValueDisplay.SetVisible( true );
1072 mValueTimer.SetInterval( VALUE_VIEW_SHOW_DURATION );
1077 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1079 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1083 Slider& sliderImpl( GetImpl( slider ) );
1085 switch ( propertyIndex )
1087 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1089 sliderImpl.SetLowerBound( value.Get< float >() );
1093 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1095 sliderImpl.SetUpperBound( value.Get< float >() );
1099 case Toolkit::Slider::VALUE_PROPERTY:
1101 sliderImpl.SetValue( value.Get< float >() );
1105 case Toolkit::Slider::HIT_REGION_PROPERTY:
1107 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1111 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1113 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1117 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1119 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1123 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1125 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1129 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1131 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1135 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1137 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1141 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1143 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1147 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1149 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1153 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1155 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1159 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1161 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1165 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1167 sliderImpl.SetValuePrecision( value.Get< int >() );
1171 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1173 sliderImpl.SetShowPopup( value.Get< bool >() );
1177 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1179 sliderImpl.SetShowValue( value.Get< bool >() );
1183 case Toolkit::Slider::ENABLED_PROPERTY:
1185 sliderImpl.SetEnabled( value.Get< bool >() );
1189 case Toolkit::Slider::MARKS_PROPERTY:
1191 sliderImpl.SetMarks( value.Get< Property::Array >() );
1195 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1197 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1201 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1203 sliderImpl.SetMarkTolerance( value.Get< float >() );
1210 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1212 Property::Value value;
1214 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1218 Slider& sliderImpl( GetImpl( slider ) );
1220 switch ( propertyIndex )
1222 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1224 value = sliderImpl.GetLowerBound();
1228 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1230 value = sliderImpl.GetUpperBound();
1234 case Toolkit::Slider::VALUE_PROPERTY:
1236 value = sliderImpl.GetValue();
1240 case Toolkit::Slider::HIT_REGION_PROPERTY:
1242 value = sliderImpl.GetHitRegion();
1246 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1248 value = sliderImpl.GetBackingRegion();
1252 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1254 value = sliderImpl.GetHandleRegion();
1258 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1260 value = sliderImpl.GetBackingImageName();
1264 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1266 value = sliderImpl.GetHandleImageName();
1270 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1272 value = sliderImpl.GetProgressImageName();
1276 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1278 value = sliderImpl.GetPopupImageName();
1282 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1284 value = sliderImpl.GetPopupArrowImageName();
1288 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1290 value = sliderImpl.GetDisableColor();
1294 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1296 value = sliderImpl.GetPopupTextColor();
1300 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1302 value = sliderImpl.GetValuePrecision();
1306 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1308 value = sliderImpl.GetShowPopup();
1312 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1314 value = sliderImpl.GetShowValue();
1318 case Toolkit::Slider::ENABLED_PROPERTY:
1320 value = sliderImpl.IsEnabled();
1324 case Toolkit::Slider::MARKS_PROPERTY:
1326 // TODO: Need to be able to return a PropertyArray
1327 // value = sliderImpl.GetMarks();
1331 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1333 value = sliderImpl.GetSnapToMarks();
1337 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1339 value = sliderImpl.GetMarkTolerance();
1348 } // namespace Internal
1350 } // namespace Toolkit