Merge remote-tracking branch 'origin/tizen' into new_text
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-default-painter-impl.cpp
1 /*
2  * Copyright (c) 2014 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 "push-button-default-painter-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/actors/image-actor.h>
23 #include <dali/public-api/adaptor-framework/timer.h>
24 #include <dali/public-api/animation/constraints.h>
25 #include <dali/public-api/object/ref-object.h>
26
27 // INTERNAL INCLUDES
28 #include <dali-toolkit/public-api/controls/buttons/push-button.h>
29 #include "push-button-impl.h"
30
31 namespace Dali
32 {
33
34 namespace Toolkit
35 {
36
37 namespace Internal
38 {
39
40 namespace
41 {
42 const float LABEL_DEPTH( 0.75f );
43 const float FOREGROUND_DEPTH( 0.5f );
44 const float BACKGROUND_DEPTH( 0.25f );
45
46 const float ANIMATION_TIME( 0.2f );
47
48 inline Toolkit::Internal::PushButton& GetPushButtonImpl( Toolkit::Button& button )
49 {
50   DALI_ASSERT_ALWAYS( button );
51
52   Dali::RefObject& handle = button.GetImplementation();
53
54   return static_cast<Toolkit::Internal::PushButton&>( handle );
55 }
56
57 inline const Toolkit::Internal::PushButton& GetPushButtonImpl( const Toolkit::Button& button )
58 {
59   DALI_ASSERT_ALWAYS( button );
60
61   const Dali::RefObject& handle = button.GetImplementation();
62
63   return static_cast<const Toolkit::Internal::PushButton&>( handle );
64 }
65
66 }
67
68 PushButtonDefaultPainter::PushButtonDefaultPainter()
69 : PushButtonPainter(),
70   mAutoRepeating( false ),
71   mDisabled( false ),
72   mPaintState( ReleasedState ),
73   mButton( NULL ),
74   mAnimationTime( ANIMATION_TIME ),
75   mSize()
76 {
77 }
78
79 PushButtonDefaultPainter::~PushButtonDefaultPainter()
80 {
81   if( mFadeInAnimation )
82   {
83     mFadeInAnimation.Clear();
84   }
85   if( mFadeOutAnimation )
86   {
87     mFadeOutAnimation.Clear();
88   }
89 }
90
91 void PushButtonDefaultPainter::SetButtonImage( Toolkit::PushButton& pushButton, Actor image )
92 {
93   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
94   Actor& buttonImage = pushButtonImpl.GetButtonImage();
95   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
96
97   switch( mPaintState )
98   {
99     case ReleasedState:
100     {
101       if( buttonImage && buttonImage.GetParent() )
102       {
103         StopFadeOutAnimation( pushButton );
104         FadeOutImage( pushButton, Foreground, buttonImage );
105
106         buttonImage = image;
107
108         FadeInImage( pushButton, buttonImage );
109
110         StartFadeOutAnimation( pushButton );
111         StartFadeInAnimation();
112       }
113       else
114       {
115         buttonImage = image;
116         pushButton.Add( buttonImage );
117       }
118       break;
119     }
120     case ReleasedPressedTransition: // FALLTHROUGH
121     case ReleasedDisabledTransition:
122     {
123       float opacity = 1.f;
124       if( fadeOutButtonImage )
125       {
126         opacity = fadeOutButtonImage.GetCurrentOpacity();
127       }
128       StopFadeOutAnimation( pushButton );
129
130       // Replaces the button image.
131       buttonImage = image;
132
133       pushButton.Add( buttonImage );
134       FadeOutImage( pushButton, Foreground, buttonImage, opacity );
135
136       StartFadeOutAnimation( pushButton );
137       break;
138     }
139     case PressedReleasedTransition: // FALLTHROUGH
140     case DisabledReleasedTransition:
141     {
142       StopFadeInAnimation();
143       pushButton.Remove( buttonImage );
144
145       buttonImage = image;
146
147       FadeInImage( pushButton, buttonImage );
148       StartFadeInAnimation();
149       break;
150     }
151     default:
152       buttonImage = image;
153       break;
154   }
155
156   buttonImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
157   buttonImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
158   ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
159 }
160
161 void PushButtonDefaultPainter::SetBackgroundImage( Toolkit::PushButton& pushButton, Actor image )
162 {
163   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
164   Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
165   Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
166
167   switch( mPaintState )
168   {
169     case ReleasedState:             // FALLTHROUGH
170     case PressedState:
171     case ReleasedPressedTransition:
172     case PressedReleasedTransition:
173     {
174       if( backgroundImage && backgroundImage.GetParent() )
175       {
176         StopFadeOutAnimation( pushButton );
177         FadeOutImage( pushButton, Background, backgroundImage  );
178
179         backgroundImage = image;
180
181         FadeInImage( pushButton, backgroundImage );
182
183         StartFadeOutAnimation( pushButton );
184         StartFadeInAnimation();
185       }
186       else
187       {
188         backgroundImage = image;
189         pushButton.Add( backgroundImage );
190       }
191       break;
192     }
193     case ReleasedDisabledTransition: // FALLTHROUGH
194     case PressedDisabledTransition:
195     {
196       float opacity = 1.f;
197       if( fadeOutBackgroundImage )
198       {
199         opacity = fadeOutBackgroundImage.GetCurrentOpacity();
200       }
201       StopFadeOutAnimation( pushButton );
202
203       // Replaces the button image.
204       backgroundImage = image;
205
206       pushButton.Add( backgroundImage );
207       FadeOutImage( pushButton, Background, backgroundImage, opacity );
208
209       StartFadeOutAnimation( pushButton );
210       break;
211     }
212     case DisabledReleasedTransition: // FALLTHROUGH
213     case DisabledPressedTransition:
214     {
215       StopFadeInAnimation();
216       pushButton.Remove( backgroundImage );
217
218       backgroundImage = image;
219
220       FadeInImage( pushButton, backgroundImage );
221       StartFadeInAnimation();
222       break;
223     }
224     default:
225       backgroundImage = image;
226       break;
227     }
228
229   backgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
230   backgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
231   ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
232 }
233
234 void PushButtonDefaultPainter::SetSelectedImage( Toolkit::PushButton& pushButton, Actor image )
235 {
236   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
237   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
238   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
239
240   switch( mPaintState )
241   {
242     case PressedState:
243     {
244       if( selectedImage && selectedImage.GetParent() )
245       {
246         StopFadeOutAnimation( pushButton );
247         FadeOutImage( pushButton, Foreground, selectedImage  );
248
249         selectedImage = image;
250
251         FadeInImage( pushButton, selectedImage );
252
253         StartFadeOutAnimation( pushButton );
254         StartFadeInAnimation();
255       }
256       else
257       {
258         selectedImage = image;
259         pushButton.Add( selectedImage );
260       }
261       break;
262     }
263     case PressedReleasedTransition: // FALLTHROUGH
264     case PressedDisabledTransition:
265     {
266       float opacity = 1.f;
267       if( fadeOutButtonImage )
268       {
269         opacity = fadeOutButtonImage.GetCurrentOpacity();
270       }
271       StopFadeOutAnimation( pushButton );
272
273       // Replaces the button image.
274       selectedImage = image;
275
276       pushButton.Add( selectedImage );
277       FadeOutImage( pushButton, Foreground, selectedImage, opacity );
278
279       StartFadeOutAnimation( pushButton );
280       break;
281     }
282     case ReleasedPressedTransition: // FALLTHROUGH
283     case DisabledPressedTransition:
284     {
285       StopFadeInAnimation();
286       pushButton.Remove( selectedImage );
287
288       selectedImage = image;
289
290       FadeInImage( pushButton, selectedImage );
291       StartFadeInAnimation();
292       break;
293     }
294     default:
295       selectedImage = image;
296       break;
297   }
298
299   selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
300   selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
301   ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
302 }
303
304 void PushButtonDefaultPainter::SetDisabledImage( Toolkit::PushButton& pushButton, Actor image )
305 {
306   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
307   Actor& disabledImage = pushButtonImpl.GetDisabledImage();
308   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
309
310   switch( mPaintState )
311   {
312     case DisabledReleasedState: // FALLTHROUGH
313     case DisabledPressedState:
314     {
315       if( disabledImage && disabledImage.GetParent() )
316       {
317         StopFadeOutAnimation( pushButton );
318         FadeOutImage( pushButton, Foreground, disabledImage  );
319
320         disabledImage = image;
321
322         FadeInImage( pushButton, disabledImage );
323
324         StartFadeOutAnimation( pushButton );
325         StartFadeInAnimation();
326       }
327       else
328       {
329         disabledImage = image;
330         pushButton.Add( disabledImage );
331       }
332       break;
333     }
334     case ReleasedDisabledTransition: // FALLTHROUGH
335     case PressedDisabledTransition:
336     {
337       StopFadeInAnimation();
338       pushButton.Remove( disabledImage );
339
340       disabledImage = image;
341
342       FadeInImage( pushButton, disabledImage );
343       StartFadeInAnimation();
344       break;
345     }
346     case DisabledReleasedTransition: // FALLTHROUGH
347     case DisabledPressedTransition:
348     {
349       float opacity = 1.f;
350       if( fadeOutButtonImage )
351       {
352         opacity = fadeOutButtonImage.GetCurrentOpacity();
353       }
354       StopFadeOutAnimation( pushButton );
355
356       // Replaces the button image.
357       disabledImage = image;
358
359       pushButton.Add( disabledImage );
360       FadeOutImage( pushButton, Foreground, disabledImage, opacity );
361
362       StartFadeOutAnimation( pushButton );
363       break;
364     }
365     default:
366       disabledImage = image;
367       break;
368   }
369
370   disabledImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
371   disabledImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
372   ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
373 }
374
375 void PushButtonDefaultPainter::SetDisabledBackgroundImage( Toolkit::PushButton& pushButton, Actor image )
376 {
377   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
378   Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
379   Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
380
381   switch( mPaintState )
382   {
383     case DisabledReleasedState: // FALLTHROUGH
384     case DisabledPressedState:
385     {
386       if( disabledBackgroundImage && disabledBackgroundImage.GetParent() )
387       {
388         StopFadeOutAnimation( pushButton );
389         FadeOutImage( pushButton, Background, disabledBackgroundImage  );
390
391         disabledBackgroundImage = image;
392
393         FadeInImage( pushButton, disabledBackgroundImage );
394
395         StartFadeOutAnimation( pushButton );
396         StartFadeInAnimation();
397       }
398       else
399       {
400         disabledBackgroundImage = image;
401         pushButton.Add( disabledBackgroundImage );
402       }
403       break;
404     }
405     case ReleasedDisabledTransition: // FALLTHROUGH
406     case PressedDisabledTransition:
407     {
408       StopFadeInAnimation();
409       pushButton.Remove( disabledBackgroundImage );
410
411       disabledBackgroundImage = image;
412
413       FadeInImage( pushButton, disabledBackgroundImage );
414       StartFadeInAnimation();
415       break;
416     }
417     case DisabledReleasedTransition: // FALLTHROUGH
418     case DisabledPressedTransition:
419     {
420       float opacity = 1.f;
421       if( fadeOutBackgroundImage )
422       {
423         opacity = fadeOutBackgroundImage.GetCurrentOpacity();
424       }
425       StopFadeOutAnimation( pushButton );
426
427       // Replaces the button image.
428       disabledBackgroundImage = image;
429
430       pushButton.Add( disabledBackgroundImage );
431       FadeOutImage( pushButton, Background, disabledBackgroundImage, opacity );
432
433       StartFadeOutAnimation( pushButton );
434       break;
435     }
436     default:
437       disabledBackgroundImage = image;
438       break;
439   }
440
441   disabledBackgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
442   disabledBackgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
443   ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
444 }
445
446 void PushButtonDefaultPainter::SetLabel( Toolkit::PushButton& pushButton, Actor label )
447 {
448   Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
449   Actor& labelActor = pushButtonImpl.GetLabel();
450
451   if( labelActor && labelActor.GetParent() )
452   {
453     labelActor.GetParent().Remove( labelActor );
454   }
455
456   labelActor = label;
457   labelActor.SetAnchorPoint( AnchorPoint::CENTER );
458   labelActor.SetParentOrigin( ParentOrigin::CENTER );
459
460   labelActor.SetPosition( 0.f, 0.f, LABEL_DEPTH );
461   labelActor.SetSize( mSize );
462
463   pushButton.Add( labelActor  );
464 }
465
466 void PushButtonDefaultPainter::Initialize( Toolkit::Button& button )
467 {
468   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
469   Actor& buttonImage = pushButtonImpl.GetButtonImage();
470   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
471   Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
472   Actor& disabledImage = pushButtonImpl.GetDisabledImage();
473   Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
474   Actor& label = pushButtonImpl.GetLabel();
475
476   Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
477
478   if( buttonImage )
479   {
480     SetButtonImage( pushButton, buttonImage );
481   }
482
483   if( backgroundImage )
484   {
485     SetBackgroundImage( pushButton, backgroundImage );
486   }
487
488   if( selectedImage )
489   {
490     SetSelectedImage( pushButton, selectedImage );
491   }
492
493   if( disabledImage )
494   {
495     SetDisabledImage( pushButton, disabledImage );
496   }
497
498   if( disabledBackgroundImage )
499   {
500     SetDisabledBackgroundImage( pushButton, disabledBackgroundImage );
501   }
502
503   if( label )
504   {
505     SetLabel( pushButton, label );
506   }
507
508   SetDisabled( pushButton, mDisabled );
509 }
510
511 void PushButtonDefaultPainter::SetSize( Toolkit::Button& button, const Vector3& size )
512 {
513   if( size != mSize )
514   {
515     mSize = size;
516
517     Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
518     Actor& buttonImage = pushButtonImpl.GetButtonImage();
519     Actor& selectedImage = pushButtonImpl.GetSelectedImage();
520     Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
521     Actor& disabledImage = pushButtonImpl.GetDisabledImage();
522     Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
523     Actor& label = pushButtonImpl.GetLabel();
524
525     ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
526     ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
527     ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
528     ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
529     ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
530
531     if( label )
532     {
533       label.SetPosition( 0.f, 0.f, LABEL_DEPTH );
534       label.SetSize( mSize );
535     }
536   }
537 }
538
539 void PushButtonDefaultPainter::SetDisabled( Toolkit::Button& button, bool disabled )
540 {
541   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
542   Actor& buttonImage = pushButtonImpl.GetButtonImage();
543   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
544   Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
545   Actor& disabledImage = pushButtonImpl.GetDisabledImage();
546   Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
547   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
548
549   Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
550
551   mDisabled = disabled;
552
553   switch( mPaintState )
554   {
555   case ReleasedState:
556   {
557     if( disabled )
558     {
559       StopFadeOutAnimation( pushButton );
560       FadeOutImage( pushButton, Background, backgroundImage );
561       FadeOutImage( pushButton, Foreground, buttonImage );
562       FadeInImage( pushButton, disabledBackgroundImage );
563       FadeInImage( pushButton, disabledImage );
564       StartFadeOutAnimation( pushButton );
565       StartFadeInAnimation();
566
567       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
568       {
569         mPaintState = ReleasedDisabledTransition;
570       }
571       else
572       {
573         mPaintState = DisabledReleasedState;
574       }
575     }
576     break;
577   }
578   case PressedState:
579   {
580     if( disabled )
581     {
582       StopFadeOutAnimation( pushButton );
583       FadeOutImage( pushButton, Background, backgroundImage );
584       FadeOutImage( pushButton, Foreground, selectedImage );
585       FadeInImage( pushButton, disabledBackgroundImage );
586       FadeInImage( pushButton, disabledImage );
587       StartFadeOutAnimation( pushButton );
588       StartFadeInAnimation();
589
590       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
591       {
592         mPaintState = PressedDisabledTransition;
593       }
594       else
595       {
596         mPaintState = DisabledPressedState;
597       }
598     }
599     break;
600   }
601   case DisabledReleasedState:
602   {
603     if( !disabled )
604     {
605       StopFadeOutAnimation( pushButton );
606       FadeOutImage( pushButton, Background, disabledBackgroundImage );
607       FadeOutImage( pushButton, Foreground, disabledImage );
608       FadeInImage( pushButton, backgroundImage );
609       FadeInImage( pushButton, buttonImage );
610       StartFadeOutAnimation( pushButton );
611       StartFadeInAnimation();
612
613       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
614       {
615         mPaintState = DisabledReleasedTransition;
616       }
617       else
618       {
619         mPaintState = ReleasedState;
620       }
621     }
622     break;
623   }
624   case DisabledPressedState:
625   {
626     if( !disabled )
627     {
628       StopFadeOutAnimation( pushButton );
629       FadeOutImage( pushButton, Background, disabledBackgroundImage );
630       FadeOutImage( pushButton, Foreground, disabledImage );
631       FadeInImage( pushButton, backgroundImage );
632       FadeInImage( pushButton, selectedImage );
633       StartFadeOutAnimation( pushButton );
634       StartFadeInAnimation();
635
636       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
637       {
638         mPaintState = DisabledPressedTransition;
639       }
640       else
641       {
642         mPaintState = PressedState;
643       }
644     }
645     break;
646   }
647   case ReleasedPressedTransition:
648   {
649     if( disabled )
650     {
651       float opacity = 1.f;
652       if( fadeOutButtonImage )
653       {
654         opacity = fadeOutButtonImage.GetCurrentOpacity();
655       }
656       StopFadeOutAnimation( pushButton );
657       StopFadeInAnimation();
658
659       FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
660       FadeOutImage( pushButton, Background, backgroundImage );
661
662       FadeInImage( pushButton, disabledImage );
663       FadeInImage( pushButton, disabledBackgroundImage );
664
665       StartFadeOutAnimation( pushButton );
666       StartFadeInAnimation();
667
668       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
669       {
670         mPaintState = PressedDisabledTransition;
671       }
672       else
673       {
674         mPaintState = DisabledPressedState;
675       }
676     }
677     break;
678   }
679   case PressedReleasedTransition:
680   {
681     if( disabled )
682     {
683       float opacity = 1.f;
684       if( fadeOutButtonImage )
685       {
686         opacity = fadeOutButtonImage.GetCurrentOpacity();
687       }
688       StopFadeOutAnimation( pushButton );
689       StopFadeInAnimation();
690
691       FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
692       FadeOutImage( pushButton, Background, backgroundImage );
693
694       FadeInImage( pushButton, disabledImage );
695       FadeInImage( pushButton, disabledBackgroundImage );
696
697       StartFadeOutAnimation( pushButton );
698       StartFadeInAnimation();
699
700       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
701       {
702         mPaintState = ReleasedDisabledTransition;
703       }
704       else
705       {
706         mPaintState = DisabledReleasedState;
707       }
708     }
709     break;
710   }
711   case ReleasedDisabledTransition:
712   {
713     if( !disabled )
714     {
715       float opacity = 1.f;
716       if( fadeOutButtonImage )
717       {
718         opacity = fadeOutButtonImage.GetCurrentOpacity();
719       }
720       StopFadeOutAnimation( pushButton, false );
721       StopFadeInAnimation();
722
723       FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
724       FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
725       FadeInImage( pushButton, buttonImage, opacity );
726       FadeInImage( pushButton, backgroundImage, opacity );
727
728       StartFadeOutAnimation( pushButton );
729       StartFadeInAnimation();
730
731       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
732       {
733         mPaintState = DisabledReleasedTransition;
734       }
735       else
736       {
737         mPaintState = ReleasedState;
738       }
739     }
740     break;
741   }
742   case DisabledReleasedTransition:
743   {
744     if( disabled )
745     {
746       float opacity = 1.f;
747       if( fadeOutButtonImage )
748       {
749         opacity = fadeOutButtonImage.GetCurrentOpacity();
750       }
751       StopFadeOutAnimation( pushButton, false );
752       StopFadeInAnimation();
753
754       FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
755       FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
756       FadeInImage( pushButton, disabledImage, opacity );
757       FadeInImage( pushButton, disabledBackgroundImage, opacity );
758
759       StartFadeOutAnimation( pushButton );
760       StartFadeInAnimation();
761
762       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
763       {
764         mPaintState = ReleasedDisabledTransition;
765       }
766       else
767       {
768         mPaintState = DisabledReleasedState;
769       }
770     }
771     break;
772   }
773   case PressedDisabledTransition:
774   {
775     if( !disabled )
776     {
777       float opacity = 1.f;
778       if( fadeOutButtonImage )
779       {
780         opacity = fadeOutButtonImage.GetCurrentOpacity();
781       }
782       StopFadeOutAnimation( pushButton, false );
783       StopFadeInAnimation();
784
785       FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
786       FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
787       FadeInImage( pushButton, selectedImage, opacity );
788       FadeInImage( pushButton, backgroundImage, opacity );
789
790       StartFadeOutAnimation( pushButton );
791       StartFadeInAnimation();
792
793       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
794       {
795         mPaintState = DisabledPressedTransition;
796       }
797       else
798       {
799         mPaintState = PressedState;
800       }
801     }
802     break;
803   }
804   case DisabledPressedTransition:
805   {
806     if( disabled )
807     {
808       float opacity = 1.f;
809       if( fadeOutButtonImage )
810       {
811         opacity = fadeOutButtonImage.GetCurrentOpacity();
812       }
813       StopFadeOutAnimation( pushButton, false );
814       StopFadeInAnimation();
815
816       FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
817       FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
818       FadeInImage( pushButton, disabledImage, opacity );
819       FadeInImage( pushButton, disabledBackgroundImage, opacity );
820
821       StartFadeOutAnimation( pushButton );
822       StartFadeInAnimation();
823
824       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
825       {
826         mPaintState = PressedDisabledTransition;
827       }
828       else
829       {
830         mPaintState = DisabledPressedState;
831       }
832     }
833     break;
834   }
835   default:
836     break;
837   }
838 }
839
840 void PushButtonDefaultPainter::SetAnimationTime( float animationTime )
841 {
842   mAnimationTime = animationTime;
843 }
844
845 float PushButtonDefaultPainter::GetAnimationTime() const
846 {
847   return mAnimationTime;
848 }
849
850 void PushButtonDefaultPainter::SetAutoRepeating( bool autorepeating )
851 {
852   mAutoRepeating = autorepeating;
853 }
854
855 void PushButtonDefaultPainter::Pressed( Toolkit::PushButton& button )
856 {
857   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
858   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
859   Actor& buttonImage = pushButtonImpl.GetButtonImage();
860   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
861
862   switch( mPaintState )
863   {
864     case ReleasedState:
865     {
866       StopFadeOutAnimation( button );
867       FadeOutImage( button, Foreground, buttonImage );
868       FadeInImage( button, selectedImage );
869       StartFadeOutAnimation( button );
870       StartFadeInAnimation();
871
872       if( buttonImage || selectedImage )
873       {
874         mPaintState = ReleasedPressedTransition;
875       }
876       else
877       {
878         mPaintState = PressedState;
879       }
880       break;
881     }
882     case ReleasedPressedTransition:
883     {
884       if( !mAutoRepeating )
885       {
886         mPaintState = PressedReleasedTransition;
887       }
888       break;
889     }
890     case PressedReleasedTransition:
891     {
892       float opacity = 1.f;
893       if( fadeOutButtonImage )
894       {
895         opacity = fadeOutButtonImage.GetCurrentOpacity();
896       }
897       StopFadeOutAnimation( button, false );
898       StopFadeInAnimation();
899
900       FadeOutImage( button, Foreground, buttonImage, 1.f - opacity );
901       FadeInImage( button, selectedImage, opacity );
902
903       StartFadeOutAnimation( button );
904       StartFadeInAnimation();
905
906       if( buttonImage || selectedImage )
907       {
908         mPaintState = ReleasedPressedTransition;
909       }
910       else
911       {
912         mPaintState = PressedState;
913       }
914       break;
915     }
916     default:
917       break;
918   }
919 }
920
921 void PushButtonDefaultPainter::Released( Toolkit::PushButton& button )
922 {
923   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
924   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
925   Actor& buttonImage = pushButtonImpl.GetButtonImage();
926   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
927
928   switch( mPaintState )
929   {
930     case PressedState:
931     {
932       StopFadeOutAnimation( button );
933       FadeOutImage( button, Foreground, selectedImage );
934       FadeInImage( button, buttonImage );
935       StartFadeOutAnimation( button );
936       StartFadeInAnimation();
937
938       if( buttonImage || selectedImage )
939       {
940         mPaintState = PressedReleasedTransition;
941       }
942       else
943       {
944         mPaintState = ReleasedState;
945       }
946       break;
947     }
948     case ReleasedPressedTransition:
949     {
950       float opacity = 1.f;
951       if( fadeOutButtonImage )
952       {
953         opacity = fadeOutButtonImage.GetCurrentOpacity();
954       }
955       StopFadeOutAnimation( button, false );
956       StopFadeInAnimation();
957
958       FadeOutImage( button, Foreground, selectedImage, 1.f - opacity );
959       FadeInImage( button, buttonImage, opacity );
960
961       StartFadeOutAnimation( button );
962       StartFadeInAnimation();
963
964       if( buttonImage || selectedImage )
965       {
966         mPaintState = PressedReleasedTransition;
967       }
968       else
969       {
970         mPaintState = ReleasedState;
971       }
972       break;
973     }
974     default:
975     {
976       break;
977     }
978   }
979 }
980
981 void PushButtonDefaultPainter::Clicked( Toolkit::PushButton& button )
982 {
983   Released( button );
984 }
985
986 void PushButtonDefaultPainter::Toggled( Toolkit::PushButton& button )
987 {
988   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
989   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
990   Actor& buttonImage = pushButtonImpl.GetButtonImage();
991   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
992
993   switch( mPaintState )
994   {
995     case ReleasedState:
996     {
997       StopFadeOutAnimation( button );
998       FadeOutImage( button, Foreground, buttonImage );
999       FadeInImage( button, selectedImage );
1000       StartFadeOutAnimation( button );
1001       StartFadeInAnimation();
1002
1003       if( buttonImage || selectedImage )
1004       {
1005         mPaintState = ReleasedPressedTransition;
1006       }
1007       else
1008       {
1009         mPaintState = PressedState;
1010       }
1011       break;
1012     }
1013     case PressedState:
1014     {
1015       StopFadeOutAnimation( button );
1016       FadeOutImage( button, Foreground, selectedImage );
1017       FadeInImage( button, buttonImage );
1018       StartFadeOutAnimation( button );
1019       StartFadeInAnimation();
1020
1021       if( buttonImage || selectedImage )
1022       {
1023         mPaintState = PressedReleasedTransition;
1024       }
1025       else
1026       {
1027         mPaintState = ReleasedState;
1028       }
1029       break;
1030     }
1031     case ReleasedPressedTransition:
1032     {
1033       float opacity = 1.f;
1034       if( fadeOutButtonImage )
1035       {
1036         opacity = fadeOutButtonImage.GetCurrentOpacity();
1037       }
1038       StopFadeOutAnimation( button, false );
1039       StopFadeInAnimation();
1040
1041       FadeOutImage( button, Foreground, selectedImage, 1.f - opacity );
1042       FadeInImage( button, buttonImage, opacity );
1043
1044       StartFadeOutAnimation( button );
1045       StartFadeInAnimation();
1046
1047       if( buttonImage || selectedImage )
1048       {
1049         mPaintState = PressedReleasedTransition;
1050       }
1051       else
1052       {
1053         mPaintState = ReleasedState;
1054       }
1055       break;
1056     }
1057     case PressedReleasedTransition:
1058     {
1059       float opacity = 0.f;
1060       if( fadeOutButtonImage )
1061       {
1062         opacity = 1.f - fadeOutButtonImage.GetCurrentOpacity();
1063       }
1064       StopFadeOutAnimation( button, false );
1065       StopFadeInAnimation();
1066
1067       FadeOutImage( button, Foreground, buttonImage, 1.f - opacity );
1068       FadeInImage( button, selectedImage, opacity );
1069
1070       StartFadeOutAnimation( button );
1071       StartFadeInAnimation();
1072
1073       if( buttonImage || selectedImage )
1074       {
1075         mPaintState = ReleasedPressedTransition;
1076       }
1077       else
1078       {
1079         mPaintState = PressedState;
1080       }
1081       break;
1082     }
1083     default:
1084     {
1085       break;
1086     }
1087   }
1088 }
1089
1090 void PushButtonDefaultPainter::ApplyConstraint( Actor& actor, float depth )
1091 {
1092   if( actor )
1093   {
1094     actor.SetPosition( 0.f, 0.f, depth );
1095     actor.RemoveConstraints();
1096     actor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
1097   }
1098 }
1099
1100 void PushButtonDefaultPainter::AddToFadeInAnimation( const Actor& actor )
1101 {
1102   if( !mFadeInAnimation )
1103   {
1104     mFadeInAnimation = Dali::Animation::New( mAnimationTime );
1105   }
1106
1107   mFadeInAnimation.OpacityTo( actor, 1.f );
1108 }
1109
1110 void PushButtonDefaultPainter::StartFadeInAnimation()
1111 {
1112   if( mFadeInAnimation )
1113   {
1114     mFadeInAnimation.FinishedSignal().Connect( this, &PushButtonDefaultPainter::PressedReleasedFadeInAnimationFinished );
1115     mFadeInAnimation.Play();
1116   }
1117 }
1118
1119 void PushButtonDefaultPainter::StopFadeInAnimation()
1120 {
1121   if( mFadeInAnimation )
1122   {
1123     mFadeInAnimation.Clear();
1124     mFadeInAnimation.Reset();
1125   }
1126 }
1127
1128 void PushButtonDefaultPainter::AddToFadeOutAnimation( const Actor& actor )
1129 {
1130   if( !mFadeOutAnimation )
1131   {
1132     mFadeOutAnimation = Dali::Animation::New( mAnimationTime );
1133   }
1134
1135   mFadeOutAnimation.OpacityTo( actor, 0.f );
1136 }
1137
1138 void PushButtonDefaultPainter::StartFadeOutAnimation( Toolkit::PushButton& pushButton )
1139 {
1140   if( mFadeOutAnimation )
1141   {
1142     Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( pushButton );
1143     mButton = &pushButtonImpl;
1144
1145     mFadeOutAnimation.FinishedSignal().Connect( this, &PushButtonDefaultPainter::PressedReleasedFadeOutAnimationFinished );
1146     mFadeOutAnimation.Play();
1147   }
1148 }
1149
1150 void PushButtonDefaultPainter::StopFadeOutAnimation( Toolkit::PushButton& pushButton, bool remove )
1151 {
1152   if( mFadeOutAnimation )
1153   {
1154     mFadeOutAnimation.Clear();
1155   }
1156
1157   mFadeOutAnimation.Reset();
1158
1159   if( remove )
1160   {
1161     Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( pushButton );
1162     Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
1163     Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
1164
1165     if( fadeOutButtonImage && fadeOutButtonImage.GetParent() )
1166     {
1167       fadeOutButtonImage.GetParent().Remove( fadeOutButtonImage );
1168     }
1169
1170     if( fadeOutBackgroundImage && fadeOutBackgroundImage.GetParent() )
1171     {
1172       fadeOutBackgroundImage.GetParent().Remove( fadeOutBackgroundImage );
1173     }
1174
1175     fadeOutButtonImage.Reset();
1176     fadeOutBackgroundImage.Reset();
1177   }
1178 }
1179
1180 void PushButtonDefaultPainter::FadeInImage( Toolkit::PushButton& pushButton, Actor& image, float opacity )
1181 {
1182   if( image )
1183   {
1184     image.SetOpacity( opacity );
1185     if( !image.GetParent() )
1186     {
1187       pushButton.Add( image );
1188     }
1189
1190     AddToFadeInAnimation( image );
1191   }
1192 }
1193
1194 void PushButtonDefaultPainter::FadeOutImage( Toolkit::PushButton& pushButton, ImageLayer layer, Actor& image, float opacity )
1195 {
1196   if( image )
1197   {
1198     Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( pushButton );
1199     Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
1200     Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
1201
1202     Actor& actorLayer = ( ( Background == layer ) ? fadeOutBackgroundImage : fadeOutButtonImage );
1203
1204     actorLayer = image;
1205     actorLayer.SetOpacity( opacity );
1206
1207     AddToFadeOutAnimation( actorLayer );
1208   }
1209 }
1210
1211 void PushButtonDefaultPainter::PressedReleasedFadeOutAnimationFinished( Dali::Animation& source )
1212 {
1213   switch( mPaintState )
1214   {
1215     case ReleasedPressedTransition:
1216     {
1217       mPaintState = PressedState;
1218       break;
1219     }
1220     case PressedReleasedTransition:
1221     {
1222       mPaintState = ReleasedState;
1223       break;
1224     }
1225     case ReleasedDisabledTransition:
1226     {
1227       mPaintState = DisabledReleasedState;
1228       break;
1229     }
1230     case DisabledReleasedTransition:
1231     {
1232       mPaintState = ReleasedState;
1233       break;
1234     }
1235     case PressedDisabledTransition:
1236     {
1237       mPaintState = DisabledPressedState;
1238       break;
1239     }
1240     case DisabledPressedTransition:
1241     {
1242       mPaintState = PressedState;
1243       break;
1244     }
1245     default:
1246     {
1247       break;
1248     }
1249   }
1250
1251   Toolkit::PushButton handle( mButton->GetOwner() );
1252   StopFadeOutAnimation( handle );
1253   mButton = NULL;
1254 }
1255
1256 void PushButtonDefaultPainter::PressedReleasedFadeInAnimationFinished( Dali::Animation& source )
1257 {
1258   switch( mPaintState )
1259   {
1260     case ReleasedPressedTransition:
1261     {
1262       mPaintState = PressedState;
1263       break;
1264     }
1265     case PressedReleasedTransition:
1266     {
1267       mPaintState = ReleasedState;
1268       break;
1269     }
1270     case ReleasedDisabledTransition:
1271     {
1272       mPaintState = DisabledReleasedState;
1273       break;
1274     }
1275     case DisabledReleasedTransition:
1276     {
1277       mPaintState = ReleasedState;
1278       break;
1279     }
1280     case PressedDisabledTransition:
1281     {
1282       mPaintState = DisabledPressedState;
1283       break;
1284     }
1285     case DisabledPressedTransition:
1286     {
1287       mPaintState = PressedState;
1288       break;
1289     }
1290     default:
1291     {
1292       break;
1293     }
1294   }
1295
1296   StopFadeInAnimation();
1297 }
1298
1299 } // namespace Internal
1300
1301 } // namespace Toolkit
1302
1303 } // namespace Dali