Buttons to use Visuals
[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
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 const float   ANIMATION_TIME( 0.2f );
51
52 BaseHandle Create()
53 {
54   return Toolkit::PushButton::New();
55 }
56
57 // Properties
58
59 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::PushButton, Toolkit::Button, Create )
60
61 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "unselectedIcon",  STRING, UNSELECTED_ICON )
62 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "selectedIcon",  STRING, SELECTED_ICON )
63 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconAlignment",  STRING, ICON_ALIGNMENT )
64 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "labelPadding",  STRING, LABEL_PADDING )
65 DALI_PROPERTY_REGISTRATION( Toolkit, PushButton, "iconPadding",  STRING, ICON_PADDING )
66
67 DALI_TYPE_REGISTRATION_END()
68
69 /*
70  * Table to define Text-to-enum conversions for IconAlignment.
71  */
72 const Dali::Scripting::StringEnum IconAlignmentTable[] = {
73   { "LEFT",   Toolkit::Internal::PushButton::LEFT },
74   { "RIGHT",  Toolkit::Internal::PushButton::RIGHT },
75   { "TOP",    Toolkit::Internal::PushButton::TOP },
76   { "BOTTOM", Toolkit::Internal::PushButton::BOTTOM },
77 }; const unsigned int IconAlignmentTableCount = sizeof( IconAlignmentTable ) / sizeof( IconAlignmentTable[0] );
78
79 } // unnamed namespace
80
81 namespace
82 {
83
84 } // unnamed namespace
85
86 Dali::Toolkit::PushButton PushButton::New()
87 {
88   // Create the implementation, temporarily owned on stack
89   IntrusivePtr< PushButton > internalPushButton = new PushButton();
90
91   // Pass ownership to CustomActor
92   Dali::Toolkit::PushButton pushButton( *internalPushButton );
93
94   // Second-phase init of the implementation
95   // This can only be done after the CustomActor connection has been made...
96   internalPushButton->Initialize();
97
98   return pushButton;
99 }
100
101 PushButton::PushButton()
102 : Button(),
103   mIconAlignment( RIGHT )
104 {
105   SetAnimationTime( ANIMATION_TIME );
106 }
107
108 PushButton::~PushButton()
109 {
110 }
111
112 void PushButton::OnInitialize()
113 {
114   Button::OnInitialize();
115
116   // Push button requires the Leave event.
117   Actor self = Self();
118   self.SetLeaveRequired( true );
119 }
120
121 void PushButton::SetIconAlignment( const PushButton::IconAlignment iconAlignment )
122 {
123   mIconAlignment = iconAlignment;
124   Button::Align labelAlignment;
125   switch ( iconAlignment )
126   {
127   case RIGHT:
128   {
129     labelAlignment = Button::BEGIN;
130     break;
131   }
132   case TOP:
133   {
134     labelAlignment = Button::BOTTOM;
135     break;
136   }
137   case BOTTOM:
138   {
139     labelAlignment = Button::TOP;
140     break;
141   }
142   case LEFT:
143   default:
144     labelAlignment = Button::END;
145     break;
146   }
147
148   Button::SetLabelAlignment( labelAlignment );
149 }
150
151 const PushButton::IconAlignment PushButton::GetIconAlignment() const
152 {
153   return mIconAlignment;
154 }
155
156 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
157 {
158   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
159
160   if ( pushButton )
161   {
162     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
163
164     // Properties remain here for Tizen 3.0 legacy requirements. Are now in Button base class
165
166     switch ( propertyIndex )
167     {
168       case Toolkit::PushButton::Property::UNSELECTED_ICON:
169       {
170         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT );
171         break;
172       }
173       case Toolkit::PushButton::Property::SELECTED_ICON:
174       {
175         pushButtonImpl.CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT );
176         break;
177       }
178       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
179       {
180         IconAlignment iconAlignment;
181         if( Scripting::GetEnumeration< IconAlignment >( value.Get< std::string >().c_str(), IconAlignmentTable, IconAlignmentTableCount, iconAlignment ) )
182         {
183           pushButtonImpl.SetIconAlignment( iconAlignment );
184         }
185         break;
186       }
187       case Toolkit::PushButton::Property::LABEL_PADDING:
188       {
189         Vector4 padding ( value.Get< Vector4 >() );
190         pushButtonImpl.Button::SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
191         break;
192       }
193       case Toolkit::PushButton::Property::ICON_PADDING:
194       {
195         Vector4 padding ( value.Get< Vector4 >() );
196         pushButtonImpl.Button::SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
197         break;
198       }
199     }
200   }
201 }
202
203 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
204 {
205   Property::Value value;
206
207   Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
208
209   if ( pushButton )
210   {
211     PushButton& pushButtonImpl( GetImplementation( pushButton ) );
212
213     switch ( propertyIndex )
214     {
215       case Toolkit::PushButton::Property::UNSELECTED_ICON:
216       {
217         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
218         break;
219       }
220       case Toolkit::PushButton::Property::SELECTED_ICON:
221       {
222         //value = pushButtonImpl.GetIcon( UNSELECTED_DECORATION );
223         break;
224       }
225       case Toolkit::PushButton::Property::ICON_ALIGNMENT:
226       {
227         value = Scripting::GetLinearEnumerationName< IconAlignment >( pushButtonImpl.GetIconAlignment(), IconAlignmentTable, IconAlignmentTableCount );
228         break;
229       }
230       case Toolkit::PushButton::Property::LABEL_PADDING:
231       {
232         Padding padding = pushButtonImpl.Button::GetLabelPadding();
233         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
234         break;
235       }
236       case Toolkit::PushButton::Property::ICON_PADDING:
237       {
238         Padding padding = pushButtonImpl.Button::GetForegroundPadding();
239         value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
240         break;
241       }
242     }
243   }
244
245   return value;
246 }
247
248 void PushButton::PrepareForTranstionIn( Actor actor )
249 {
250   // Set Toolkit::Button::Property::SELECTED_VISUAL and Toolkit::Button::Property::UNSELECTED_VISUAL to opacity 0
251   // Then get and start animation
252 }
253
254 void PushButton::PrepareForTranstionOut( Actor actor )
255 {
256   // Set Toolkit::Button::Property::SELECTED_VISUAL and Toolkit::Button::Property::UNSELECTED_VISUAL to opacity 1
257   // Then get and start animation
258 }
259
260 void PushButton::OnTransitionIn( Actor actor )
261 {
262   // Only transition selected and unselected visual, background doesn't change.
263   // Start Fade animation to 1
264 }
265
266 void PushButton::OnTransitionOut( Actor actor )
267 {
268   // Only transition selected and unselected visual, background doesn't change.
269   // Start Fade animation to 0
270 }
271
272 void PushButton::FadeImageTo( Actor actor , float opacity )
273 {
274   if( actor )
275   {
276     Dali::Animation transitionAnimation = GetTransitionAnimation();
277     DALI_ASSERT_DEBUG( transitionAnimation );
278
279     if( transitionAnimation )
280     {
281       DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "PushButton::FadeImageTo(%f)\n", opacity );
282
283       transitionAnimation.AnimateTo( Property( actor, Actor::Property::COLOR_ALPHA ), opacity );
284     }
285   }
286 }
287
288 } // namespace Internal
289
290 } // namespace Toolkit
291
292 } // namespace Dali