Merge "C# control dashboard demo" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-impl.cpp
1 /*
2  * Copyright (c) 2014 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 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
34
35 #if defined(DEBUG_ENABLED)
36   extern Debug::Filter* gLogButtonFilter;
37 #endif
38
39 namespace Dali
40 {
41
42 namespace Toolkit
43 {
44
45 namespace Internal
46 {
47
48 namespace
49 {
50
51 BaseHandle Create()
52 {
53   return Toolkit::PushButton::New();
54 }
55
56 // Properties
57
58 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PushButton, Toolkit::Button, Create )
59
60 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "unselectedIcon",  STRING, UNSELECTED_ICON )
61 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "selectedIcon",  STRING, SELECTED_ICON )
62 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconAlignment",  STRING, ICON_ALIGNMENT )
63 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "labelPadding",  STRING, LABEL_PADDING )
64 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconPadding",  STRING, ICON_PADDING )
65
66 DALI_TYPE_REGISTRATION_END()
67
68 /*
69  * Table to define Text-to-enum conversions for IconAlignment.
70  */
71 const Dali::Scripting::StringEnum IconAlignmentTable[] = {
72   { "LEFT",   Toolkit::Internal::PushButton::LEFT },
73   { "RIGHT",  Toolkit::Internal::PushButton::RIGHT },
74   { "TOP",    Toolkit::Internal::PushButton::TOP },
75   { "BOTTOM", Toolkit::Internal::PushButton::BOTTOM },
76 }; const unsigned int IconAlignmentTableCount = sizeof( IconAlignmentTable ) / sizeof( IconAlignmentTable[0] );
77
78 } // unnamed namespace
79
80 namespace
81 {
82
83 } // unnamed namespace
84
85 Dali::Toolkit::PushButton PushButton::New()
86 {
87   // Create the implementation, temporarily owned on stack
88   IntrusivePtr< PushButton > internalPushButton = new PushButton();
89
90   // Pass ownership to CustomActor
91   Dali::Toolkit::PushButton pushButton( *internalPushButton );
92
93   // Second-phase init of the implementation
94   // This can only be done after the CustomActor connection has been made...
95   internalPushButton->Initialize();
96
97   return pushButton;
98 }
99
100 PushButton::PushButton()
101 : Button(),
102   mIconAlignment( RIGHT )
103 {
104 }
105
106 PushButton::~PushButton()
107 {
108 }
109
110 void PushButton::OnInitialize()
111 {
112   Button::OnInitialize();
113
114   // Push button requires the Leave event.
115   Actor self = Self();
116   self.SetLeaveRequired( true );
117 }
118
119 void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment )
120 {
121   mIconAlignment = iconAlignment;
122   Button::Align labelAlignment;
123   switch ( iconAlignment )
124   {
125   case RIGHT:
126   {
127     labelAlignment = Button::BEGIN;
128     break;
129   }
130   case TOP:
131   {
132     labelAlignment = Button::BOTTOM;
133     break;
134   }
135   case BOTTOM:
136   {
137     labelAlignment = Button::TOP;
138     break;
139   }
140   case LEFT:
141   default:
142     labelAlignment = Button::END;
143     break;
144   }
145
146   Button::SetLabelAlignment( labelAlignment );
147 }
148
149 const PushButton::IconAlignment PushButton::GetIconAlignment() const
150 {
151   return mIconAlignment;
152 }
153
154 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
155 {
156   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
157
158   if ( pushButton )
159   {
160     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
161
162     // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class
163
164     switch ( propertyIndex )
165     {
166       case Toolkit::PushButton::Property::UNSELECTED_ICON:
167       {
168         pushButtonImpl.CreateVisualsForComponent( Toolkit::DevelButton::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT );
169         break;
170       }
171       case Toolkit::PushButton::Property::SELECTED_ICON:
172       {
173         pushButtonImpl.CreateVisualsForComponent( Toolkit::DevelButton::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT );
174         break;
175       }
176       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
177       {
178         IconAlignment iconAlignment;
179         if( Scripting::GetEnumeration< IconAlignment >( value.Get< std::string >().c_str(), IconAlignmentTable, IconAlignmentTableCount, iconAlignment ) )
180         {
181           pushButtonImpl.SetIconAlignment( iconAlignment );
182         }
183         break;
184       }
185       case Toolkit::PushButton::Property::LABEL_PADDING:
186       {
187         Vector4 padding ( value.Get< Vector4 >() );
188         pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
189         break;
190       }
191       case Toolkit::PushButton::Property::ICON_PADDING:
192       {
193         Vector4 padding ( value.Get< Vector4 >() );
194         pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
195         break;
196       }
197     }
198   }
199 }
200
201 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
202 {
203   Property::Value value;
204
205   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
206
207   if ( pushButton )
208   {
209     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
210
211     switch ( propertyIndex )
212     {
213       case Toolkit::PushButton::Property::UNSELECTED_ICON:
214       {
215         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
216         break;
217       }
218       case Toolkit::PushButton::Property::SELECTED_ICON:
219       {
220         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
221         break;
222       }
223       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
224       {
225         value = Scripting::GetLinearEnumerationName< IconAlignment >( pushButtonImpl.GetIconAlignment(), IconAlignmentTable, IconAlignmentTableCount );
226         break;
227       }
228       case Toolkit::PushButton::Property::LABEL_PADDING:
229       {
230         Padding padding = pushButtonImpl.Button::GetLabelPadding();
231         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
232         break;
233       }
234       case Toolkit::PushButton::Property::ICON_PADDING:
235       {
236         Padding padding = pushButtonImpl.Button::GetForegroundPadding();
237         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
238         break;
239       }
240     }
241   }
242
243   return value;
244 }
245
246 } // namespace Internal
247
248 } // namespace Toolkit
249
250 } // namespace Dali