2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "check-box-button-impl.h"
22 #include <dali/public-api/actors/image-actor.h>
23 #include <dali/public-api/object/type-registry.h>
37 const float FOREGROUND_DEPTH( 0.5f );
38 const float BACKGROUND_DEPTH( 0.25f );
40 const float ANIMATION_TIME( 0.26f ); // EFL checkbox tick time
42 const Vector3 DISTANCE_BETWEEN_IMAGE_AND_LABEL(5.0f, 0.0f, 0.0f);
46 return Toolkit::CheckBoxButton::New();
49 TypeRegistration mType( typeid(Toolkit::CheckBoxButton), typeid(Toolkit::Button), Create );
53 Dali::Toolkit::CheckBoxButton CheckBoxButton::New()
55 // Create the implementation, temporarily owned on stack
56 IntrusivePtr< CheckBoxButton > internalCheckBoxButton = new CheckBoxButton();
58 // Pass ownership to CustomActor
59 Dali::Toolkit::CheckBoxButton checkBoxButton( *internalCheckBoxButton );
61 // Second-phase init of the implementation
62 // This can only be done after the CustomActor connection has been made...
63 internalCheckBoxButton->Initialize();
65 return checkBoxButton;
68 CheckBoxButton::CheckBoxButton()
70 mPaintState( UnselectedState )
72 SetTogglableButton( true );
74 SetAnimationTime( ANIMATION_TIME );
77 CheckBoxButton::~CheckBoxButton()
79 if( mCheckInAnimation )
81 mCheckInAnimation.Clear();
85 void CheckBoxButton::SetSelectedImage( Actor image )
87 Actor& selectedImage = GetSelectedImage();
93 if( selectedImage && selectedImage.GetParent() )
95 Self().Remove( selectedImage );
98 selectedImage = image;
99 Self().Add( selectedImage );
102 case UnselectedSelectedTransition:
104 StopCheckInAnimation();
105 Self().Remove( selectedImage );
107 selectedImage = image;
108 Self().Add( selectedImage );
110 mPaintState = SelectedState;
115 selectedImage = image;
120 selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
121 selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
122 selectedImage.SetZ( FOREGROUND_DEPTH );
125 void CheckBoxButton::SetBackgroundImage( Actor image )
127 Actor& backgroundImage = GetBackgroundImage();
129 switch( mPaintState )
131 case UnselectedState: // FALLTHROUGH
133 case UnselectedSelectedTransition:
135 if( backgroundImage && backgroundImage.GetParent() )
137 Self().Remove( backgroundImage );
139 Actor& label = GetLabel();
143 backgroundImage.Remove( label );
148 backgroundImage = image;
149 Self().Add( backgroundImage );
154 backgroundImage = image;
159 backgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
160 backgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
161 backgroundImage.SetZ( BACKGROUND_DEPTH );
164 void CheckBoxButton::SetDisabledSelectedImage( Actor image )
166 Actor& disabledSelectedImage = GetDisabledSelectedImage();
168 switch( mPaintState )
170 case DisabledSelectedState:
172 if( disabledSelectedImage && disabledSelectedImage.GetParent() )
174 Self().Remove( disabledSelectedImage );
177 disabledSelectedImage = image;
178 Self().Add( disabledSelectedImage );
183 disabledSelectedImage = image;
188 disabledSelectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
189 disabledSelectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
190 disabledSelectedImage.SetZ( FOREGROUND_DEPTH );
193 void CheckBoxButton::SetDisabledBackgroundImage( Actor image )
195 Actor& disabledBackgroundImage = GetDisabledBackgroundImage();
197 switch( mPaintState )
199 case DisabledSelectedState:
200 case DisabledUnselectedState:
202 if( disabledBackgroundImage && disabledBackgroundImage.GetParent() )
204 Self().Remove( disabledBackgroundImage );
206 Actor& label = GetLabel();
210 disabledBackgroundImage.Remove( label );
215 disabledBackgroundImage = image;
216 Self().Add( disabledBackgroundImage );
221 disabledBackgroundImage = image;
226 disabledBackgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
227 disabledBackgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
228 disabledBackgroundImage.SetZ( BACKGROUND_DEPTH );
231 void CheckBoxButton::OnLabelSet()
233 Actor& label = GetLabel();
237 label.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
238 label.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
239 label.MoveBy( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
241 if( IsDisabled() && GetDisabledBackgroundImage() )
243 GetDisabledBackgroundImage().Add( label );
245 else if ( GetBackgroundImage() )
247 GetBackgroundImage().Add( label );
256 void CheckBoxButton::OnSelected( bool selected )
258 Actor& selectedImage = GetSelectedImage();
260 switch( mPaintState )
262 case UnselectedState:
264 AddChild( selectedImage );
265 StartCheckInAnimation( selectedImage ); // Animate in the check actor
267 mPaintState = UnselectedSelectedTransition;
272 RemoveChild( selectedImage );
274 mPaintState = UnselectedState;
277 case UnselectedSelectedTransition:
279 StopCheckInAnimation();
280 RemoveChild( selectedImage );
282 mPaintState = UnselectedState;
290 void CheckBoxButton::OnDisabled( bool disabled )
292 Actor& backgroundImage = GetBackgroundImage();
293 Actor& selectedImage = GetSelectedImage();
294 Actor& disabledBackgroundImage = GetDisabledBackgroundImage();
295 Actor& disabledSelectedImage = GetDisabledSelectedImage();
297 switch( mPaintState )
299 case UnselectedState:
303 RemoveChild( backgroundImage );
304 AddChild( disabledBackgroundImage );
305 mPaintState = DisabledUnselectedState;
313 RemoveChild( backgroundImage );
314 RemoveChild( selectedImage );
315 AddChild( disabledBackgroundImage );
316 AddChild( disabledSelectedImage );
318 mPaintState = DisabledSelectedState;
322 case DisabledUnselectedState:
326 RemoveChild( disabledBackgroundImage );
327 AddChild( backgroundImage );
329 mPaintState = UnselectedState;
333 case DisabledSelectedState:
337 RemoveChild( disabledBackgroundImage );
338 RemoveChild( disabledSelectedImage );
339 AddChild( backgroundImage );
340 AddChild( selectedImage );
342 mPaintState = SelectedState;
346 case UnselectedSelectedTransition:
350 StopCheckInAnimation();
352 RemoveChild( backgroundImage );
353 RemoveChild( selectedImage );
354 AddChild( disabledBackgroundImage );
355 AddChild( disabledSelectedImage );
357 mPaintState = DisabledSelectedState;
365 Actor& label = GetLabel();
369 if( label.GetParent() )
371 label.GetParent().Remove( label );
374 if( disabled && disabledBackgroundImage)
376 disabledBackgroundImage.Add( label );
378 else if( backgroundImage )
380 backgroundImage.Add( label );
385 void CheckBoxButton::OnRelayout( const Vector2& size, ActorSizeContainer& container )
389 if( IsDisabled() && GetDisabledBackgroundImage() )
391 newSize = GetDisabledBackgroundImage().GetNaturalSize();
393 else if( GetBackgroundImage() )
395 newSize = GetBackgroundImage().GetNaturalSize();
398 Actor& label = GetLabel();
402 // Offset the label from the radio button image
403 newSize.width += DISTANCE_BETWEEN_IMAGE_AND_LABEL.width;
405 // Find the size of the control using size negotiation
406 Vector3 actorNaturalSize( label.GetNaturalSize() );
407 Control::Relayout( label, Vector2( actorNaturalSize.width, actorNaturalSize.height ), container );
409 Vector3 actorSize( label.GetSize() );
410 newSize.width += actorSize.width;
411 newSize.height = std::max( newSize.height, actorSize.height );
414 Self().SetSize( newSize );
417 void CheckBoxButton::AddChild( Actor& actor )
425 void CheckBoxButton::RemoveChild( Actor& actor )
429 Self().Remove( actor );
433 void CheckBoxButton::StartCheckInAnimation( Actor& actor )
439 ImageActor imageActor = ImageActor::DownCast( actor );
440 mTickUVEffect = ImageRegionEffect::New();
441 imageActor.SetShaderEffect( mTickUVEffect );
444 actor.SetScale( Vector3( 0.0f, 1.0f, 1.0f ) );
446 mTickUVEffect.SetBottomRight( Vector2( 0.0f, 1.0f ) );
448 if( !mCheckInAnimation )
450 mCheckInAnimation = Dali::Animation::New( GetAnimationTime() );
454 mCheckInAnimation.AnimateTo( Property( mTickUVEffect, mTickUVEffect.GetBottomRightPropertyName() ), Vector2( 1.0f, 1.0f ) );
457 mCheckInAnimation.AnimateTo( Property( actor, Actor::SCALE_X ), 1.0f);
459 mCheckInAnimation.FinishedSignal().Connect( this, &CheckBoxButton::CheckInAnimationFinished );
460 mCheckInAnimation.Play();
464 void CheckBoxButton::StopCheckInAnimation()
466 if( mCheckInAnimation )
468 mCheckInAnimation.Clear();
469 mCheckInAnimation.Reset();
473 void CheckBoxButton::CheckInAnimationFinished( Dali::Animation& source )
475 switch( mPaintState )
477 case UnselectedSelectedTransition:
479 mPaintState = SelectedState;
488 StopCheckInAnimation();
491 } // namespace Internal
493 } // namespace Toolkit