X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fbuttons%2Fpush-button-impl.cpp;h=2dc4385f19794dc2daf4f84fc8b1cb035953b513;hp=612d010fcd3c6426a569dfc5b9a7bdbff73fd88a;hb=19b6edb066bc90ab6fd4ce93b9dc49b5224d7815;hpb=5e937a6322849b76d49d5b3f41cb5d91c94acd3e diff --git a/dali-toolkit/internal/controls/buttons/push-button-impl.cpp b/dali-toolkit/internal/controls/buttons/push-button-impl.cpp index 612d010..2dc4385 100644 --- a/dali-toolkit/internal/controls/buttons/push-button-impl.cpp +++ b/dali-toolkit/internal/controls/buttons/push-button-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,34 +19,29 @@ #include "push-button-impl.h" // EXTERNAL INCLUDES -#include -#include -#include #include #include +#include +#include // INTERNAL INCLUDES -#include -#include #include #include +#include +#include #if defined(DEBUG_ENABLED) - extern Debug::Filter* gLogButtonFilter; +extern Debug::Filter* gLogButtonFilter; #endif namespace Dali { - namespace Toolkit { - namespace Internal { - namespace { - BaseHandle Create() { return Toolkit::PushButton::New(); @@ -54,40 +49,26 @@ BaseHandle Create() // Properties -DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PushButton, Toolkit::Button, Create ) +DALI_TYPE_REGISTRATION_BEGIN(Toolkit::PushButton, Toolkit::Button, Create) -DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "unselectedIcon", STRING, UNSELECTED_ICON ) -DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "selectedIcon", STRING, SELECTED_ICON ) -DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconAlignment", STRING, ICON_ALIGNMENT ) -DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "labelPadding", STRING, LABEL_PADDING ) -DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconPadding", STRING, ICON_PADDING ) +DALI_PROPERTY_REGISTRATION(Toolkit, PushButton, "labelPadding", STRING, LABEL_PADDING) +DALI_PROPERTY_REGISTRATION(Toolkit, PushButton, "iconPadding", STRING, ICON_PADDING) DALI_TYPE_REGISTRATION_END() -/* - * Table to define Text-to-enum conversions for IconAlignment. - */ -const Dali::Scripting::StringEnum IconAlignmentTable[] = { - { "LEFT", Toolkit::Internal::PushButton::LEFT }, - { "RIGHT", Toolkit::Internal::PushButton::RIGHT }, - { "TOP", Toolkit::Internal::PushButton::TOP }, - { "BOTTOM", Toolkit::Internal::PushButton::BOTTOM }, -}; const unsigned int IconAlignmentTableCount = sizeof( IconAlignmentTable ) / sizeof( IconAlignmentTable[0] ); - } // unnamed namespace namespace { - } // unnamed namespace Dali::Toolkit::PushButton PushButton::New() { // Create the implementation, temporarily owned on stack - IntrusivePtr< PushButton > internalPushButton = new PushButton(); + IntrusivePtr internalPushButton = new PushButton(); // Pass ownership to CustomActor - Dali::Toolkit::PushButton pushButton( *internalPushButton ); + Dali::Toolkit::PushButton pushButton(*internalPushButton); // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -98,7 +79,7 @@ Dali::Toolkit::PushButton PushButton::New() PushButton::PushButton() : Button(), - mIconAlignment( RIGHT ) + mIconAlignment(RIGHT) { } @@ -112,37 +93,42 @@ void PushButton::OnInitialize() // Push button requires the Leave event. Actor self = Self(); - self.SetProperty( Actor::Property::LEAVE_REQUIRED, true ); + self.SetProperty(Actor::Property::LEAVE_REQUIRED, true); + + DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) { + return std::unique_ptr( + new AccessibleImpl(actor, Dali::Accessibility::Role::PUSH_BUTTON)); + }); } -void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment ) +void PushButton::SetIconAlignment(const PushButton::IconAlignment iconAlignment) { mIconAlignment = iconAlignment; Button::Align labelAlignment; - switch ( iconAlignment ) - { - case RIGHT: - { - labelAlignment = Button::BEGIN; - break; - } - case TOP: - { - labelAlignment = Button::BOTTOM; - break; - } - case BOTTOM: + switch(iconAlignment) { - labelAlignment = Button::TOP; - break; - } - case LEFT: - default: - labelAlignment = Button::END; - break; + case RIGHT: + { + labelAlignment = Button::BEGIN; + break; + } + case TOP: + { + labelAlignment = Button::BOTTOM; + break; + } + case BOTTOM: + { + labelAlignment = Button::TOP; + break; + } + case LEFT: + default: + labelAlignment = Button::END; + break; } - Button::SetLabelAlignment( labelAlignment ); + Button::SetLabelAlignment(labelAlignment); } const PushButton::IconAlignment PushButton::GetIconAlignment() const @@ -150,90 +136,56 @@ const PushButton::IconAlignment PushButton::GetIconAlignment() const return mIconAlignment; } -void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value ) +void PushButton::SetProperty(BaseObject* object, Property::Index propertyIndex, const Property::Value& value) { - Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) ); + Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast(Dali::BaseHandle(object)); - if ( pushButton ) + if(pushButton) { - PushButton& pushButtonImpl( GetImplementation( pushButton ) ); + PushButton& pushButtonImpl(GetImplementation(pushButton)); // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class - switch ( propertyIndex ) + switch(propertyIndex) { - case Toolkit::PushButton::Property::UNSELECTED_ICON: - { - pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT ); - break; - } - case Toolkit::PushButton::Property::SELECTED_ICON: - { - pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT ); - break; - } - case Toolkit::PushButton::Property::ICON_ALIGNMENT: - { - IconAlignment iconAlignment; - if( Scripting::GetEnumeration< IconAlignment >( value.Get< std::string >().c_str(), IconAlignmentTable, IconAlignmentTableCount, iconAlignment ) ) - { - pushButtonImpl.SetIconAlignment( iconAlignment ); - } - break; - } case Toolkit::PushButton::Property::LABEL_PADDING: { - Vector4 padding ( value.Get< Vector4 >() ); - pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) ); + Vector4 padding(value.Get()); + pushButtonImpl.Button::SetLabelPadding(Padding(padding.x, padding.y, padding.z, padding.w)); break; } case Toolkit::PushButton::Property::ICON_PADDING: { - Vector4 padding ( value.Get< Vector4 >() ); - pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) ); + Vector4 padding(value.Get()); + pushButtonImpl.Button::SetForegroundPadding(Padding(padding.x, padding.y, padding.z, padding.w)); break; } } } } -Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex ) +Property::Value PushButton::GetProperty(BaseObject* object, Property::Index propertyIndex) { Property::Value value; - Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) ); + Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast(Dali::BaseHandle(object)); - if ( pushButton ) + if(pushButton) { - PushButton& pushButtonImpl( GetImplementation( pushButton ) ); + PushButton& pushButtonImpl(GetImplementation(pushButton)); - switch ( propertyIndex ) + switch(propertyIndex) { - case Toolkit::PushButton::Property::UNSELECTED_ICON: - { - //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION ); - break; - } - case Toolkit::PushButton::Property::SELECTED_ICON: - { - //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION ); - break; - } - case Toolkit::PushButton::Property::ICON_ALIGNMENT: - { - value = Scripting::GetLinearEnumerationName< IconAlignment >( pushButtonImpl.GetIconAlignment(), IconAlignmentTable, IconAlignmentTableCount ); - break; - } case Toolkit::PushButton::Property::LABEL_PADDING: { Padding padding = pushButtonImpl.Button::GetLabelPadding(); - value = Vector4( padding.x, padding.y, padding.top, padding.bottom); + value = Vector4(padding.x, padding.y, padding.top, padding.bottom); break; } case Toolkit::PushButton::Property::ICON_PADDING: { Padding padding = pushButtonImpl.Button::GetForegroundPadding(); - value = Vector4( padding.x, padding.y, padding.top, padding.bottom); + value = Vector4(padding.x, padding.y, padding.top, padding.bottom); break; } } @@ -242,6 +194,31 @@ Property::Value PushButton::GetProperty( BaseObject* object, Property::Index pro return value; } +Dali::Accessibility::States PushButton::AccessibleImpl::CalculateStates() +{ + auto tmp = Button::AccessibleImpl::CalculateStates(); + auto slf = Toolkit::Button::DownCast(Self()); + tmp[Dali::Accessibility::State::PRESSED] = slf.GetProperty(Toolkit::Button::Property::SELECTED); + return tmp; +} + +void PushButton::OnStateChange(State newState) +{ + // 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)) + { + Dali::Accessibility::Accessible::Get(Self())->EmitStateChanged( + Dali::Accessibility::State::PRESSED, newState == SELECTED_STATE ? 1 : 0, 0); + + if(Self().GetProperty(Toolkit::Button::Property::TOGGLABLE)) + { + Dali::Accessibility::Accessible::Get(Self())->EmitStateChanged( + Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0); + } + } +} + } // namespace Internal } // namespace Toolkit