Add ApplyCustomFragmentPrefix
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / control-devel.cpp
1 /*
2  * Copyright (c) 2021 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-impl.h>
29 #include <dali-toolkit/public-api/controls/control.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 Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, Dali::Property::Key visualPropertyKey)
119 {
120   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
121   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
122   return controlDataImpl.GetVisualProperty(index, visualPropertyKey);
123 }
124
125 void CreateTransitions(Control control, Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod)
126 {
127   if(animation)
128   {
129     // make visual transition of control visual.
130     Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
131     Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
132     controlDataImpl.MakeVisualTransition(animation, source, Toolkit::Control::Property::BACKGROUND, alphaFunction, timePeriod);
133     controlDataImpl.MakeVisualTransition(animation, source, Toolkit::DevelControl::Property::SHADOW, alphaFunction, timePeriod);
134     internalControl.OnCreateTransitions(animation, source, alphaFunction, timePeriod);
135   }
136 }
137
138 static Toolkit::Internal::Control::Impl* GetControlImplementationIfAny(Dali::Actor actor)
139 {
140   Dali::Toolkit::Control c = Toolkit::Control::DownCast(actor);
141   if(c)
142   {
143     auto& impl1 = Toolkit::Internal::GetImplementation(c);
144     auto& impl2 = Toolkit::Internal::Control::Impl::Get(impl1);
145     return &impl2;
146   }
147   return nullptr;
148 }
149
150 Toolkit::DevelControl::AccessibilityActivateSignalType& AccessibilityActivateSignal(Toolkit::Control control)
151 {
152   auto ac = GetControlImplementationIfAny(control);
153   return ac->mAccessibilityActivateSignal;
154 }
155
156 Toolkit::DevelControl::AccessibilityReadingSkippedSignalType& AccessibilityReadingSkippedSignal(Toolkit::Control control)
157 {
158   auto ac = GetControlImplementationIfAny(control);
159   return ac->mAccessibilityReadingSkippedSignal;
160 }
161
162 Toolkit::DevelControl::AccessibilityReadingPausedSignalType& AccessibilityReadingPausedSignal(Toolkit::Control control)
163 {
164   auto ac = GetControlImplementationIfAny(control);
165   return ac->mAccessibilityReadingPausedSignal;
166 }
167
168 Toolkit::DevelControl::AccessibilityReadingResumedSignalType& AccessibilityReadingResumedSignal(Toolkit::Control control)
169 {
170   auto ac = GetControlImplementationIfAny(control);
171   return ac->mAccessibilityReadingResumedSignal;
172 }
173
174 Toolkit::DevelControl::AccessibilityReadingCancelledSignalType& AccessibilityReadingCancelledSignal(Toolkit::Control control)
175 {
176   auto ac = GetControlImplementationIfAny(control);
177   return ac->mAccessibilityReadingCancelledSignal;
178 }
179
180 Toolkit::DevelControl::AccessibilityReadingStoppedSignalType& AccessibilityReadingStoppedSignal(Toolkit::Control control)
181 {
182   auto ac = GetControlImplementationIfAny(control);
183   return ac->mAccessibilityReadingStoppedSignal;
184 }
185
186 Toolkit::DevelControl::AccessibilityGetNameSignalType& AccessibilityGetNameSignal(Toolkit::Control control)
187 {
188   auto ac = GetControlImplementationIfAny(control);
189   return ac->mAccessibilityGetNameSignal;
190 }
191
192 Toolkit::DevelControl::AccessibilityGetDescriptionSignalType& AccessibilityGetDescriptionSignal(Toolkit::Control control)
193 {
194   auto ac = GetControlImplementationIfAny(control);
195   return ac->mAccessibilityGetDescriptionSignal;
196 }
197
198 Toolkit::DevelControl::AccessibilityDoGestureSignalType& AccessibilityDoGestureSignal(Toolkit::Control control)
199 {
200   auto ac = GetControlImplementationIfAny(control);
201   return ac->mAccessibilityDoGestureSignal;
202 }
203
204 void AppendAccessibilityRelation(Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
205 {
206   if(auto ac = GetControlImplementationIfAny(control))
207   {
208     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
209     if(index >= ac->mAccessibilityRelations.size())
210     {
211       DALI_LOG_ERROR("Relation index exceeds vector size.");
212       return;
213     }
214
215     auto obj = ac->GetAccessibilityObject(destination);
216     if(obj)
217       ac->mAccessibilityRelations[index].push_back(obj->GetAddress());
218   }
219 }
220
221 void RemoveAccessibilityRelation(Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
222 {
223   if(auto ac = GetControlImplementationIfAny(control))
224   {
225     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
226     if(index >= ac->mAccessibilityRelations.size())
227     {
228       DALI_LOG_ERROR("Relation index exceeds vector size.");
229       return;
230     }
231
232     auto obj = ac->GetAccessibilityObject(destination);
233     if(!obj)
234       return;
235
236     auto address = obj->GetAddress();
237
238     auto& targets = ac->mAccessibilityRelations[index];
239     for(auto i = 0u; i < targets.size(); ++i)
240     {
241       if(targets[i].ToString() == address.ToString())
242       {
243         targets[i] = targets.back();
244         targets.erase(targets.end() - 1);
245       }
246     }
247   }
248 }
249
250 std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations(Dali::Actor control)
251 {
252   if(auto ac = GetControlImplementationIfAny(control))
253   {
254     return ac->mAccessibilityRelations;
255   }
256   return {};
257 }
258
259 void ClearAccessibilityRelations(Dali::Actor control)
260 {
261   if(auto ac = GetControlImplementationIfAny(control))
262   {
263     for(auto& it : ac->mAccessibilityRelations)
264       it.clear();
265   }
266 }
267
268 void SetAccessibilityConstructor(Dali::Actor                                                                  control,
269                                  std::function<std::unique_ptr<Dali::Accessibility::Accessible>(Dali::Actor)> constructor)
270 {
271   if(auto ac = GetControlImplementationIfAny(control))
272   {
273     ac->accessibilityConstructor = constructor;
274   }
275 }
276
277 void AppendAccessibilityAttribute(Dali::Actor control, const std::string& key, const std::string value)
278 {
279   if(auto ac = GetControlImplementationIfAny(control))
280   {
281     ac->AppendAccessibilityAttribute(key, value);
282   }
283 }
284
285 void RemoveAccessibilityAttribute(Dali::Actor control, const std::string& key)
286 {
287   if(auto ac = GetControlImplementationIfAny(control))
288   {
289     ac->RemoveAccessibilityAttribute(key);
290   }
291 }
292
293 void ClearAccessibilityAttributes(Dali::Actor control)
294 {
295   if(auto ac = GetControlImplementationIfAny(control))
296   {
297     ac->ClearAccessibilityAttributes();
298   }
299 }
300
301 void SetAccessibilityReadingInfoType(Dali::Actor control, const Dali::Accessibility::ReadingInfoTypes types)
302 {
303   if(auto ac = GetControlImplementationIfAny(control))
304   {
305     ac->SetAccessibilityReadingInfoType(types);
306   }
307 }
308
309 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Dali::Actor control)
310 {
311   if(auto ac = GetControlImplementationIfAny(control))
312   {
313     return ac->GetAccessibilityReadingInfoType();
314   }
315   return {};
316 }
317
318 bool ClearAccessibilityHighlight(Dali::Actor control)
319 {
320   if(auto ac = GetControlImplementationIfAny(control))
321   {
322     auto ptr = dynamic_cast<Dali::Accessibility::Component*>(ac->GetAccessibilityObject());
323     if(ptr)
324       return ptr->ClearHighlight();
325   }
326   return false;
327 }
328
329 bool GrabAccessibilityHighlight(Dali::Actor control)
330 {
331   if(auto ac = GetControlImplementationIfAny(control))
332   {
333     auto ptr = dynamic_cast<Dali::Accessibility::Component*>(ac->GetAccessibilityObject());
334     if(ptr)
335       return ptr->GrabHighlight();
336   }
337   return false;
338 }
339
340 Dali::Accessibility::States GetAccessibilityStates(Dali::Actor control)
341 {
342   if(auto ac = GetControlImplementationIfAny(control))
343   {
344     auto ptr = dynamic_cast<Dali::Accessibility::Component*>(ac->GetAccessibilityObject());
345     if(ptr)
346       return ptr->GetStates();
347   }
348   return {};
349 }
350
351 void NotifyAccessibilityStateChange(Dali::Actor control, Dali::Accessibility::States states, bool doRecursive)
352 {
353   if(auto ac = GetControlImplementationIfAny(control))
354   {
355     ac->GetAccessibilityObject()->NotifyAccessibilityStateChange(std::move(states), doRecursive);
356   }
357 }
358
359 Dali::Accessibility::Accessible* GetBoundAccessibilityObject(Dali::Actor control)
360 {
361   return Dali::Accessibility::Accessible::Get(control);
362 }
363
364 } // namespace DevelControl
365
366 } // namespace Toolkit
367
368 } // namespace Dali