X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fbuttons%2Fradio-button-impl.cpp;h=9df52076562c5101289d04fdfc55b8af8f76bb06;hp=4ef25d95bc6cdd9477f6e70854ece32732933068;hb=8a647e87a01c5c78451653c1264a9eea81ac9b20;hpb=49499a0b6e23d98f681f7aefe6b18c5dad55f8b3 diff --git a/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp b/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp index 4ef25d9..9df5207 100644 --- a/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp +++ b/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp @@ -20,11 +20,21 @@ #include "radio-button-impl.h" // EXTERNAL INCLUDES +#include #include -#include -using namespace Dali; -using namespace Dali::Toolkit::Internal; +#if defined(DEBUG_ENABLED) + extern Debug::Filter* gLogButtonFilter; +#endif + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ namespace { @@ -36,10 +46,6 @@ BaseHandle Create() TypeRegistration typeRegistration( typeid( Toolkit::RadioButton ), typeid( Toolkit::Button ), Create); -const char* const UNSELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-unselected.png"; -const char* const SELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-selected.png"; - -const Vector3 DISTANCE_BETWEEN_IMAGE_AND_LABEL(5.0f, 0.0f, 0.0f); } Dali::Toolkit::RadioButton RadioButton::New() @@ -59,119 +65,69 @@ Dali::Toolkit::RadioButton RadioButton::New() RadioButton::RadioButton() { - mUnselectedImage = Dali::ResourceImage::New( UNSELECTED_BUTTON_IMAGE_DIR ); - mSelectedImage = Dali::ResourceImage::New( SELECTED_BUTTON_IMAGE_DIR ); - - mRadioIcon = Dali::ImageActor::New( mUnselectedImage ); - -// SetTogglableButton(true); - mTogglableButton = true; // TODO: Use SetTogglableButton() after refactoring painter + SetTogglableButton(true); + DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) { + return std::unique_ptr< Dali::Accessibility::Accessible >( + new AccessibleImpl( actor, Dali::Accessibility::Role::RADIO_BUTTON ) ); + } ); } RadioButton::~RadioButton() { } -void RadioButton::SetLabel( Actor label ) +void RadioButton::OnInitialize() { - if( mLabel != label ) - { - if( mLabel ) - { - mRadioIcon.Remove( mLabel ); - } - - if( label ) - { - label.SetParentOrigin( ParentOrigin::CENTER_RIGHT ); - label.SetAnchorPoint( AnchorPoint::CENTER_LEFT ); - label.MoveBy( DISTANCE_BETWEEN_IMAGE_AND_LABEL ); - mRadioIcon.Add( label ); - } - - mLabel = label; + Button::OnInitialize(); +} - RelayoutRequest(); - } +bool RadioButton::OnToggleReleased() +{ + // Radio button overrides toggle release (button up) as doesn't allow un-selection to be performed on it directly. + return false; } -void RadioButton::SetSelected( bool selected ) +void RadioButton::OnStateChange( State newState ) { - if( IsSelected() != selected ) + // Radio button can be part of a group, if a button in the group is selected then all others should be unselected + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "RadioButton::OnStateChange state(%d)\n", newState ); + + if ( SELECTED_STATE == newState ) { - if( selected ) + Actor parent = Self().GetParent(); + if( parent ) { - Actor parent = Self().GetParent(); - if( parent ) + for( unsigned int i = 0; i < parent.GetChildCount(); ++i ) { - for( unsigned int i = 0; i < parent.GetChildCount(); ++i ) + Dali::Toolkit::RadioButton radioButtonChild = Dali::Toolkit::RadioButton::DownCast( parent.GetChildAt( i ) ); + if( radioButtonChild && radioButtonChild != Self() ) { - Dali::Toolkit::RadioButton rbChild = Dali::Toolkit::RadioButton::DownCast(parent.GetChildAt(i)); - - if( rbChild ) - { - rbChild.SetSelected(false); - } + radioButtonChild.SetProperty( Toolkit::Button::Property::SELECTED, false ); } } - - mSelected = true; - mRadioIcon.SetImage(mSelectedImage); } - else - { - mSelected = false; - mRadioIcon.SetImage(mUnselectedImage); - } - - // Raise state changed signal - Toolkit::RadioButton handle( GetOwner() ); - StateChangedSignal().Emit( handle ); - - RelayoutRequest(); } -} - -void RadioButton::OnRelayout( const Vector2& /*size*/, ActorSizeContainer& container ) -{ - Vector3 newSize( mRadioIcon.GetNaturalSize() ); - - Actor& label = GetLabel(); - - if( label ) + // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used + if (Dali::Accessibility::IsUp() && (newState == SELECTED_STATE || newState == UNSELECTED_STATE)) { - // Offset the label from the radio button image - newSize.width += DISTANCE_BETWEEN_IMAGE_AND_LABEL.width; - - // Find the size of the control using size negotiation - Vector3 actorNaturalSize( label.GetNaturalSize() ); - Control::Relayout( label, Vector2( actorNaturalSize.width, actorNaturalSize.height ), container ); - - Vector3 actorSize( label.GetSize() ); - newSize.width += actorSize.width; - newSize.height = std::max( newSize.height, actorSize.height ); + Dali::Accessibility::Accessible::Get(Self())->EmitStateChanged( + Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0 + ); } - - Self().SetSize( newSize ); } -void RadioButton::OnInitialize() +Dali::Accessibility::States RadioButton::AccessibleImpl::CalculateStates() { - mRadioIcon.SetAnchorPoint( AnchorPoint::CENTER_LEFT ); - mRadioIcon.SetParentOrigin( ParentOrigin::CENTER_LEFT ); - Self().Add( mRadioIcon ); - - RelayoutRequest(); + auto tmp = Button::AccessibleImpl::CalculateStates(); + auto slf = Toolkit::Button::DownCast( self ); + if( slf.GetProperty( Toolkit::Button::Property::SELECTED ) ) + tmp[Dali::Accessibility::State::CHECKED] = true; + tmp[Dali::Accessibility::State::SELECTABLE] = true; + return tmp; } -void RadioButton::OnButtonUp() -{ - if( ButtonDown == GetState() ) - { - // Don't allow selection on an already selected radio button - if( !IsSelected() ) - { - SetSelected(!IsSelected()); - } - } -} +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali