Merge "Blend Equation Advanced Supporting" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / control-devel.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 "control-devel.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/actors/actor.h>
23 #include <dali/public-api/animation/animation.h>
24
25 // INTERNAL INCLUDES
26 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
27 #include <dali-toolkit/internal/controls/control/control-data-impl.h>
28 #include <dali-toolkit/public-api/controls/control.h>
29 #include <dali-toolkit/public-api/controls/control-impl.h>
30
31 namespace Dali
32 {
33 namespace Toolkit
34 {
35 namespace DevelControl
36 {
37 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual)
38 {
39   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
40   controlDataImpl.RegisterVisual(index, visual);
41 }
42
43 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, int depthIndex)
44 {
45   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
46   controlDataImpl.RegisterVisual(index, visual, depthIndex);
47 }
48
49 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled)
50 {
51   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
52   controlDataImpl.RegisterVisual(index, visual, enabled);
53 }
54
55 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex)
56 {
57   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
58   controlDataImpl.RegisterVisual(index, visual, enabled, depthIndex);
59 }
60
61 void UnregisterVisual(Internal::Control& control, Dali::Property::Index index)
62 {
63   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
64   controlDataImpl.UnregisterVisual(index);
65 }
66
67 Toolkit::Visual::Base GetVisual(const Internal::Control& control, Dali::Property::Index index)
68 {
69   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
70   return controlDataImpl.GetVisual(index);
71 }
72
73 void EnableVisual(Internal::Control& control, Dali::Property::Index index, bool enable)
74 {
75   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
76   controlDataImpl.EnableVisual(index, enable);
77 }
78
79 bool IsVisualEnabled(const Internal::Control& control, Dali::Property::Index index)
80 {
81   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
82   return controlDataImpl.IsVisualEnabled(index);
83 }
84
85 Dali::Animation CreateTransition(Internal::Control& control, const Toolkit::TransitionData& handle)
86 {
87   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
88   return controlDataImpl.CreateTransition(handle);
89 }
90
91 void AddTransitions(Internal::Control&             control,
92                     Dali::Animation                animation,
93                     const Toolkit::TransitionData& transitionData)
94 {
95   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
96   controlDataImpl.AddTransitions(animation, transitionData);
97 }
98
99 void DoAction(Control& control, Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes)
100 {
101   Internal::Control&       controlInternal = Toolkit::Internal::GetImplementation(control);
102   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlInternal);
103   controlDataImpl.DoAction(visualIndex, actionId, attributes);
104 }
105
106 void SetInputMethodContext(Internal::Control& control, InputMethodContext& inputMethodContext)
107 {
108   Internal::Control::Impl::Get(control).SetInputMethodContext(inputMethodContext);
109 }
110
111 VisualEventSignalType& VisualEventSignal(Control control)
112 {
113   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
114   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
115   return controlDataImpl.VisualEventSignal();
116 }
117
118 static Toolkit::Internal::Control::Impl *GetControlImplementationIfAny( Dali::Actor actor)
119 {
120   Dali::Toolkit::Control c = Toolkit::Control::DownCast( actor );
121   if ( c )
122   {
123     auto &impl1 = Toolkit::Internal::GetImplementation( c );
124     auto &impl2 = Toolkit::Internal::Control::Impl::Get( impl1 );
125     return &impl2;
126   }
127   return nullptr;
128 }
129
130 Toolkit::DevelControl::AccessibilityActivateSignalType &AccessibilityActivateSignal( Toolkit::Control control )
131 {
132   auto ac = GetControlImplementationIfAny ( control );
133   return ac->mAccessibilityActivateSignal;
134 }
135
136 Toolkit::DevelControl::AccessibilityReadingSkippedSignalType &AccessibilityReadingSkippedSignal( Toolkit::Control control )
137 {
138   auto ac = GetControlImplementationIfAny ( control );
139   return ac->mAccessibilityReadingSkippedSignal;
140 }
141
142 Toolkit::DevelControl::AccessibilityReadingPausedSignalType &AccessibilityReadingPausedSignal( Toolkit::Control control )
143 {
144   auto ac = GetControlImplementationIfAny ( control );
145   return ac->mAccessibilityReadingPausedSignal;
146 }
147
148 Toolkit::DevelControl::AccessibilityReadingResumedSignalType &AccessibilityReadingResumedSignal( Toolkit::Control control )
149 {
150   auto ac = GetControlImplementationIfAny ( control );
151   return ac->mAccessibilityReadingResumedSignal;
152 }
153
154 Toolkit::DevelControl::AccessibilityReadingCancelledSignalType &AccessibilityReadingCancelledSignal( Toolkit::Control control )
155 {
156   auto ac = GetControlImplementationIfAny ( control );
157   return ac->mAccessibilityReadingCancelledSignal;
158 }
159
160 Toolkit::DevelControl::AccessibilityReadingStoppedSignalType &AccessibilityReadingStoppedSignal( Toolkit::Control control )
161 {
162   auto ac = GetControlImplementationIfAny ( control );
163   return ac->mAccessibilityReadingStoppedSignal;
164 }
165
166 Toolkit::DevelControl::AccessibilityGetNameSignalType &AccessibilityGetNameSignal( Toolkit::Control control )
167 {
168   auto ac = GetControlImplementationIfAny ( control );
169   return ac->mAccessibilityGetNameSignal;
170 }
171
172 Toolkit::DevelControl::AccessibilityGetDescriptionSignalType &AccessibilityGetDescriptionSignal( Toolkit::Control control )
173 {
174   auto ac = GetControlImplementationIfAny ( control );
175   return ac->mAccessibilityGetDescriptionSignal;
176 }
177
178 Toolkit::DevelControl::AccessibilityDoGestureSignalType &AccessibilityDoGestureSignal( Toolkit::Control control )
179 {
180   auto ac = GetControlImplementationIfAny ( control );
181   return ac->mAccessibilityDoGestureSignal;
182 }
183
184 void AppendAccessibilityRelation( Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
185 {
186   if ( auto ac = GetControlImplementationIfAny ( control ) )
187   {
188     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
189     if (index >= ac->mAccessibilityRelations.size())
190     {
191         DALI_LOG_ERROR( "Relation index exceeds vector size." );
192         return;
193     }
194
195     auto obj = ac->GetAccessibilityObject(destination);
196     if (obj)
197       ac->mAccessibilityRelations[index].push_back(obj->GetAddress());
198   }
199 }
200
201 void RemoveAccessibilityRelation( Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
202 {
203   if ( auto ac = GetControlImplementationIfAny ( control ) )
204   {
205     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
206     if (index >= ac->mAccessibilityRelations.size())
207     {
208         DALI_LOG_ERROR( "Relation index exceeds vector size." );
209         return;
210     }
211
212     auto obj = ac->GetAccessibilityObject(destination);
213     if (!obj)
214       return;
215
216     auto address = obj->GetAddress();
217
218     auto &targets = ac->mAccessibilityRelations[index];
219     for (auto i = 0u; i < targets.size(); ++i) {
220         if (targets[i].ToString() == address.ToString())
221         {
222             targets[i] = targets.back();
223             targets.erase(targets.end() - 1);
224         }
225     }
226   }
227 }
228
229 std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations( Dali::Actor control )
230 {
231   if ( auto ac = GetControlImplementationIfAny ( control ) )
232   {
233     return ac->mAccessibilityRelations;
234   }
235   return {};
236 }
237
238 void ClearAccessibilityRelations( Dali::Actor control )
239 {
240   if ( auto ac = GetControlImplementationIfAny ( control ) )
241   {
242     for (auto &it : ac->mAccessibilityRelations)
243       it.clear();
244   }
245 }
246
247 void SetAccessibilityConstructor( Dali::Actor control,
248         std::function< std::unique_ptr< Dali::Accessibility::Accessible >( Dali::Actor ) > constructor )
249 {
250   if ( auto ac = GetControlImplementationIfAny ( control ) )
251   {
252     ac->accessibilityConstructor = constructor;
253   }
254 }
255
256 void AppendAccessibilityAttribute( Dali::Actor control, const std::string& key,
257                                          const std::string value )
258 {
259   if ( auto ac = GetControlImplementationIfAny ( control ) )
260   {
261     ac->AppendAccessibilityAttribute( key, value );
262   }
263 }
264
265 void RemoveAccessibilityAttribute( Dali::Actor control, const std::string& key )
266 {
267   if ( auto ac = GetControlImplementationIfAny ( control ) )
268   {
269     ac->RemoveAccessibilityAttribute( key );
270   }
271 }
272
273 void ClearAccessibilityAttributes( Dali::Actor control )
274 {
275   if ( auto ac = GetControlImplementationIfAny ( control ) )
276   {
277     ac->ClearAccessibilityAttributes();
278   }
279 }
280
281 void SetAccessibilityReadingInfoType( Dali::Actor control, const Dali::Accessibility::ReadingInfoTypes types )
282 {
283   if ( auto ac = GetControlImplementationIfAny ( control ) )
284   {
285     ac->SetAccessibilityReadingInfoType( types );
286   }
287 }
288
289 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Dali::Actor control )
290 {
291   if ( auto ac = GetControlImplementationIfAny ( control ) )
292   {
293     return ac->GetAccessibilityReadingInfoType();
294   }
295   return {};
296 }
297
298 bool ClearAccessibilityHighlight( Dali::Actor control )
299 {
300   if ( auto ac = GetControlImplementationIfAny ( control ) )
301   {
302     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac->GetAccessibilityObject() );
303     if( ptr )
304       return ptr->ClearHighlight();
305   }
306   return false;
307 }
308
309 bool GrabAccessibilityHighlight( Dali::Actor control )
310 {
311   if ( auto ac = GetControlImplementationIfAny ( control ) )
312   {
313     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac->GetAccessibilityObject() );
314     if( ptr )
315       return ptr->GrabHighlight();
316   }
317   return false;
318 }
319
320 Dali::Accessibility::States GetAccessibilityStates( Dali::Actor control )
321 {
322   if ( auto ac = GetControlImplementationIfAny ( control ) )
323   {
324     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac->GetAccessibilityObject() );
325     if(ptr)
326       return ptr->GetStates();
327   }
328   return {};
329 }
330
331 void NotifyAccessibilityStateChange( Dali::Actor control, Dali::Accessibility::States states, bool doRecursive )
332 {
333   if ( auto ac = GetControlImplementationIfAny ( control ) )
334   {
335     ac->GetAccessibilityObject()->NotifyAccessibilityStateChange( std::move(states), doRecursive );
336   }
337 }
338
339 Dali::Accessibility::Accessible *GetBoundAccessibilityObject( Dali::Actor control )
340 {
341   return Dali::Accessibility::Accessible::Get( control );
342 }
343
344 } // namespace DevelControl
345
346 } // namespace Toolkit
347
348 } // namespace Dali