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