[Tizen](ATSPI) squashed implementation
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / progress-bar / progress-bar-impl.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-toolkit/internal/controls/progress-bar/progress-bar-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <cstring> // for strcmp
23 #include <sstream>
24 #include <algorithm>
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/public-api/visuals/color-visual-properties.h>
32 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
33 #include <dali-toolkit/public-api/visuals/text-visual-properties.h>
34 #include <dali-toolkit/public-api/visuals/visual-properties.h>
35 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
36
37 #include <dali/integration-api/debug.h>
38
39 namespace Dali
40 {
41
42 namespace Toolkit
43 {
44
45 namespace Internal
46 {
47
48 namespace // Unnamed namespace
49 {
50
51 BaseHandle Create()
52 {
53   return Dali::Toolkit::ProgressBar::New();
54 }
55
56 // Setup properties, signals and actions using the type-registry.
57 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ProgressBar, Toolkit::Control, Create )
58
59 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressValue",                     FLOAT,    PROGRESS_VALUE                   )
60 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressValue",            FLOAT,    SECONDARY_PROGRESS_VALUE         )
61 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminate",                     BOOLEAN,  INDETERMINATE                    )
62 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "trackVisual",                       MAP,      TRACK_VISUAL                     )
63 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressVisual",                    MAP,      PROGRESS_VISUAL                  )
64 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressVisual",           MAP,      SECONDARY_PROGRESS_VISUAL        )
65 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisual",               MAP,      INDETERMINATE_VISUAL             )
66 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisualAnimation",      ARRAY,    INDETERMINATE_VISUAL_ANIMATION   )
67 DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "labelVisual",                       MAP,      LABEL_VISUAL                     )
68 DALI_SIGNAL_REGISTRATION(   Toolkit, ProgressBar, "valueChanged",                      SIGNAL_VALUE_CHANGED                       )
69
70 DALI_TYPE_REGISTRATION_END()
71
72 struct ProgressDepthIndex
73 {
74   // Enum to make sure the visual order
75   enum
76   {
77     TRACK_VISUAL,
78     SECONDARY_PROGRESS_VISUAL,
79     PROGRESS_VISUAL,
80     LABEL_VISUAL,
81     INDETERMINATE_VISUAL
82   };
83 };
84
85 float DEFAULT_VALUE = 0.0f;
86 float DEFAULT_LOWER_BOUND = 0.0f;
87 float DEFAULT_UPPER_BOUND = 1.0f;
88 float DEFAULT_FONT_SIZE = 12.0f;
89
90 } // Unnamed namespace
91
92 ///////////////////////////////////////////////////////////////////////////////////////////////////
93 // ProgressBar
94 ///////////////////////////////////////////////////////////////////////////////////////////////////
95
96 Dali::Toolkit::ProgressBar ProgressBar::New()
97 {
98   // Create the implementation
99   ProgressBarPtr progressBar( new ProgressBar() );
100
101   // Pass ownership to CustomActor via derived handle
102   Dali::Toolkit::ProgressBar handle( *progressBar );
103
104   // Second-phase init of the implementation
105   // This can only be done after the CustomActor connection has been made...
106   progressBar->Initialize();
107
108   return handle;
109 }
110
111 ProgressBar::ProgressBar()
112 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
113   mProgressValue( DEFAULT_VALUE ),
114   mSecondaryProgressValue( DEFAULT_VALUE ),
115   mIndeterminate( false )
116 {
117   DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) {
118     return std::unique_ptr< Dali::Accessibility::Accessible >(
119         new AccessibleImpl( actor, Dali::Accessibility::Role::PROGRESS_BAR ) );
120   } );
121 }
122
123 ProgressBar::~ProgressBar()
124 {
125 }
126
127 void ProgressBar::OnInitialize()
128 {
129 }
130
131 void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container )
132 {
133
134   Vector2 trackSize( size );
135   mDomain = CalcDomain( size );
136
137   trackSize.width = std::max( 0.0f, size.width ); // Ensure we don't go negative
138
139   Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
140   Toolkit::Visual::Base secondProgressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL );
141   Toolkit::Visual::Base progressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL );
142   Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
143   Toolkit::Visual::Base indeterminateVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL );
144
145   if( trackVisual )
146   {
147     Property::Map visualTransform;
148
149     visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
150                    .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
151                    .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
152
153     trackVisual.SetTransformAndSize( visualTransform, trackSize );
154   }
155
156   if( secondProgressVisual )
157   {
158     Property::Map visualTransform;
159
160     visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, Vector2( mDomain.from.x + mSecondaryProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height  ) )
161                    .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
162                    .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
163                    .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
164                    .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
165     secondProgressVisual.SetTransformAndSize( visualTransform, trackSize );
166   }
167
168   if( progressVisual )
169   {
170     Property::Map visualTransform;
171
172     visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, Vector2( mDomain.from.x + mProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height ) )
173                    .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
174                    .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
175                    .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
176                    .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
177     progressVisual.SetTransformAndSize( visualTransform, trackSize );
178   }
179
180   if( labelVisual )
181   {
182     Property::Map visualTransform;
183
184     visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
185                    .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
186                    .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
187     labelVisual.SetTransformAndSize( visualTransform, trackSize );
188   }
189
190   if( indeterminateVisual )
191   {
192     Property::Map visualTransform;
193
194     visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, trackSize )
195                    .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
196                    .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) );
197     indeterminateVisual.SetTransformAndSize( visualTransform, trackSize );
198   }
199
200 }
201
202 Vector3 ProgressBar::GetNaturalSize()
203 {
204   // Return the bigger size after comparing trackVisual naturalSize and labelVisual naturalSize
205   Toolkit::Visual::Base trackVisual =  DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
206   Toolkit::Visual::Base labelVisual =  DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
207
208   Size trackSize;
209   Size labelSize;
210
211   if ( trackVisual )
212   {
213     trackVisual.GetNaturalSize( trackSize );
214   }
215   if ( labelVisual )
216   {
217     labelVisual.GetNaturalSize( labelSize );
218   }
219
220   Vector3 naturalSize;
221   naturalSize.width = ( trackSize.width > labelSize.width ) ? trackSize.width: labelSize.width;
222   naturalSize.height = ( trackSize.height > labelSize.height ) ? trackSize.height: labelSize.height;
223
224   return naturalSize;
225 }
226
227 ProgressBar::Domain ProgressBar::CalcDomain( const Vector2& currentSize )
228 {
229    return Domain( Vector2( 0.0f, 0.0f ), currentSize );
230 }
231
232 Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal()
233 {
234   return mValueChangedSignal;
235 }
236
237 void ProgressBar::SetProgressValue( float value )
238 {
239   // update the progress bar value (taking float precision errors into account)
240   // TODO : it seems 0.0f cannot into this statement.
241   if( ( mProgressValue != value ) &&
242       ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
243       ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
244   {
245     mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
246
247     Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
248     mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
249     RelayoutRequest();
250   }
251 }
252
253 float ProgressBar::GetProgressValue() const
254 {
255   return mProgressValue;
256 }
257
258 void ProgressBar::SetSecondaryProgressValue( float value )
259 {
260   // update the progress bar value (taking float precision errors into account)
261   // TODO : it seems 0.0f cannot into this statement.
262   if( ( mSecondaryProgressValue != value ) &&
263       ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
264       ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
265   {
266     mSecondaryProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
267
268     Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
269     mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
270
271     RelayoutRequest();
272   }
273 }
274
275 float ProgressBar::GetSecondaryProgressValue() const
276 {
277   return mSecondaryProgressValue;
278 }
279
280 void ProgressBar::SetIndeterminate( bool value )
281 {
282   mIndeterminate = value;
283   DevelControl::EnableVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate );
284
285   if( mIndeterminate )
286   {
287     RelayoutRequest();
288     if( mIndeterminateVisualTransition )
289     {
290       PlayIndeterminateVisualTransition();
291     }
292   }
293   else
294   {
295     if( mIndeterminateVisualAni )
296     {
297       mIndeterminateVisualAni.Stop();
298     }
299   }
300 }
301
302 bool ProgressBar::GetIndeterminate() const
303 {
304   return mIndeterminate;
305 }
306
307 void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData transition )
308 {
309   mIndeterminateVisualTransition = transition;
310   if( mIndeterminate )
311   {
312     PlayIndeterminateVisualTransition();
313   }
314 }
315
316 void ProgressBar::PlayIndeterminateVisualTransition()
317 {
318   if( mIndeterminateVisualAni )
319   {
320     mIndeterminateVisualAni.Stop();
321     mIndeterminateVisualAni.Clear();
322   }
323
324   mIndeterminateVisualAni = DevelControl::CreateTransition( *this, mIndeterminateVisualTransition );
325
326   if( mIndeterminate && mIndeterminateVisualAni )
327   {
328     mIndeterminateVisualAni.SetLooping(true);
329     mIndeterminateVisualAni.Play();
330   }
331 }
332
333 Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property::Value& value )
334 {
335   Toolkit::TransitionData transitionData;
336
337   if( value.GetType() == Property::ARRAY )
338   {
339     transitionData = Toolkit::TransitionData::New( *value.GetArray() );
340   }
341   else if( value.GetType() == Property::MAP )
342   {
343     transitionData = Toolkit::TransitionData::New( *value.GetMap() );
344   }
345
346   return transitionData;
347 }
348
349 /**
350  * Create Visual for given index from a property map or url.
351  * 1) Check if value passed in is a url and create visual
352  * 2) Create visual from map if step (1) is false
353  * 3) Register visual with control with false for enable flag.
354  * 4) Unregister visual if empty map was provided. This is the method to remove a visual
355  */
356
357 void ProgressBar::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const int visualDepth )
358 {
359   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
360   Toolkit::Visual::Base progressVisual;
361
362   std::string imageUrl;
363   if( value.Get( imageUrl ) )
364   {
365     if ( !imageUrl.empty() )
366     {
367       progressVisual = visualFactory.CreateVisual(  imageUrl, ImageDimensions()  );
368     }
369   }
370   else // Does this code make text-visual can be accepted as visual?
371   {
372     // if its not a string then get a Property::Map from the property if possible.
373     Property::Map *map = value.GetMap();
374     if( map && !map->Empty()  ) // Empty map results in current visual removal.
375     {
376       progressVisual = visualFactory.CreateVisual( *map );
377     }
378   }
379
380   if ( progressVisual )
381   {
382     if( index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL )
383     {
384       DevelControl::RegisterVisual( *this, index, progressVisual, mIndeterminate, visualDepth );
385     }
386     else
387     {
388       DevelControl::RegisterVisual( *this, index, progressVisual, true, visualDepth );
389     }
390   }
391   else
392   {
393     DevelControl::UnregisterVisual( *this, index );
394   }
395 }
396
397 bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const
398 {
399   bool success = false;
400   Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex );
401
402   if ( visual )
403   {
404     visual.CreatePropertyMap( retreivedMap );
405     success = true;
406   }
407
408   return success;
409 }
410
411 // Static class method to support script connecting signals
412 bool ProgressBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
413 {
414   Dali::BaseHandle handle( object );
415
416   bool connected = true;
417   Toolkit::ProgressBar ProgressBar = Toolkit::ProgressBar::DownCast( handle );
418
419   if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
420   {
421     ProgressBar.ValueChangedSignal().Connect( tracker, functor );
422   }
423   else
424   {
425     // signalName does not match any signal
426     connected = false;
427   }
428
429   return connected;
430 }
431
432 void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
433 {
434   Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
435
436   if ( progressBar )
437   {
438     ProgressBar& progressBarImpl( GetImpl( progressBar ) );
439
440     switch ( propertyIndex )
441     {
442       case Toolkit::ProgressBar::Property::TRACK_VISUAL:
443       {
444         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL );
445         break;
446       }
447
448       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
449       {
450         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
451         break;
452       }
453
454       case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
455       {
456         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL );
457         break;
458       }
459
460       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
461       {
462         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL );
463         break;
464       }
465
466       case Toolkit::ProgressBar::Property::LABEL_VISUAL:
467       {
468         Property::Map map;
469         std::string textString;
470
471         if ( value.Get( textString ) )
472         {
473           // set new text string as TEXT property
474           Property::Map newTextMap;
475           Toolkit::Visual::Base label = DevelControl::GetVisual( progressBarImpl, Toolkit::ProgressBar::Property::LABEL_VISUAL );
476
477           if( label )
478           {
479             label.CreatePropertyMap( map );
480           }
481
482           // if LABEL_VISUAL doesn't set before, add Visual property "TYPE" to create new text Visual
483           if( map.Empty() )
484           {
485             newTextMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT );
486             newTextMap.Add( Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE );
487           }
488           newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString );
489
490           map.Merge( newTextMap );
491         }
492         else
493         {
494           value.Get( map );
495         }
496
497         if( !map.Empty() )
498         {
499           progressBarImpl.CreateVisualsForComponent( propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL );
500         }
501         break;
502       }
503
504       case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
505       {
506         progressBarImpl.SetProgressValue( value.Get< float >() );
507         break;
508       }
509
510       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
511       {
512         progressBarImpl.SetSecondaryProgressValue( value.Get< float >() );
513         break;
514       }
515
516       case Toolkit::ProgressBar::Property::INDETERMINATE:
517       {
518         progressBarImpl.SetIndeterminate( value.Get< bool >() );
519         break;
520       }
521
522       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
523       {
524         progressBarImpl.SetIndeterminateVisualTransition( progressBarImpl.ConvertPropertyToTransition( value ) );
525         break;
526       }
527     }
528   }
529 }
530
531 Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index propertyIndex )
532 {
533   Property::Value value;
534
535   Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
536
537   if ( progressBar )
538   {
539     ProgressBar& progressBarImpl( GetImpl( progressBar ) );
540
541     switch ( propertyIndex )
542     {
543       case Toolkit::ProgressBar::Property::TRACK_VISUAL:
544       case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
545       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
546       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
547       case Toolkit::ProgressBar::Property::LABEL_VISUAL:
548       {
549         Property::Map visualProperty;
550         if ( progressBarImpl.GetPropertyMapForVisual( propertyIndex, visualProperty ) )
551         {
552           value = visualProperty;
553         }
554         break;
555       }
556
557       case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
558       {
559         value = progressBarImpl.GetProgressValue();
560         break;
561       }
562
563       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
564       {
565         value = progressBarImpl.GetSecondaryProgressValue();
566         break;
567       }
568
569       case Toolkit::ProgressBar::Property::INDETERMINATE:
570       {
571         value = progressBarImpl.GetIndeterminate();
572         break;
573       }
574
575       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
576       {
577         //TODO: Return INDETERMINATE_VISUAL_TRANSITION;
578       }
579     }
580   }
581
582   return value;
583 }
584
585 void ProgressBar::OnStageConnection( int depth )
586 {
587   // Chain up first (ensures visuals are ready to draw)
588   Control::OnStageConnection( depth );
589
590   if( mIndeterminate )
591   {
592     PlayIndeterminateVisualTransition();
593   }
594 }
595
596 double ProgressBar::AccessibleImpl::GetMinimum() { return DEFAULT_LOWER_BOUND; }
597
598 double ProgressBar::AccessibleImpl::GetCurrent()
599 {
600   auto p = Toolkit::ProgressBar::DownCast( self );
601   return p.GetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE )
602       .Get< float >();
603 }
604
605 double ProgressBar::AccessibleImpl::GetMaximum() { return DEFAULT_UPPER_BOUND; }
606
607 bool ProgressBar::AccessibleImpl::SetCurrent( double current )
608 {
609   if( current < GetMinimum() || current > GetMaximum() )
610     return false;
611   auto p = Toolkit::ProgressBar::DownCast( self );
612   p.SetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE,
613                  static_cast< float >( current ) );
614   return true;
615 }
616
617 double ProgressBar::AccessibleImpl::GetMinimumIncrement() { return 0.001; }
618
619 } // namespace Internal
620
621 } // namespace Toolkit
622
623 } // namespace Dali