e77bd301e69afb638dd5afd3965b73015b1f8f9f
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-impl.cpp
1 /*
2  * Copyright (c) 2020 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/devel-api/scripting/scripting.h>
25 #include <dali/integration-api/debug.h>
26
27 // INTERNAL INCLUDES
28 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
29 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
30 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32
33 #if defined(DEBUG_ENABLED)
34   extern Debug::Filter* gLogButtonFilter;
35 #endif
36
37 namespace Dali
38 {
39
40 namespace Toolkit
41 {
42
43 namespace Internal
44 {
45
46 namespace
47 {
48
49 BaseHandle Create()
50 {
51   return Toolkit::PushButton::New();
52 }
53
54 // Properties
55
56 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PushButton, Toolkit::Button, Create )
57
58 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "labelPadding",  STRING, LABEL_PADDING )
59 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconPadding",  STRING, ICON_PADDING )
60
61 DALI_TYPE_REGISTRATION_END()
62
63 } // unnamed namespace
64
65 namespace
66 {
67
68 } // unnamed namespace
69
70 Dali::Toolkit::PushButton PushButton::New()
71 {
72   // Create the implementation, temporarily owned on stack
73   IntrusivePtr< PushButton > internalPushButton = new PushButton();
74
75   // Pass ownership to CustomActor
76   Dali::Toolkit::PushButton pushButton( *internalPushButton );
77
78   // Second-phase init of the implementation
79   // This can only be done after the CustomActor connection has been made...
80   internalPushButton->Initialize();
81
82   return pushButton;
83 }
84
85 PushButton::PushButton()
86 : Button(),
87   mIconAlignment( RIGHT )
88 {
89 }
90
91 PushButton::~PushButton()
92 {
93 }
94
95 void PushButton::OnInitialize()
96 {
97   Button::OnInitialize();
98
99   // Push button requires the Leave event.
100   Actor self = Self();
101   self.SetProperty( Actor::Property::LEAVE_REQUIRED, true );
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 void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment )
110 {
111   mIconAlignment = iconAlignment;
112   Button::Align labelAlignment;
113   switch ( iconAlignment )
114   {
115   case RIGHT:
116   {
117     labelAlignment = Button::BEGIN;
118     break;
119   }
120   case TOP:
121   {
122     labelAlignment = Button::BOTTOM;
123     break;
124   }
125   case BOTTOM:
126   {
127     labelAlignment = Button::TOP;
128     break;
129   }
130   case LEFT:
131   default:
132     labelAlignment = Button::END;
133     break;
134   }
135
136   Button::SetLabelAlignment( labelAlignment );
137 }
138
139 const PushButton::IconAlignment PushButton::GetIconAlignment() const
140 {
141   return mIconAlignment;
142 }
143
144 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
145 {
146   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
147
148   if ( pushButton )
149   {
150     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
151
152     // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class
153
154     switch ( propertyIndex )
155     {
156       case Toolkit::PushButton::Property::LABEL_PADDING:
157       {
158         Vector4 padding ( value.Get< Vector4 >() );
159         pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
160         break;
161       }
162       case Toolkit::PushButton::Property::ICON_PADDING:
163       {
164         Vector4 padding ( value.Get< Vector4 >() );
165         pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
166         break;
167       }
168     }
169   }
170 }
171
172 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
173 {
174   Property::Value value;
175
176   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
177
178   if ( pushButton )
179   {
180     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
181
182     switch ( propertyIndex )
183     {
184       case Toolkit::PushButton::Property::LABEL_PADDING:
185       {
186         Padding padding = pushButtonImpl.Button::GetLabelPadding();
187         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
188         break;
189       }
190       case Toolkit::PushButton::Property::ICON_PADDING:
191       {
192         Padding padding = pushButtonImpl.Button::GetForegroundPadding();
193         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
194         break;
195       }
196     }
197   }
198
199   return value;
200 }
201
202 Dali::Accessibility::States PushButton::AccessibleImpl::CalculateStates()
203 {
204   auto tmp = Button::AccessibleImpl::CalculateStates();
205   auto slf = Toolkit::Button::DownCast( self );
206   tmp[Dali::Accessibility::State::PRESSED] = slf.GetProperty<bool>( Toolkit::Button::Property::SELECTED );
207   return tmp;
208 }
209
210 void PushButton::OnStateChange( State newState )
211 {
212   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
213   if (Dali::Accessibility::IsUp() && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
214   {
215     Dali::Accessibility::Accessible::Get(Self())->EmitStateChanged(
216       Dali::Accessibility::State::PRESSED, newState == SELECTED_STATE ? 1 : 0, 0
217     );
218   }
219 }
220
221 } // namespace Internal
222
223 } // namespace Toolkit
224
225 } // namespace Dali