f263489a7a683fd9e4939e2ab807a009c988fbe4
[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 }
104
105 PushButton::~PushButton()
106 {
107 }
108
109 void PushButton::OnInitialize()
110 {
111   Button::OnInitialize();
112
113   // Push button requires the Leave event.
114   Actor self = Self();
115   self.SetLeaveRequired( true );
116 }
117
118 void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment )
119 {
120   mIconAlignment = iconAlignment;
121   Button::Align labelAlignment;
122   switch ( iconAlignment )
123   {
124   case RIGHT:
125   {
126     labelAlignment = Button::BEGIN;
127     break;
128   }
129   case TOP:
130   {
131     labelAlignment = Button::BOTTOM;
132     break;
133   }
134   case BOTTOM:
135   {
136     labelAlignment = Button::TOP;
137     break;
138   }
139   case LEFT:
140   default:
141     labelAlignment = Button::END;
142     break;
143   }
144
145   Button::SetLabelAlignment( labelAlignment );
146 }
147
148 const PushButton::IconAlignment PushButton::GetIconAlignment() const
149 {
150   return mIconAlignment;
151 }
152
153 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
154 {
155   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
156
157   if ( pushButton )
158   {
159     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
160
161     // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class
162
163     switch ( propertyIndex )
164     {
165       case Toolkit::PushButton::Property::UNSELECTED_ICON:
166       {
167         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT );
168         break;
169       }
170       case Toolkit::PushButton::Property::SELECTED_ICON:
171       {
172         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT );
173         break;
174       }
175       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
176       {
177         IconAlignment iconAlignment;
178         if( Scripting::GetEnumeration< IconAlignment >( value.Get< std::string >().c_str(), IconAlignmentTable, IconAlignmentTableCount, iconAlignment ) )
179         {
180           pushButtonImpl.SetIconAlignment( iconAlignment );
181         }
182         break;
183       }
184       case Toolkit::PushButton::Property::LABEL_PADDING:
185       {
186         Vector4 padding ( value.Get< Vector4 >() );
187         pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
188         break;
189       }
190       case Toolkit::PushButton::Property::ICON_PADDING:
191       {
192         Vector4 padding ( value.Get< Vector4 >() );
193         pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
194         break;
195       }
196     }
197   }
198 }
199
200 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
201 {
202   Property::Value value;
203
204   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
205
206   if ( pushButton )
207   {
208     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
209
210     switch ( propertyIndex )
211     {
212       case Toolkit::PushButton::Property::UNSELECTED_ICON:
213       {
214         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
215         break;
216       }
217       case Toolkit::PushButton::Property::SELECTED_ICON:
218       {
219         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
220         break;
221       }
222       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
223       {
224         value = Scripting::GetLinearEnumerationName< IconAlignment >( pushButtonImpl.GetIconAlignment(), IconAlignmentTable, IconAlignmentTableCount );
225         break;
226       }
227       case Toolkit::PushButton::Property::LABEL_PADDING:
228       {
229         Padding padding = pushButtonImpl.Button::GetLabelPadding();
230         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
231         break;
232       }
233       case Toolkit::PushButton::Property::ICON_PADDING:
234       {
235         Padding padding = pushButtonImpl.Button::GetForegroundPadding();
236         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
237         break;
238       }
239     }
240   }
241
242   return value;
243 }
244
245 } // namespace Internal
246
247 } // namespace Toolkit
248
249 } // namespace Dali