[Tizen](ATSPI) squashed implementation
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-impl.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include "push-button-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/object/type-registry.h>
23 #include <dali/public-api/object/type-registry-helper.h>
24 #include <dali/public-api/images/resource-image.h>
25 #include <dali/devel-api/scripting/scripting.h>
26 #include <dali/integration-api/debug.h>
27
28 // INTERNAL INCLUDES
29 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
30 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
31 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
32 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
33
34 #if defined(DEBUG_ENABLED)
35   extern Debug::Filter* gLogButtonFilter;
36 #endif
37
38 namespace Dali
39 {
40
41 namespace Toolkit
42 {
43
44 namespace Internal
45 {
46
47 namespace
48 {
49
50 BaseHandle Create()
51 {
52   return Toolkit::PushButton::New();
53 }
54
55 // Properties
56
57 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PushButton, Toolkit::Button, Create )
58
59 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "unselectedIcon",  STRING, UNSELECTED_ICON )
60 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "selectedIcon",  STRING, SELECTED_ICON )
61 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconAlignment",  STRING, ICON_ALIGNMENT )
62 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "labelPadding",  STRING, LABEL_PADDING )
63 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconPadding",  STRING, ICON_PADDING )
64
65 DALI_TYPE_REGISTRATION_END()
66
67 /*
68  * Table to define Text-to-enum conversions for IconAlignment.
69  */
70 const Dali::Scripting::StringEnum IconAlignmentTable[] = {
71   { "LEFT",   Toolkit::Internal::PushButton::LEFT },
72   { "RIGHT",  Toolkit::Internal::PushButton::RIGHT },
73   { "TOP",    Toolkit::Internal::PushButton::TOP },
74   { "BOTTOM", Toolkit::Internal::PushButton::BOTTOM },
75 }; const unsigned int IconAlignmentTableCount = sizeof( IconAlignmentTable ) / sizeof( IconAlignmentTable[0] );
76
77 } // unnamed namespace
78
79 namespace
80 {
81
82 } // unnamed namespace
83
84 Dali::Toolkit::PushButton PushButton::New()
85 {
86   // Create the implementation, temporarily owned on stack
87   IntrusivePtr< PushButton > internalPushButton = new PushButton();
88
89   // Pass ownership to CustomActor
90   Dali::Toolkit::PushButton pushButton( *internalPushButton );
91
92   // Second-phase init of the implementation
93   // This can only be done after the CustomActor connection has been made...
94   internalPushButton->Initialize();
95
96   return pushButton;
97 }
98
99 PushButton::PushButton()
100 : Button(),
101   mIconAlignment( RIGHT )
102 {
103   DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) {
104     return std::unique_ptr< Dali::Accessibility::Accessible >(
105         new AccessibleImpl( actor, Dali::Accessibility::Role::PUSH_BUTTON ) );
106   } );
107 }
108
109 PushButton::~PushButton()
110 {
111 }
112
113 void PushButton::OnInitialize()
114 {
115   Button::OnInitialize();
116
117   // Push button requires the Leave event.
118   Actor self = Self();
119   self.SetLeaveRequired( true );
120 }
121
122 void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment )
123 {
124   mIconAlignment = iconAlignment;
125   Button::Align labelAlignment;
126   switch ( iconAlignment )
127   {
128   case RIGHT:
129   {
130     labelAlignment = Button::BEGIN;
131     break;
132   }
133   case TOP:
134   {
135     labelAlignment = Button::BOTTOM;
136     break;
137   }
138   case BOTTOM:
139   {
140     labelAlignment = Button::TOP;
141     break;
142   }
143   case LEFT:
144   default:
145     labelAlignment = Button::END;
146     break;
147   }
148
149   Button::SetLabelAlignment( labelAlignment );
150 }
151
152 const PushButton::IconAlignment PushButton::GetIconAlignment() const
153 {
154   return mIconAlignment;
155 }
156
157 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
158 {
159   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
160
161   if ( pushButton )
162   {
163     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
164
165     // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class
166
167     switch ( propertyIndex )
168     {
169       case Toolkit::PushButton::Property::UNSELECTED_ICON:
170       {
171         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT );
172         break;
173       }
174       case Toolkit::PushButton::Property::SELECTED_ICON:
175       {
176         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT );
177         break;
178       }
179       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
180       {
181         IconAlignment iconAlignment;
182         if( Scripting::GetEnumeration< IconAlignment >( value.Get< std::string >().c_str(), IconAlignmentTable, IconAlignmentTableCount, iconAlignment ) )
183         {
184           pushButtonImpl.SetIconAlignment( iconAlignment );
185         }
186         break;
187       }
188       case Toolkit::PushButton::Property::LABEL_PADDING:
189       {
190         Vector4 padding ( value.Get< Vector4 >() );
191         pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
192         break;
193       }
194       case Toolkit::PushButton::Property::ICON_PADDING:
195       {
196         Vector4 padding ( value.Get< Vector4 >() );
197         pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
198         break;
199       }
200     }
201   }
202 }
203
204 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
205 {
206   Property::Value value;
207
208   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
209
210   if ( pushButton )
211   {
212     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
213
214     switch ( propertyIndex )
215     {
216       case Toolkit::PushButton::Property::UNSELECTED_ICON:
217       {
218         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
219         break;
220       }
221       case Toolkit::PushButton::Property::SELECTED_ICON:
222       {
223         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
224         break;
225       }
226       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
227       {
228         value = Scripting::GetLinearEnumerationName< IconAlignment >( pushButtonImpl.GetIconAlignment(), IconAlignmentTable, IconAlignmentTableCount );
229         break;
230       }
231       case Toolkit::PushButton::Property::LABEL_PADDING:
232       {
233         Padding padding = pushButtonImpl.Button::GetLabelPadding();
234         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
235         break;
236       }
237       case Toolkit::PushButton::Property::ICON_PADDING:
238       {
239         Padding padding = pushButtonImpl.Button::GetForegroundPadding();
240         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
241         break;
242       }
243     }
244   }
245
246   return value;
247 }
248
249 Dali::Accessibility::States PushButton::AccessibleImpl::CalculateStates()
250 {
251   auto tmp = Button::AccessibleImpl::CalculateStates();
252   auto slf = Toolkit::Button::DownCast( self );
253   tmp[Dali::Accessibility::State::PRESSED] = slf.GetProperty<bool>( Toolkit::Button::Property::SELECTED );
254   return tmp;
255 }
256
257 void PushButton::OnStateChange( State newState )
258 {
259   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
260   if (Dali::Accessibility::IsUp() && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
261   {
262     Dali::Accessibility::Accessible::Get(Self())->EmitStateChanged(
263       Dali::Accessibility::State::PRESSED, newState == SELECTED_STATE ? 1 : 0, 0
264     );
265   }
266 }
267
268 } // namespace Internal
269
270 } // namespace Toolkit
271
272 } // namespace Dali