2 * Copyright (c) 2017 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/progress-bar/progress-bar-impl.h>
22 #include <cstring> // for strcmp
25 #include <dali/public-api/object/type-registry-helper.h>
26 #include <dali/public-api/size-negotiation/relayout-container.h>
27 #include <dali/public-api/math/math-utils.h>
28 #include <dali-toolkit/public-api/align-enumerations.h>
29 #include <dali-toolkit/devel-api/controls/control-devel.h>
30 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
31 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
32 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
33 #include <dali-toolkit/devel-api/visuals/arc-visual-properties-devel.h>
34 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
35 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
36 #include <dali-toolkit/public-api/visuals/text-visual-properties.h>
37 #include <dali-toolkit/public-api/visuals/visual-properties.h>
38 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
40 #include <dali/integration-api/debug.h>
51 namespace // Unnamed namespace
56 return Dali::Toolkit::ProgressBar::New();
59 // Setup properties, signals and actions using the type-registry.
60 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ProgressBar, Toolkit::Control, Create )
62 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressValue", FLOAT, PROGRESS_VALUE )
63 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressValue", FLOAT, SECONDARY_PROGRESS_VALUE )
64 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminate", BOOLEAN, INDETERMINATE )
65 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "trackVisual", MAP, TRACK_VISUAL )
66 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressVisual", MAP, PROGRESS_VISUAL )
67 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressVisual", MAP, SECONDARY_PROGRESS_VISUAL )
68 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisual", MAP, INDETERMINATE_VISUAL )
69 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisualAnimation", ARRAY, INDETERMINATE_VISUAL_ANIMATION )
70 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "labelVisual", MAP, LABEL_VISUAL )
71 DALI_SIGNAL_REGISTRATION( Toolkit, ProgressBar, "valueChanged", SIGNAL_VALUE_CHANGED )
73 DALI_TYPE_REGISTRATION_END()
75 struct ProgressDepthIndex
77 // Enum to make sure the visual order
81 SECONDARY_PROGRESS_VISUAL,
88 float DEFAULT_VALUE = 0.0f;
89 float DEFAULT_LOWER_BOUND = 0.0f;
90 float DEFAULT_UPPER_BOUND = 1.0f;
91 float DEFAULT_FONT_SIZE = 12.0f;
92 const char* CIRCULAR_PROGRESS_BAR_STYLE_NAME = "CircularProgressBar";
95 void BackupVisualProperties( const Control* control, Property::Index index, Property::Map& map )
97 Toolkit::Visual::Base visual = DevelControl::GetVisual( *control, index );
102 visual.CreatePropertyMap( map );
106 void RestoreVisualProperties( Control* control, Property::Index index, Property::Map& map, int depth )
110 Toolkit::Visual::Base visual = DevelControl::GetVisual( *control, index );
112 Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
114 visualImpl.SetProperties( map );
116 DevelControl::UnregisterVisual( *control, index );
118 DevelControl::RegisterVisual( *control, index, visual, true, depth );
122 } // Unnamed namespace
124 ///////////////////////////////////////////////////////////////////////////////////////////////////
126 ///////////////////////////////////////////////////////////////////////////////////////////////////
128 Dali::Toolkit::ProgressBar ProgressBar::New( DevelProgressBar::Style progressBarStyle )
130 // Create the implementation
131 ProgressBarPtr progressBar( new ProgressBar() );
133 Dali::Toolkit::ProgressBar handle( *progressBar );
135 switch( progressBarStyle )
137 case DevelProgressBar::Style::CIRCULAR:
139 progressBar->SetStyleName( CIRCULAR_PROGRESS_BAR_STYLE_NAME );
148 // Second-phase init of the implementation
149 // This can only be done after the CustomActor connection has been made...
150 progressBar->Initialize();
155 ProgressBar::ProgressBar()
156 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
157 mProgressValue( DEFAULT_VALUE ),
158 mSecondaryProgressValue( DEFAULT_VALUE ),
159 mIndeterminate( false )
163 ProgressBar::~ProgressBar()
167 void ProgressBar::OnInitialize()
169 DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) {
170 return std::unique_ptr< Dali::Accessibility::Accessible >(
171 new AccessibleImpl( actor, Dali::Accessibility::Role::PROGRESS_BAR ) );
173 //Enable highightability
174 Self().SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true );
177 void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container )
180 Vector2 trackSize( size );
181 mDomain = CalcDomain( size );
183 trackSize.width = std::max( 0.0f, size.width ); // Ensure we don't go negative
185 Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
186 Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
187 Toolkit::Visual::Base indeterminateVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL );
191 Property::Map visualTransform;
193 visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
194 .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
195 .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
197 trackVisual.SetTransformAndSize( visualTransform, trackSize );
200 ApplyProgressToVisualTransform( mSecondaryProgressValue, trackSize, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL );
202 ApplyProgressToVisualTransform( mProgressValue, trackSize, Toolkit::ProgressBar::Property::PROGRESS_VISUAL );
206 Property::Map visualTransform;
208 visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
209 .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
210 .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
211 labelVisual.SetTransformAndSize( visualTransform, trackSize );
214 if( indeterminateVisual )
216 Property::Map visualTransform;
218 visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
219 .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
220 .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
221 indeterminateVisual.SetTransformAndSize( visualTransform, trackSize );
226 Vector3 ProgressBar::GetNaturalSize()
228 // Return the bigger size after comparing trackVisual naturalSize and labelVisual naturalSize
229 Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
230 Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
237 trackVisual.GetNaturalSize( trackSize );
241 labelVisual.GetNaturalSize( labelSize );
245 naturalSize.width = ( trackSize.width > labelSize.width ) ? trackSize.width: labelSize.width;
246 naturalSize.height = ( trackSize.height > labelSize.height ) ? trackSize.height: labelSize.height;
251 ProgressBar::Domain ProgressBar::CalcDomain( const Vector2& currentSize )
253 return Domain( Vector2( 0.0f, 0.0f ), currentSize );
256 Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal()
258 return mValueChangedSignal;
261 void ProgressBar::SetProgressValue( float value )
263 // update the progress bar value (taking float precision errors into account)
264 // TODO : it seems 0.0f cannot into this statement.
265 if( ( mProgressValue != value ) &&
266 ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
267 ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
269 mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
271 ApplyProgressToVisual( mProgressValue, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, ProgressDepthIndex::PROGRESS_VISUAL );
273 Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
274 mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
275 if (Self() == Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor())
277 Control::Impl::GetAccessibilityObject(Self())->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::VALUE);
283 float ProgressBar::GetProgressValue() const
285 return mProgressValue;
288 void ProgressBar::SetSecondaryProgressValue( float value )
290 // update the progress bar value (taking float precision errors into account)
291 // TODO : it seems 0.0f cannot into this statement.
292 if( ( mSecondaryProgressValue != value ) &&
293 ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
294 ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
296 mSecondaryProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
298 ApplyProgressToVisual( mSecondaryProgressValue, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
300 Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
301 mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
307 float ProgressBar::GetSecondaryProgressValue() const
309 return mSecondaryProgressValue;
312 void ProgressBar::SetIndeterminate( bool value )
314 mIndeterminate = value;
315 DevelControl::EnableVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate );
320 if( mIndeterminateVisualTransition )
322 PlayIndeterminateVisualTransition();
327 if( mIndeterminateVisualAni )
329 mIndeterminateVisualAni.Stop();
332 // Restore previous visual data after animation finished.
333 RestoreVisualProperties( this, Toolkit::ProgressBar::Property::TRACK_VISUAL, mTrackVisualMap, ProgressDepthIndex::TRACK_VISUAL );
334 RestoreVisualProperties( this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, mSecondaryProgressVisualMap, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
335 RestoreVisualProperties( this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, mProgressVisualMap, ProgressDepthIndex::PROGRESS_VISUAL );
341 bool ProgressBar::GetIndeterminate() const
343 return mIndeterminate;
346 void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData transition )
348 mIndeterminateVisualTransition = transition;
351 PlayIndeterminateVisualTransition();
355 void ProgressBar::PlayIndeterminateVisualTransition()
357 // Store current visual data before animation changes it.
358 BackupVisualProperties( this, Toolkit::ProgressBar::Property::TRACK_VISUAL, mTrackVisualMap );
359 BackupVisualProperties( this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, mSecondaryProgressVisualMap );
360 BackupVisualProperties( this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, mProgressVisualMap );
362 if( mIndeterminateVisualAni )
364 mIndeterminateVisualAni.Stop();
365 mIndeterminateVisualAni.Clear();
368 mIndeterminateVisualAni = DevelControl::CreateTransition( *this, mIndeterminateVisualTransition );
370 if( mIndeterminate && mIndeterminateVisualAni )
372 mIndeterminateVisualAni.SetLooping(true);
373 mIndeterminateVisualAni.Play();
377 Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property::Value& value )
379 Toolkit::TransitionData transitionData;
381 if( value.GetType() == Property::ARRAY )
383 transitionData = Toolkit::TransitionData::New( *value.GetArray() );
385 else if( value.GetType() == Property::MAP )
387 transitionData = Toolkit::TransitionData::New( *value.GetMap() );
390 return transitionData;
394 * Create Visual for given index from a property map or url.
395 * 1) Check if value passed in is a url and create visual
396 * 2) Create visual from map if step (1) is false
397 * 3) Register visual with control with false for enable flag.
398 * 4) Unregister visual if empty map was provided. This is the method to remove a visual
401 void ProgressBar::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const int visualDepth )
403 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
404 Toolkit::Visual::Base progressVisual;
406 std::string imageUrl;
407 if( value.Get( imageUrl ) )
409 if ( !imageUrl.empty() )
411 progressVisual = visualFactory.CreateVisual( imageUrl, ImageDimensions() );
414 else // Does this code make text-visual can be accepted as visual?
416 // if its not a string then get a Property::Map from the property if possible.
417 const Property::Map *map = value.GetMap();
418 if( map && !map->Empty() ) // Empty map results in current visual removal.
420 progressVisual = visualFactory.CreateVisual( *map );
424 if ( progressVisual )
426 if( index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL )
428 DevelControl::RegisterVisual( *this, index, progressVisual, mIndeterminate, visualDepth );
432 DevelControl::RegisterVisual( *this, index, progressVisual, true, visualDepth );
437 DevelControl::UnregisterVisual( *this, index );
441 bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const
443 bool success = false;
444 Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex );
448 visual.CreatePropertyMap( retreivedMap );
456 void ProgressBar::ApplyProgressToVisual( float progress, Property::Index index, int depth )
458 Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, index );
460 if( visual && static_cast<DevelVisual::Type>( visual.GetType() ) == DevelVisual::ARC && !mIndeterminate )
462 Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
466 map[ Toolkit::DevelArcVisual::Property::SWEEP_ANGLE ] = Property::Value( 360.0f * progress );
468 visualImpl.SetProperties( map );
470 DevelControl::UnregisterVisual( *this, index );
471 DevelControl::RegisterVisual( *this, index, visual, true, depth );
475 void ProgressBar::ApplyProgressToVisualTransform( float progress, Vector2 trackSize, Property::Index index )
477 Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, index );
481 Property::Map visualTransform;
483 if( static_cast<DevelVisual::Type>( visual.GetType() ) != DevelVisual::ARC )
485 visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, Vector2( mDomain.from.x + progress * ( mDomain.to.x - mDomain.from.x ), trackSize.height ) )
486 .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
487 .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
488 .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
489 .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
492 visual.SetTransformAndSize( visualTransform, trackSize );
496 // Static class method to support script connecting signals
497 bool ProgressBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
499 Dali::BaseHandle handle( object );
501 bool connected = true;
502 Toolkit::ProgressBar ProgressBar = Toolkit::ProgressBar::DownCast( handle );
504 if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
506 ProgressBar.ValueChangedSignal().Connect( tracker, functor );
510 // signalName does not match any signal
517 void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
519 Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
523 ProgressBar& progressBarImpl( GetImpl( progressBar ) );
525 switch ( propertyIndex )
527 case Toolkit::ProgressBar::Property::TRACK_VISUAL:
529 progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL );
533 case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
535 progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
536 progressBarImpl.ApplyProgressToVisual( progressBarImpl.mSecondaryProgressValue, propertyIndex, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
540 case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
542 progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL );
543 progressBarImpl.ApplyProgressToVisual( progressBarImpl.mProgressValue, propertyIndex, ProgressDepthIndex::PROGRESS_VISUAL );
547 case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
549 progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL );
553 case Toolkit::ProgressBar::Property::LABEL_VISUAL:
556 std::string textString;
558 if ( value.Get( textString ) )
560 // set new text string as TEXT property
561 Property::Map newTextMap;
562 Toolkit::Visual::Base label = DevelControl::GetVisual( progressBarImpl, Toolkit::ProgressBar::Property::LABEL_VISUAL );
566 label.CreatePropertyMap( map );
569 // if LABEL_VISUAL doesn't set before, add Visual property "TYPE" to create new text Visual
572 newTextMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT );
573 newTextMap.Add( Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE );
575 newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString );
577 map.Merge( newTextMap );
586 progressBarImpl.CreateVisualsForComponent( propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL );
591 case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
593 progressBarImpl.SetProgressValue( value.Get< float >() );
597 case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
599 progressBarImpl.SetSecondaryProgressValue( value.Get< float >() );
603 case Toolkit::ProgressBar::Property::INDETERMINATE:
605 progressBarImpl.SetIndeterminate( value.Get< bool >() );
609 case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
611 progressBarImpl.SetIndeterminateVisualTransition( progressBarImpl.ConvertPropertyToTransition( value ) );
618 Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index propertyIndex )
620 Property::Value value;
622 Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
626 ProgressBar& progressBarImpl( GetImpl( progressBar ) );
628 switch ( propertyIndex )
630 case Toolkit::ProgressBar::Property::TRACK_VISUAL:
631 case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
632 case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
633 case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
634 case Toolkit::ProgressBar::Property::LABEL_VISUAL:
636 Property::Map visualProperty;
637 if ( progressBarImpl.GetPropertyMapForVisual( propertyIndex, visualProperty ) )
639 value = visualProperty;
644 case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
646 value = progressBarImpl.GetProgressValue();
650 case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
652 value = progressBarImpl.GetSecondaryProgressValue();
656 case Toolkit::ProgressBar::Property::INDETERMINATE:
658 value = progressBarImpl.GetIndeterminate();
662 case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
664 //TODO: Return INDETERMINATE_VISUAL_TRANSITION;
672 void ProgressBar::OnSceneConnection( int depth )
674 // Chain up first (ensures visuals are ready to draw)
675 Control::OnSceneConnection( depth );
679 PlayIndeterminateVisualTransition();
683 double ProgressBar::AccessibleImpl::GetMinimum() { return DEFAULT_LOWER_BOUND; }
685 double ProgressBar::AccessibleImpl::GetCurrent()
687 auto p = Toolkit::ProgressBar::DownCast( self );
688 return p.GetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE )
692 double ProgressBar::AccessibleImpl::GetMaximum() { return DEFAULT_UPPER_BOUND; }
694 bool ProgressBar::AccessibleImpl::SetCurrent( double current )
696 if( current < GetMinimum() || current > GetMaximum() )
698 auto p = Toolkit::ProgressBar::DownCast( self );
699 p.SetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE,
700 static_cast< float >( current ) );
704 double ProgressBar::AccessibleImpl::GetMinimumIncrement() { return 0.0; }
706 } // namespace Internal
708 } // namespace Toolkit