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>
23 #include <dali/public-api/events/touch-event.h>
24 #include <dali/public-api/object/type-registry.h>
25 #include <dali/public-api/images/resource-image.h>
28 #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 const char* const SIGNAL_VALUE_CHANGED = "value-changed";
121 const char* const SIGNAL_MARK = "mark";
125 return Dali::Toolkit::Slider::New();
128 TypeRegistration typeRegistration( typeid( Dali::Toolkit::Slider ), typeid( Dali::Toolkit::Control ), Create );
130 SignalConnectorType signalConnector1( typeRegistration, SIGNAL_VALUE_CHANGED, &Toolkit::Internal::Slider::DoConnectSignal );
131 SignalConnectorType signalConnector2( typeRegistration, SIGNAL_MARK, &Toolkit::Internal::Slider::DoConnectSignal );
133 PropertyRegistration property1( typeRegistration, "lower-bound", Toolkit::Slider::LOWER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
134 PropertyRegistration property2( typeRegistration, "upper-bound", Toolkit::Slider::UPPER_BOUND_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
135 PropertyRegistration property3( typeRegistration, "value", Toolkit::Slider::VALUE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
137 PropertyRegistration property4( typeRegistration, "hit-region", Toolkit::Slider::HIT_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
138 PropertyRegistration property5( typeRegistration, "backing-region", Toolkit::Slider::BACKING_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
139 PropertyRegistration property6( typeRegistration, "handle-region", Toolkit::Slider::HANDLE_REGION_PROPERTY, Property::VECTOR2, &Slider::SetProperty, &Slider::GetProperty );
141 PropertyRegistration property7( typeRegistration, "backing-image-name", Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
142 PropertyRegistration property8( typeRegistration, "handle-image-name", Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
143 PropertyRegistration property9( typeRegistration, "progress-image-name", Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
144 PropertyRegistration property10( typeRegistration, "popup-image-name", Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
145 PropertyRegistration property11( typeRegistration, "popup-arrow-image-name", Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY, Property::STRING, &Slider::SetProperty, &Slider::GetProperty );
147 PropertyRegistration property12( typeRegistration, "disable-color", Toolkit::Slider::DISABLE_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
148 PropertyRegistration property13( typeRegistration, "popup-text-color", Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY, Property::VECTOR4, &Slider::SetProperty, &Slider::GetProperty );
150 PropertyRegistration property14( typeRegistration, "value-precision", Toolkit::Slider::VALUE_PRECISION_PROPERTY, Property::INTEGER, &Slider::SetProperty, &Slider::GetProperty );
152 PropertyRegistration property15( typeRegistration, "show-popup", Toolkit::Slider::SHOW_POPUP_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
153 PropertyRegistration property16( typeRegistration, "show-value", Toolkit::Slider::SHOW_VALUE_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
155 PropertyRegistration property17( typeRegistration, "enabled", Toolkit::Slider::ENABLED_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
157 PropertyRegistration property18( typeRegistration, "marks", Toolkit::Slider::MARKS_PROPERTY, Property::ARRAY, &Slider::SetProperty, &Slider::GetProperty );
158 PropertyRegistration property19( typeRegistration, "snap-to-marks", Toolkit::Slider::SNAP_TO_MARKS_PROPERTY, Property::BOOLEAN, &Slider::SetProperty, &Slider::GetProperty );
159 PropertyRegistration property20( typeRegistration, "mark-tolerance", Toolkit::Slider::MARK_TOLERANCE_PROPERTY, Property::FLOAT, &Slider::SetProperty, &Slider::GetProperty );
163 ///////////////////////////////////////////////////////////////////////////////////////////////////
165 ///////////////////////////////////////////////////////////////////////////////////////////////////
167 Dali::Toolkit::Slider Slider::New()
169 // Create the implementation
170 SliderPtr slider( new Slider() );
172 // Pass ownership to CustomActor via derived handle
173 Dali::Toolkit::Slider handle( *slider );
175 // Second-phase init of the implementation
176 // This can only be done after the CustomActor connection has been made...
177 slider->Initialize();
183 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
185 mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
186 mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
187 mHitRegion( 0.0f, 0.0f ),
188 mBackingRegion( 0.0f, 0.0f ),
189 mHandleRegionSize( 0.0f, 0.0f ),
193 mMarkTolerance( 0.0f ),
194 mValuePrecision( 0 ),
197 mSnapToMarks( false )
205 void Slider::OnInitialize()
213 SetHitRegion( DEFAULT_HIT_REGION );
214 SetBackingRegion( DEFAULT_BACKING_REGION );
215 SetHandleRegion( DEFAULT_HANDLE_REGION );
217 SetBackingImageName( SKINNED_BACKING_IMAGE_NAME );
218 SetHandleImageName( SKINNED_HANDLE_IMAGE_NAME );
219 SetProgressImageName( SKINNED_PROGRESS_IMAGE_NAME );
220 SetPopupImageName( SKINNED_POPUP_IMAGE_NAME );
221 SetPopupArrowImageName( SKINNED_POPUP_ARROW_IMAGE_NAME );
223 SetPopupTextColor( DEFAULT_POPUP_TEXT_COLOR );
225 SetShowPopup( DEFAULT_SHOW_POPUP );
226 SetShowValue( DEFAULT_SHOW_VALUE );
228 SetEnabled( DEFAULT_ENABLED );
229 SetDisableColor( DEFAULT_DISABLE_COLOR );
231 SetSnapToMarks( DEFAULT_SNAP_TO_MARKS );
232 SetMarkTolerance( MARK_SNAP_TOLERANCE );
234 SetLowerBound( DEFAULT_LOWER_BOUND );
235 SetUpperBound( DEFAULT_UPPER_BOUND );
237 SetValuePrecision( DEFAULT_VALUE_PRECISION );
238 mValue = DEFAULT_VALUE;
239 DisplayValue( mValue, false ); // Run this last to display the correct value
241 // Size the Slider actor to a default
242 self.SetSize( DEFAULT_HIT_REGION.x, DEFAULT_HIT_REGION.y );
245 void Slider::OnControlSizeSet( const Vector3& size )
247 // Factor in handle overshoot into size of backing
248 SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
249 SetBackingRegion( Vector2( size.x - GetHandleRegion().x, GetBackingRegion().y ) );
252 bool Slider::OnTouchEvent(Actor actor, const TouchEvent& event)
254 if( mState != DISABLED )
256 TouchPoint::State touchState = event.GetPoint(0).state;
258 if( touchState == TouchPoint::Down )
262 float percentage = MapPercentage( event.GetPoint(0).local );
263 float value = MapBounds( ( GetSnapToMarks() ) ? SnapToMark( percentage ) : MarkFilter( percentage ), GetLowerBound(), GetUpperBound() );
265 DisplayPopup( value );
267 else if( touchState == TouchPoint::Up)
269 if( mState == PRESSED )
272 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
280 void Slider::OnPan( Actor actor, const PanGesture& gesture )
282 // gesture.position is in local actor coordinates
283 if( mState != DISABLED )
285 switch( gesture.state )
287 case Gesture::Continuing:
289 if( mState == PRESSED )
291 float value = MapBounds( MarkFilter ( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
293 DisplayPopup( value );
297 case Gesture::Finished:
299 if( mState == PRESSED )
301 if( GetSnapToMarks() )
303 float value = MapBounds( SnapToMark( MapPercentage( gesture.position ) ), GetLowerBound(), GetUpperBound() );
305 DisplayPopup( value );
307 mSlidingFinishedSignal.Emit( Toolkit::Slider::DownCast( Self() ), GetValue() );
321 float Slider::HitSpaceToDomain( float x )
323 float halfRegionWidth = GetHitRegion().x * 0.5f;
324 float halfDomainWidth = ( mDomain.to.x - mDomain.from.x ) * 0.5f;
325 float endDiff = halfRegionWidth - halfDomainWidth;
330 float Slider::MapPercentage( const Vector2& point )
332 return Clamp( ( HitSpaceToDomain( point.x ) - mDomain.from.x ) / ( mDomain.to.x - mDomain.from.x ), 0.0f, 1.0f );
335 float Slider::MapValuePercentage( float value )
337 return ( value - GetLowerBound() ) / ( GetUpperBound() - GetLowerBound() );
340 float Slider::MapBounds( float percent, float lowerBound, float upperBound )
342 return lowerBound + percent * ( upperBound - lowerBound );
345 Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
347 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
350 void Slider::DisplayValue( float value, bool raiseSignals )
352 float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
354 float percent = MapValuePercentage( clampledValue );
356 float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
358 mHandle.SetPosition( x, 0.0f, HANDLE_Z );
363 if( clampledValue > 0.0f )
365 mProgress.SetVisible( true ); // Deliberately set this in case multiple SetValues are fired at once
366 mProgress.SetSize( x, GetBackingRegion().y );
370 mProgress.SetVisible( false );
377 Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
378 mValueChangedSignal.Emit( self, clampledValue );
381 if( MarkReached( percent, markIndex ) )
383 mMarkSignal.Emit( self, markIndex );
387 if( mHandleValueTextView )
389 std::stringstream ss;
390 ss.precision( GetValuePrecision() );
391 ss << std::fixed << clampledValue;
392 mHandleValueTextView.SetText( ss.str() );
396 void Slider::SetMarks( const MarkList& marks )
399 for( MarkList::const_iterator it = marks.begin(), itEnd = marks.end(); it != itEnd; ++it )
401 const Property::Value& propertyValue = *it;
402 propertyValue.Get( value );
404 mMarks.push_back( value );
408 const Slider::MarkList& Slider::GetMarks() const
413 void Slider::SetSnapToMarks( bool snap )
418 bool Slider::GetSnapToMarks() const
423 Actor Slider::CreateHitRegion()
425 Actor hitRegion = Actor::New();
426 hitRegion.SetParentOrigin( ParentOrigin::CENTER );
427 hitRegion.SetAnchorPoint( AnchorPoint::CENTER );
428 hitRegion.TouchedSignal().Connect( this, &Slider::OnTouchEvent );
433 ImageActor Slider::CreateBacking()
435 ImageActor backing = ImageActor::New();
436 backing.SetParentOrigin( ParentOrigin::CENTER );
437 backing.SetAnchorPoint( AnchorPoint::CENTER );
438 backing.SetZ( BACKING_Z );
443 void Slider::SetBackingImageName( const std::string& imageName )
445 if( mBacking && ( imageName.size() > 0 ) )
447 Image image = ResourceImage::New( imageName );
448 mBacking.SetImage( image );
452 std::string Slider::GetBackingImageName()
456 return ResourceImage::DownCast( mBacking.GetImage() ).GetUrl();
459 return std::string( "" );
462 ImageActor Slider::CreateProgress()
464 ImageActor progress = ImageActor::New();
465 progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
466 progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
467 progress.SetZ( PROGRESS_Z );
472 void Slider::SetProgressImageName( const std::string& imageName )
474 if( mProgress && ( imageName.size() > 0 ) )
476 Image image = ResourceImage::New( imageName );
477 mProgress.SetImage( image );
481 std::string Slider::GetProgressImageName()
485 return ResourceImage::DownCast( mProgress.GetImage()).GetUrl();
488 return std::string( "" );
491 void Slider::SetPopupImageName( const std::string& imageName )
493 mPopupImageName = imageName;
496 std::string Slider::GetPopupImageName()
498 return mPopupImageName;
501 void Slider::CreatePopupImage( const std::string& imageName )
503 if( mPopup && ( imageName.size() > 0 ) )
505 Image image = ResourceImage::New( imageName );
506 mPopup.SetImage( image );
510 void Slider::SetPopupArrowImageName( const std::string& imageName )
512 mPopupArrowImageName = imageName;
515 std::string Slider::GetPopupArrowImageName()
517 return mPopupArrowImageName;
520 void Slider::CreatePopupArrowImage( const std::string& imageName )
522 if( mPopupArrow && ( imageName.size() > 0 ) )
524 Image image = ResourceImage::New( imageName );
525 mPopupArrow.SetImage( image );
529 void Slider::ResizeProgressRegion( const Vector2& region )
533 mProgress.SetSize( region );
537 ImageActor Slider::CreateHandle()
539 ImageActor handle = ImageActor::New();
540 handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
541 handle.SetAnchorPoint( AnchorPoint::CENTER );
542 handle.SetZ( HANDLE_Z );
547 ImageActor Slider::CreatePopupArrow()
549 ImageActor arrow = ImageActor::New();
550 arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
551 arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
552 arrow.SetZ( HANDLE_Z );
557 Toolkit::TextView Slider::CreatePopupText()
559 Toolkit::TextView textView = Toolkit::TextView::New();
560 textView.SetParentOrigin( ParentOrigin::CENTER );
561 textView.SetAnchorPoint( AnchorPoint::CENTER );
562 textView.SetSizePolicy( Toolkit::Control::Flexible, Toolkit::Control::Flexible );
563 textView.SetZ( VALUE_DISPLAY_TEXT_Z );
567 ImageActor Slider::CreatePopup()
569 ImageActor popup = ImageActor::New();
570 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
571 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
573 mValueTextView = CreatePopupText();
574 popup.Add( mValueTextView );
579 void Slider::SetHandleImageName( const std::string& imageName )
581 if( mHandle && ( imageName.size() > 0 ) )
583 Image image = ResourceImage::New( imageName );
584 mHandle.SetImage( image );
588 std::string Slider::GetHandleImageName()
592 return ResourceImage::DownCast( mHandle.GetImage() ).GetUrl();
595 return std::string( "" );
598 void Slider::ResizeHandleRegion( const Vector2& region )
602 mHandle.SetSize( region );
606 void Slider::CreateHandleValueDisplay()
608 if( mHandle && !mHandleValueTextView )
610 mHandleValueTextView = Toolkit::TextView::New();
611 mHandleValueTextView.SetParentOrigin( ParentOrigin::CENTER );
612 mHandleValueTextView.SetAnchorPoint( AnchorPoint::CENTER );
613 mHandleValueTextView.SetSize( GetHandleRegion() );
614 mHandleValueTextView.SetZ( HANDLE_VALUE_DISPLAY_TEXT_Z );
615 mHandle.Add( mHandleValueTextView );
619 void Slider::DestroyHandleValueDisplay()
621 if(mHandleValueTextView)
623 mHandleValueTextView.Unparent();
624 mHandleValueTextView.Reset();
628 void Slider::SetPopupTextColor( const Vector4& color )
630 mPopupTextColor = color;
633 Actor Slider::CreateValueDisplay()
635 Actor popup = Actor::New();
636 popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
637 popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
639 mPopupArrow = CreatePopupArrow();
640 popup.Add( mPopupArrow );
642 mPopup = CreatePopup();
643 mPopup.SetSize( 0.0f, VALUE_POPUP_HEIGHT );
644 mPopupArrow.Add( mPopup );
649 Toolkit::Slider::ValueChangedSignalType& Slider::ValueChangedSignal()
651 return mValueChangedSignal;
654 Toolkit::Slider::ValueChangedSignalType& Slider::SlidingFinishedSignal()
656 return mSlidingFinishedSignal;
659 Toolkit::Slider::MarkSignalType& Slider::MarkSignal()
664 void Slider::UpdateSkin()
670 mBacking.SetColor( Color::WHITE );
671 mHandle.SetColor( Color::WHITE );
672 mProgress.SetColor( Color::WHITE );
677 Vector4 disableColor = GetDisableColor();
678 mBacking.SetColor( disableColor );
679 mHandle.SetColor( disableColor );
680 mProgress.SetColor( disableColor );
694 void Slider::CreateChildren()
699 mHitArea = CreateHitRegion();
700 mPanDetector = PanGestureDetector::New();
701 mPanDetector.Attach( mHitArea );
702 mPanDetector.DetectedSignal().Connect( this, &Slider::OnPan );
703 self.Add( mHitArea );
706 mBacking = CreateBacking();
707 self.Add( mBacking );
710 mProgress = CreateProgress();
711 mBacking.Add( mProgress );
714 mHandle = CreateHandle();
715 mBacking.Add( mHandle );
718 void Slider::SetHitRegion( const Vector2& size )
724 mHitArea.SetSize( mHitRegion );
728 const Vector2& Slider::GetHitRegion() const
733 void Slider::AddPopup()
737 mValueDisplay = CreateValueDisplay();
738 mValueDisplay.SetVisible( false );
739 mHandle.Add( mValueDisplay );
741 CreatePopupImage( GetPopupImageName() );
742 CreatePopupArrowImage( GetPopupArrowImageName() );
744 mValueTimer = Timer::New( VALUE_VIEW_SHOW_DURATION );
745 mValueTimer.TickSignal().Connect( this, &Slider::HideValueView );
749 void Slider::RemovePopup()
756 mPopupArrow.Unparent();
759 mValueDisplay.Unparent();
760 mValueDisplay.Reset();
762 mValueTimer.TickSignal().Disconnect( this, &Slider::HideValueView );
768 float Slider::MarkFilter( float value )
770 const float MARK_TOLERANCE = GetMarkTolerance();
773 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
775 const Property::Value& propertyValue = *it;
776 propertyValue.Get( mark );
777 mark = MapValuePercentage( mark );
779 // If close to a mark, return the mark
780 if( fabsf( mark - value ) < MARK_TOLERANCE )
789 float Slider::SnapToMark( float value )
791 float closestMark = value;
792 float closestDist = std::numeric_limits<float>::max();
795 for( MarkList::iterator it = mMarks.begin(), itEnd = mMarks.end(); it != itEnd; ++it )
797 const Property::Value& propertyValue = *it;
798 propertyValue.Get( mark );
799 mark = MapValuePercentage( mark );
801 float dist = fabsf( mark - value );
802 if( dist < closestDist )
812 bool Slider::MarkReached( float value, int& outIndex )
814 const float MARK_TOLERANCE = GetMarkTolerance();
818 tail = mMarks.size() - 1;
822 while( head <= tail )
824 current = head + ( tail - head ) / 2;
826 const Property::Value& propertyValue = mMarks[ current ];
827 propertyValue.Get( mark );
828 mark = MapValuePercentage( mark );
830 if( fabsf( mark - value ) < MARK_TOLERANCE )
851 bool Slider::HideValueView()
855 mValueDisplay.SetVisible( false );
861 void Slider::SetLowerBound( float bound )
864 DisplayValue( GetValue(), false );
867 float Slider::GetLowerBound() const
872 void Slider::SetUpperBound( float bound )
875 DisplayValue( GetValue(), false );
878 float Slider::GetUpperBound() const
883 void Slider::SetValue( float value )
886 DisplayValue( mValue, true );
889 float Slider::GetValue() const
894 void Slider::SetBackingRegion( const Vector2& region )
896 mBackingRegion = region;
900 mBacking.SetSize( mBackingRegion );
903 ResizeProgressRegion( Vector2( 0.0f, mBackingRegion.y ) );
905 mDomain = CalcDomain( mBackingRegion );
907 DisplayValue( GetValue(), false ); // Set the progress bar to correct width
910 const Vector2& Slider::GetBackingRegion() const
912 return mBackingRegion;
915 void Slider::SetHandleRegion( const Vector2& region )
917 mHandleRegionSize = region;
919 ResizeHandleRegion( mHandleRegionSize );
921 Vector2 hitRegion = GetHitRegion();
922 hitRegion.x += mHandleRegionSize.x;
923 SetHitRegion( hitRegion );
926 const Vector2& Slider::GetHandleRegion() const
928 return mHandleRegionSize;
931 void Slider::SetDisableColor( const Vector4& color )
933 mDisableColor = color;
938 Vector4 Slider::GetDisableColor() const
940 return mDisableColor;
943 Vector4 Slider::GetPopupTextColor() const
945 return mPopupTextColor;
948 void Slider::SetValuePrecision( int precision )
950 mValuePrecision = precision;
953 int Slider::GetValuePrecision() const
955 return mValuePrecision;
958 void Slider::SetShowPopup( bool showPopup )
960 mShowPopup = showPopup;
973 bool Slider::GetShowPopup() const
978 void Slider::SetShowValue( bool showValue )
980 mShowValue = showValue;
984 CreateHandleValueDisplay();
988 DestroyHandleValueDisplay();
992 bool Slider::GetShowValue() const
997 void Slider::SetEnabled( bool enabled )
1011 bool Slider::IsEnabled() const
1013 return mState != DISABLED;
1016 void Slider::SetMarkTolerance( float tolerance )
1018 mMarkTolerance = tolerance;
1021 float Slider::GetMarkTolerance() const
1023 return mMarkTolerance;
1026 // Static class method to support script connecting signals
1027 bool Slider::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
1029 Dali::BaseHandle handle( object );
1031 bool connected = true;
1032 Toolkit::Slider slider = Toolkit::Slider::DownCast( handle );
1034 if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
1036 slider.ValueChangedSignal().Connect( tracker, functor );
1038 else if( 0 == strcmp( signalName.c_str(), SIGNAL_MARK ) )
1040 slider.MarkSignal().Connect( tracker, functor );
1044 // signalName does not match any signal
1051 void Slider::DisplayPopup( float value )
1053 // Value displayDoConnectSignal
1054 if( mValueTextView )
1056 std::stringstream ss;
1057 ss.precision( GetValuePrecision() );
1058 ss << std::fixed << value;
1059 mValueTextView.SetText( ss.str() );
1061 style.SetTextColor( GetPopupTextColor() );
1062 mValueTextView.SetStyleToCurrentText( style, TextStyle::COLOR);
1066 Font font = Font::New();
1067 float popupWidth = font.MeasureText( ss.str() ).x + VALUE_POPUP_MARGIN * 2.0f;
1068 if( popupWidth < VALUE_POPUP_MIN_WIDTH )
1070 popupWidth = VALUE_POPUP_MIN_WIDTH;
1073 mPopup.SetSize( popupWidth, VALUE_POPUP_HEIGHT );
1074 mValueDisplay.SetVisible( true );
1076 mValueTimer.SetInterval( VALUE_VIEW_SHOW_DURATION );
1081 void Slider::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
1083 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1087 Slider& sliderImpl( GetImpl( slider ) );
1089 switch ( propertyIndex )
1091 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1093 sliderImpl.SetLowerBound( value.Get< float >() );
1097 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1099 sliderImpl.SetUpperBound( value.Get< float >() );
1103 case Toolkit::Slider::VALUE_PROPERTY:
1105 sliderImpl.SetValue( value.Get< float >() );
1109 case Toolkit::Slider::HIT_REGION_PROPERTY:
1111 sliderImpl.SetHitRegion( value.Get< Vector2 >() );
1115 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1117 sliderImpl.SetBackingRegion( value.Get< Vector2 >() );
1121 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1123 sliderImpl.SetHandleRegion( value.Get< Vector2 >() );
1127 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1129 sliderImpl.SetBackingImageName( value.Get< std::string >() );
1133 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1135 sliderImpl.SetHandleImageName( value.Get< std::string >() );
1139 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1141 sliderImpl.SetProgressImageName( value.Get< std::string >() );
1145 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1147 sliderImpl.SetPopupImageName( value.Get< std::string >() );
1151 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1153 sliderImpl.SetPopupArrowImageName( value.Get< std::string >() );
1157 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1159 sliderImpl.SetDisableColor( value.Get< Vector4 >() );
1163 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1165 sliderImpl.SetPopupTextColor( value.Get< Vector4 >() );
1169 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1171 sliderImpl.SetValuePrecision( value.Get< int >() );
1175 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1177 sliderImpl.SetShowPopup( value.Get< bool >() );
1181 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1183 sliderImpl.SetShowValue( value.Get< bool >() );
1187 case Toolkit::Slider::ENABLED_PROPERTY:
1189 sliderImpl.SetEnabled( value.Get< bool >() );
1193 case Toolkit::Slider::MARKS_PROPERTY:
1195 sliderImpl.SetMarks( value.Get< Property::Array >() );
1199 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1201 sliderImpl.SetSnapToMarks( value.Get< bool >() );
1205 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1207 sliderImpl.SetMarkTolerance( value.Get< float >() );
1214 Property::Value Slider::GetProperty( BaseObject* object, Property::Index propertyIndex )
1216 Property::Value value;
1218 Toolkit::Slider slider = Toolkit::Slider::DownCast( Dali::BaseHandle( object ) );
1222 Slider& sliderImpl( GetImpl( slider ) );
1224 switch ( propertyIndex )
1226 case Toolkit::Slider::LOWER_BOUND_PROPERTY:
1228 value = sliderImpl.GetLowerBound();
1232 case Toolkit::Slider::UPPER_BOUND_PROPERTY:
1234 value = sliderImpl.GetUpperBound();
1238 case Toolkit::Slider::VALUE_PROPERTY:
1240 value = sliderImpl.GetValue();
1244 case Toolkit::Slider::HIT_REGION_PROPERTY:
1246 value = sliderImpl.GetHitRegion();
1250 case Toolkit::Slider::BACKING_REGION_PROPERTY:
1252 value = sliderImpl.GetBackingRegion();
1256 case Toolkit::Slider::HANDLE_REGION_PROPERTY:
1258 value = sliderImpl.GetHandleRegion();
1262 case Toolkit::Slider::BACKING_IMAGE_NAME_PROPERTY:
1264 value = sliderImpl.GetBackingImageName();
1268 case Toolkit::Slider::HANDLE_IMAGE_NAME_PROPERTY:
1270 value = sliderImpl.GetHandleImageName();
1274 case Toolkit::Slider::PROGRESS_IMAGE_NAME_PROPERTY:
1276 value = sliderImpl.GetProgressImageName();
1280 case Toolkit::Slider::POPUP_IMAGE_NAME_PROPERTY:
1282 value = sliderImpl.GetPopupImageName();
1286 case Toolkit::Slider::POPUP_ARROW_IMAGE_NAME_PROPERTY:
1288 value = sliderImpl.GetPopupArrowImageName();
1292 case Toolkit::Slider::DISABLE_COLOR_PROPERTY:
1294 value = sliderImpl.GetDisableColor();
1298 case Toolkit::Slider::POPUP_TEXT_COLOR_PROPERTY:
1300 value = sliderImpl.GetPopupTextColor();
1304 case Toolkit::Slider::VALUE_PRECISION_PROPERTY:
1306 value = sliderImpl.GetValuePrecision();
1310 case Toolkit::Slider::SHOW_POPUP_PROPERTY:
1312 value = sliderImpl.GetShowPopup();
1316 case Toolkit::Slider::SHOW_VALUE_PROPERTY:
1318 value = sliderImpl.GetShowValue();
1322 case Toolkit::Slider::ENABLED_PROPERTY:
1324 value = sliderImpl.IsEnabled();
1328 case Toolkit::Slider::MARKS_PROPERTY:
1330 // TODO: Need to be able to return a PropertyArray
1331 // value = sliderImpl.GetMarks();
1335 case Toolkit::Slider::SNAP_TO_MARKS_PROPERTY:
1337 value = sliderImpl.GetSnapToMarks();
1341 case Toolkit::Slider::MARK_TOLERANCE_PROPERTY:
1343 value = sliderImpl.GetMarkTolerance();
1352 } // namespace Internal
1354 } // namespace Toolkit