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