#include "check-box-button-impl.h"
// EXTERNAL INCLUDES
+#include <dali/public-api/actors/image-actor.h>
#include <dali/public-api/object/type-registry.h>
-// INTERNAL INCLUDES
-#include "check-box-button-default-painter-impl.h"
-
namespace Dali
{
namespace
{
+const float DISTANCE_BETWEEN_IMAGE_AND_LABEL( 5.0f );
+const float ANIMATION_TIME( 0.26f ); // EFL checkbox tick time
+
BaseHandle Create()
{
return Toolkit::CheckBoxButton::New();
CheckBoxButton::CheckBoxButton()
: Button()
{
- // Creates specific painter.
- ButtonPainterPtr painter = new CheckBoxButtonDefaultPainter();
- SetPainter( painter );
-
SetTogglableButton( true );
+
+ SetAnimationTime( ANIMATION_TIME );
}
CheckBoxButton::~CheckBoxButton()
{
- SetPainter( NULL );
+ if( mTransitionAnimation )
+ {
+ mTransitionAnimation.Clear();
+ }
+}
+
+void CheckBoxButton::OnButtonInitialize()
+{
+ // Wrap around all children
+ Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+}
+
+void CheckBoxButton::OnLabelSet()
+{
+ Actor& label = GetLabel();
+
+ if( label )
+ {
+ label.SetParentOrigin( ParentOrigin::CENTER_LEFT );
+ label.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
+
+ if( IsDisabled() && GetDisabledBackgroundImage() )
+ {
+ label.SetX( GetDisabledBackgroundImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ else if ( GetBackgroundImage() )
+ {
+ label.SetX( GetBackgroundImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ else
+ {
+ label.SetX( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ }
+}
+
+bool CheckBoxButton::OnSelected()
+{
+ Actor& selectedImage = GetSelectedImage();
+
+ PaintState paintState = GetPaintState();
+
+ switch( paintState )
+ {
+ case UnselectedState:
+ {
+ StartTransitionAnimation( selectedImage );
+ break;
+ }
+ case SelectedState:
+ {
+ RemoveChild( selectedImage );
+ break;
+ }
+ case UnselectedSelectedTransition:
+ {
+ StopTransitionAnimation( false );
+ RemoveChild( selectedImage );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ if( mTransitionAnimation )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool CheckBoxButton::OnDisabled()
+{
+ Actor& backgroundImage = GetBackgroundImage();
+ Actor& selectedImage = GetSelectedImage();
+ Actor& disabledBackgroundImage = GetDisabledBackgroundImage();
+ Actor& disabledSelectedImage = GetDisabledSelectedImage();
+
+ PaintState paintState = GetPaintState();
+
+ switch( paintState )
+ {
+ case UnselectedState:
+ {
+ RemoveChild( backgroundImage );
+ break;
+ }
+ case SelectedState:
+ {
+ RemoveChild( backgroundImage );
+ RemoveChild( selectedImage );
+ break;
+ }
+ case DisabledUnselectedState:
+ {
+ RemoveChild( disabledBackgroundImage );
+ break;
+ }
+ case DisabledSelectedState:
+ {
+ RemoveChild( disabledBackgroundImage );
+ RemoveChild( disabledSelectedImage );
+ break;
+ }
+ case UnselectedSelectedTransition:
+ {
+ StopTransitionAnimation();
+
+ RemoveChild( backgroundImage );
+ RemoveChild( selectedImage );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ Actor& label = GetLabel();
+
+ if( label )
+ {
+ if( IsDisabled() && disabledBackgroundImage)
+ {
+ label.SetX( disabledBackgroundImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ else if( backgroundImage )
+ {
+ label.SetX( backgroundImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ else
+ {
+ label.SetX( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
+ }
+ }
+
+ if( mTransitionAnimation )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void CheckBoxButton::StopAllAnimations()
+{
+ StopTransitionAnimation();
+}
+
+void CheckBoxButton::StartTransitionAnimation( Actor& actor )
+{
+ if( actor )
+ {
+ if( !mTickUVEffect )
+ {
+ ImageActor imageActor = ImageActor::DownCast( actor );
+ mTickUVEffect = ImageRegionEffect::New();
+ imageActor.SetShaderEffect( mTickUVEffect );
+ }
+
+ actor.SetScale( Vector3( 0.0f, 1.0f, 1.0f ) );
+
+ mTickUVEffect.SetBottomRight( Vector2( 0.0f, 1.0f ) );
+
+ if( !mTransitionAnimation )
+ {
+ mTransitionAnimation = Dali::Animation::New( GetAnimationTime() );
+ }
+
+ // UV anim
+ mTransitionAnimation.AnimateTo( Property( mTickUVEffect, mTickUVEffect.GetBottomRightPropertyName() ), Vector2( 1.0f, 1.0f ) );
+
+ // Actor size anim
+ mTransitionAnimation.AnimateTo( Property( actor, Actor::Property::SCALE_X ), 1.0f );
+
+ mTransitionAnimation.FinishedSignal().Connect( this, &CheckBoxButton::TransitionAnimationFinished );
+ mTransitionAnimation.Play();
+ }
+}
+
+void CheckBoxButton::StopTransitionAnimation( bool remove )
+{
+ if( mTransitionAnimation )
+ {
+ mTransitionAnimation.Clear();
+ mTransitionAnimation.Reset();
+ }
+
+ if( remove )
+ {
+ UpdatePaintTransitionState();
+ }
+}
+
+void CheckBoxButton::TransitionAnimationFinished( Dali::Animation& source )
+{
+ StopTransitionAnimation();
}
} // namespace Internal