Merge "Do nothing when setting focus on same actor" into devel/master
[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/devel-api/align-enums.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/devel-api/visuals/text-visual-properties.h>
34 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.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 }
118
119 ProgressBar::~ProgressBar()
120 {
121 }
122
123 void ProgressBar::OnInitialize()
124 {
125 }
126
127 void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container )
128 {
129
130   Vector2 trackSize( size );
131   mDomain = CalcDomain( size );
132
133   trackSize.width = std::max( 0.0f, size.width ); // Ensure we don't go negative
134
135   Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
136   Toolkit::Visual::Base secondProgressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL );
137   Toolkit::Visual::Base progressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL );
138   Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
139   Toolkit::Visual::Base indeterminateVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL );
140
141   if( trackVisual )
142   {
143     Property::Map visualTransform;
144
145     visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize )
146                    .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
147                    .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) );
148
149     trackVisual.SetTransformAndSize( visualTransform, trackSize );
150   }
151
152   if( secondProgressVisual )
153   {
154     Property::Map visualTransform;
155
156     visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, Vector2( mDomain.from.x + mSecondaryProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height  ) )
157                    .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
158                    .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
159                    .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
160                    .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
161     secondProgressVisual.SetTransformAndSize( visualTransform, trackSize );
162   }
163
164   if( progressVisual )
165   {
166     Property::Map visualTransform;
167
168     visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, Vector2( mDomain.from.x + mProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height ) )
169                    .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
170                    .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
171                    .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
172                    .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
173     progressVisual.SetTransformAndSize( visualTransform, trackSize );
174   }
175
176   if( labelVisual )
177   {
178     Property::Map visualTransform;
179
180     visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize )
181                    .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
182                    .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) );
183     labelVisual.SetTransformAndSize( visualTransform, trackSize );
184   }
185
186   if( indeterminateVisual )
187   {
188     Property::Map visualTransform;
189
190     visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize )
191                    .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
192                    .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) );
193     indeterminateVisual.SetTransformAndSize( visualTransform, trackSize );
194   }
195
196 }
197
198 Vector3 ProgressBar::GetNaturalSize()
199 {
200   // Return the bigger size after comparing trackVisual naturalSize and labelVisual naturalSize
201   Toolkit::Visual::Base trackVisual =  DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL );
202   Toolkit::Visual::Base labelVisual =  DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL );
203
204   Size trackSize;
205   Size labelSize;
206
207   if ( trackVisual )
208   {
209     trackVisual.GetNaturalSize( trackSize );
210   }
211   if ( labelVisual )
212   {
213     labelVisual.GetNaturalSize( labelSize );
214   }
215
216   Vector3 naturalSize;
217   naturalSize.width = ( trackSize.width > labelSize.width ) ? trackSize.width: labelSize.width;
218   naturalSize.height = ( trackSize.height > labelSize.height ) ? trackSize.height: labelSize.height;
219
220   return naturalSize;
221 }
222
223 ProgressBar::Domain ProgressBar::CalcDomain( const Vector2& currentSize )
224 {
225    return Domain( Vector2( 0.0f, 0.0f ), currentSize );
226 }
227
228 Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal()
229 {
230   return mValueChangedSignal;
231 }
232
233 void ProgressBar::SetProgressValue( float value )
234 {
235   // update the progress bar value (taking float precision errors into account)
236   // TODO : it seems 0.0f cannot into this statement.
237   if( ( mProgressValue != value ) &&
238       ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
239       ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
240   {
241     mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
242
243     Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
244     mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
245     RelayoutRequest();
246   }
247 }
248
249 float ProgressBar::GetProgressValue() const
250 {
251   return mProgressValue;
252 }
253
254 void ProgressBar::SetSecondaryProgressValue( float value )
255 {
256   // update the progress bar value (taking float precision errors into account)
257   // TODO : it seems 0.0f cannot into this statement.
258   if( ( mSecondaryProgressValue != value ) &&
259       ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) &&
260       ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) )
261   {
262     mSecondaryProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND );
263
264     Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() );
265     mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue );
266
267     RelayoutRequest();
268   }
269 }
270
271 float ProgressBar::GetSecondaryProgressValue() const
272 {
273   return mSecondaryProgressValue;
274 }
275
276 void ProgressBar::SetIndeterminate( bool value )
277 {
278   mIndeterminate = value;
279   DevelControl::EnableVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate );
280
281   if( mIndeterminate )
282   {
283     RelayoutRequest();
284     if( mIndeterminateVisualTransition )
285     {
286       PlayIndeterminateVisualTransition();
287     }
288   }
289   else
290   {
291     if( mIndeterminateVisualAni )
292     {
293       mIndeterminateVisualAni.Stop();
294     }
295   }
296 }
297
298 bool ProgressBar::GetIndeterminate() const
299 {
300   return mIndeterminate;
301 }
302
303 void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData transition )
304 {
305   mIndeterminateVisualTransition = transition;
306   if( mIndeterminate )
307   {
308     PlayIndeterminateVisualTransition();
309   }
310 }
311
312 void ProgressBar::PlayIndeterminateVisualTransition()
313 {
314   if( mIndeterminateVisualAni )
315   {
316     mIndeterminateVisualAni.Stop();
317     mIndeterminateVisualAni.Clear();
318   }
319
320   mIndeterminateVisualAni = DevelControl::CreateTransition( *this, mIndeterminateVisualTransition );
321
322   if( mIndeterminate && mIndeterminateVisualAni )
323   {
324     mIndeterminateVisualAni.SetLooping(true);
325     mIndeterminateVisualAni.Play();
326   }
327 }
328
329 Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property::Value& value )
330 {
331   Toolkit::TransitionData transitionData;
332
333   if( value.GetType() == Property::ARRAY )
334   {
335     transitionData = Toolkit::TransitionData::New( *value.GetArray() );
336   }
337   else if( value.GetType() == Property::MAP )
338   {
339     transitionData = Toolkit::TransitionData::New( *value.GetMap() );
340   }
341
342   return transitionData;
343 }
344
345 /**
346  * Create Visual for given index from a property map or url.
347  * 1) Check if value passed in is a url and create visual
348  * 2) Create visual from map if step (1) is false
349  * 3) Register visual with control with false for enable flag.
350  * 4) Unregister visual if empty map was provided. This is the method to remove a visual
351  */
352
353 void ProgressBar::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const float visualDepth )
354 {
355   Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
356   Toolkit::Visual::Base progressVisual;
357
358   std::string imageUrl;
359   if( value.Get( imageUrl ) )
360   {
361     if ( !imageUrl.empty() )
362     {
363       progressVisual = visualFactory.CreateVisual(  imageUrl, ImageDimensions()  );
364     }
365   }
366   else // Does this code make text-visual can be accepted as visual?
367   {
368     // if its not a string then get a Property::Map from the property if possible.
369     Property::Map *map = value.GetMap();
370     if( map && !map->Empty()  ) // Empty map results in current visual removal.
371     {
372       progressVisual = visualFactory.CreateVisual( *map );
373     }
374   }
375
376   if ( progressVisual )
377   {
378     progressVisual.SetDepthIndex( visualDepth );
379     if( index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL )
380     {
381       DevelControl::RegisterVisual( *this, index, progressVisual, mIndeterminate );
382     }
383     else
384     {
385       DevelControl::RegisterVisual( *this, index, progressVisual, true );
386     }
387   }
388   else
389   {
390     DevelControl::UnregisterVisual( *this, index );
391   }
392 }
393
394 bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const
395 {
396   bool success = false;
397   Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex );
398
399   if ( visual )
400   {
401     visual.CreatePropertyMap( retreivedMap );
402     success = true;
403   }
404
405   return success;
406 }
407
408 // Static class method to support script connecting signals
409 bool ProgressBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
410 {
411   Dali::BaseHandle handle( object );
412
413   bool connected = true;
414   Toolkit::ProgressBar ProgressBar = Toolkit::ProgressBar::DownCast( handle );
415
416   if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) )
417   {
418     ProgressBar.ValueChangedSignal().Connect( tracker, functor );
419   }
420   else
421   {
422     // signalName does not match any signal
423     connected = false;
424   }
425
426   return connected;
427 }
428
429 void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
430 {
431   Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
432
433   if ( progressBar )
434   {
435     ProgressBar& progressBarImpl( GetImpl( progressBar ) );
436
437     switch ( propertyIndex )
438     {
439       case Toolkit::ProgressBar::Property::TRACK_VISUAL:
440       {
441         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL );
442         break;
443       }
444
445       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
446       {
447         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL );
448         break;
449       }
450
451       case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
452       {
453         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL );
454         break;
455       }
456
457       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
458       {
459         progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL );
460         break;
461       }
462
463       case Toolkit::ProgressBar::Property::LABEL_VISUAL:
464       {
465         Property::Map map;
466         std::string textString;
467
468         if ( value.Get( textString ) )
469         {
470           // set new text string as TEXT property
471           Property::Map newTextMap;
472           Toolkit::Visual::Base label = DevelControl::GetVisual( progressBarImpl, Toolkit::ProgressBar::Property::LABEL_VISUAL );
473
474           if( label )
475           {
476             label.CreatePropertyMap( map );
477           }
478
479           // if LABEL_VISUAL doesn't set before, add Visual property "TYPE" to create new text Visual
480           if( map.Empty() )
481           {
482             newTextMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT );
483             newTextMap.Add( Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE );
484           }
485           newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString );
486
487           map.Merge( newTextMap );
488         }
489         else
490         {
491           value.Get( map );
492         }
493
494         if( !map.Empty() )
495         {
496           progressBarImpl.CreateVisualsForComponent( propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL );
497         }
498         break;
499       }
500
501       case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
502       {
503         progressBarImpl.SetProgressValue( value.Get< float >() );
504         break;
505       }
506
507       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
508       {
509         progressBarImpl.SetSecondaryProgressValue( value.Get< float >() );
510         break;
511       }
512
513       case Toolkit::ProgressBar::Property::INDETERMINATE:
514       {
515         progressBarImpl.SetIndeterminate( value.Get< bool >() );
516         break;
517       }
518
519       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
520       {
521         progressBarImpl.SetIndeterminateVisualTransition( progressBarImpl.ConvertPropertyToTransition( value ) );
522         break;
523       }
524     }
525   }
526 }
527
528 Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index propertyIndex )
529 {
530   Property::Value value;
531
532   Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) );
533
534   if ( progressBar )
535   {
536     ProgressBar& progressBarImpl( GetImpl( progressBar ) );
537
538     switch ( propertyIndex )
539     {
540       case Toolkit::ProgressBar::Property::TRACK_VISUAL:
541       case Toolkit::ProgressBar::Property::PROGRESS_VISUAL:
542       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL:
543       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL:
544       case Toolkit::ProgressBar::Property::LABEL_VISUAL:
545       {
546         Property::Map visualProperty;
547         if ( progressBarImpl.GetPropertyMapForVisual( propertyIndex, visualProperty ) )
548         {
549           value = visualProperty;
550         }
551         break;
552       }
553
554       case Toolkit::ProgressBar::Property::PROGRESS_VALUE:
555       {
556         value = progressBarImpl.GetProgressValue();
557         break;
558       }
559
560       case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE:
561       {
562         value = progressBarImpl.GetSecondaryProgressValue();
563         break;
564       }
565
566       case Toolkit::ProgressBar::Property::INDETERMINATE:
567       {
568         value = progressBarImpl.GetIndeterminate();
569         break;
570       }
571
572       case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION:
573       {
574         //TODO: Return INDETERMINATE_VISUAL_TRANSITION;
575       }
576     }
577   }
578
579   return value;
580 }
581
582 void ProgressBar::OnStageConnection( int depth )
583 {
584   // Chain up first (ensures visuals are ready to draw)
585   Control::OnStageConnection( depth );
586
587   if( mIndeterminate )
588   {
589     PlayIndeterminateVisualTransition();
590   }
591 }
592
593 } // namespace Internal
594
595 } // namespace Toolkit
596
597 } // namespace Dali