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=4b4e0708357cb7fcf31a4c428d1c7a3845081d8f;hp=b3bcb31d956783adf534680c574850b5244acf38;hb=f4b327350bf7873847f8f08bb27d11361f60f759;hpb=306d2f61a1b64179e801fa8a0bb2bd7b4e9dd682 diff --git a/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp b/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp index b3bcb31..4b4e070 100644 --- a/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp +++ b/dali-toolkit/internal/controls/buttons/radio-button-impl.cpp @@ -15,37 +15,38 @@ * */ - // CLASS HEADER #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 { - BaseHandle Create() { return Toolkit::RadioButton::New(); } -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"; +TypeRegistration typeRegistration(typeid(Toolkit::RadioButton), typeid(Toolkit::Button), Create); -const Vector3 DISTANCE_BETWEEN_IMAGE_AND_LABEL(5.0f, 0.0f, 0.0f); -} +} // namespace Dali::Toolkit::RadioButton RadioButton::New() { // Create the implementation, temporarily owned on stack - IntrusivePtr< RadioButton > internalRadioButton = new RadioButton(); + IntrusivePtr internalRadioButton = new RadioButton(); // Pass ownership to CustomActor Dali::Toolkit::RadioButton radioButton(*internalRadioButton); @@ -58,179 +59,75 @@ Dali::Toolkit::RadioButton RadioButton::New() } RadioButton::RadioButton() - : mSelected(false) { - mUnselectedImage = Dali::Image::New( UNSELECTED_BUTTON_IMAGE_DIR ); - mSelectedImage = Dali::Image::New( SELECTED_BUTTON_IMAGE_DIR ); - - mRadioIcon = Dali::ImageActor::New( mUnselectedImage ); + SetTogglableButton(true); } RadioButton::~RadioButton() { } -void RadioButton::SetLabel(const std::string& label) +void RadioButton::OnInitialize() { - // TODO + Button::OnInitialize(); - RelayoutRequest(); + DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) { + return std::unique_ptr( + new AccessibleImpl(actor, Dali::Accessibility::Role::RADIO_BUTTON)); + }); } -void RadioButton::SetLabel(Actor label) +bool RadioButton::OnToggleReleased() { - 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; - - RelayoutRequest(); - } + // Radio button overrides toggle release (button up) as doesn't allow un-selection to be performed on it directly. + return false; } -Actor RadioButton::GetLabel() const +void RadioButton::OnStateChange(State newState) { - return mLabel; -} + // 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); -void RadioButton::SetSelected(bool selected) -{ - if( mSelected != selected ) + 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() ); - mStateChangedSignal.Emit( handle, mSelected ); - - RelayoutRequest(); } -} - -bool RadioButton::IsSelected()const -{ - return mSelected; -} - -void RadioButton::ToggleState() -{ - SetSelected(!mSelected); -} - -void RadioButton::OnRelayout( const Vector2& /*size*/, ActorSizeContainer& container ) -{ - Vector3 newSize( mRadioIcon.GetNaturalSize() ); - if( mLabel ) + // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used + if(Dali::Accessibility::IsUp() && (Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor() == Self()) + && (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( mLabel.GetNaturalSize() ); - Control::Relayout( mLabel, Vector2( actorNaturalSize.width, actorNaturalSize.height ), container ); - - Vector3 actorSize( mLabel.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 ); + auto state = Button::AccessibleImpl::CalculateStates(); + auto self = Toolkit::Button::DownCast(Self()); - RelayoutRequest(); -} - -void RadioButton::OnButtonUp() -{ - // Don't allow selection on an already selected radio button - if( !mSelected ) + if(self.GetProperty(Toolkit::Button::Property::SELECTED)) { - ToggleState(); + state[Dali::Accessibility::State::CHECKED] = true; } -} - -void RadioButton::SetProperty(BaseObject* object, Property::Index propertyIndex, const Property::Value& value) -{ - Toolkit::RadioButton radioButton = Toolkit::RadioButton::DownCast( Dali::BaseHandle( object ) ); - - if( radioButton ) - { - RadioButton& radioButtonImpl( GetImplementation( radioButton ) ); - if ( propertyIndex == Toolkit::Button::PROPERTY_TOGGLED ) - { - radioButtonImpl.SetSelected( value.Get< bool >( ) ); - } - else if ( propertyIndex == Toolkit::Button::PROPERTY_LABEL_ACTOR ) - { - radioButtonImpl.SetLabel( Scripting::NewActor( value.Get< Property::Map >( ) ) ); - } - } + state[Dali::Accessibility::State::SELECTABLE] = true; + return state; } -Property::Value RadioButton::GetProperty(BaseObject* object, Property::Index propertyIndex) -{ - Property::Value value; - - Toolkit::RadioButton radioButton = Toolkit::RadioButton::DownCast( Dali::BaseHandle(object) ); +} // namespace Internal - if( radioButton ) - { - RadioButton& radioButtonImpl( GetImplementation( radioButton ) ); +} // namespace Toolkit - if ( propertyIndex == Toolkit::Button::PROPERTY_TOGGLED ) - { - value = radioButtonImpl.mSelected; - } - else if ( propertyIndex == Toolkit::Button::PROPERTY_LABEL_ACTOR ) - { - Property::Map map; - Scripting::CreatePropertyMap( radioButtonImpl.mLabel, map ); - value = map; - } - } - - return value; -} +} // namespace Dali