[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / control-devel.cpp
1 /*
2  * Copyright (c) 2023 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
32 {
33 Dali::Toolkit::Internal::Control::Impl& GetControlImplementation(Dali::Toolkit::Control control)
34 {
35   auto& internalControl = Dali::Toolkit::Internal::GetImplementation(control);
36
37   return Dali::Toolkit::Internal::Control::Impl::Get(internalControl);
38 }
39
40 } // unnamed namespace
41
42 namespace Dali
43 {
44 namespace Toolkit
45 {
46 namespace DevelControl
47 {
48 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual)
49 {
50   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
51   controlDataImpl.RegisterVisual(index, visual);
52 }
53
54 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, int depthIndex)
55 {
56   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
57   controlDataImpl.RegisterVisual(index, visual, depthIndex);
58 }
59
60 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled)
61 {
62   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
63   controlDataImpl.RegisterVisual(index, visual, enabled);
64 }
65
66 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex)
67 {
68   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
69   controlDataImpl.RegisterVisual(index, visual, enabled, depthIndex);
70 }
71
72 void UnregisterVisual(Internal::Control& control, Dali::Property::Index index)
73 {
74   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
75   controlDataImpl.UnregisterVisual(index);
76 }
77
78 Toolkit::Visual::Base GetVisual(const Internal::Control& control, Dali::Property::Index index)
79 {
80   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
81   return controlDataImpl.GetVisual(index);
82 }
83
84 void EnableVisual(Internal::Control& control, Dali::Property::Index index, bool enable)
85 {
86   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
87   controlDataImpl.EnableVisual(index, enable);
88 }
89
90 bool IsVisualEnabled(const Internal::Control& control, Dali::Property::Index index)
91 {
92   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
93   return controlDataImpl.IsVisualEnabled(index);
94 }
95
96 Dali::Animation CreateTransition(Internal::Control& control, const Toolkit::TransitionData& handle)
97 {
98   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
99   return controlDataImpl.CreateTransition(handle);
100 }
101
102 void AddTransitions(Internal::Control&             control,
103                     Dali::Animation                animation,
104                     const Toolkit::TransitionData& transitionData)
105 {
106   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
107   controlDataImpl.AddTransitions(animation, transitionData);
108 }
109
110 void DoAction(Control& control, Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes)
111 {
112   Internal::Control&       controlInternal = Toolkit::Internal::GetImplementation(control);
113   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlInternal);
114   controlDataImpl.DoAction(visualIndex, actionId, attributes);
115 }
116
117 void DoActionExtension(Control& control, Dali::Property::Index visualIndex, Dali::Property::Index actionId, Dali::Any attributes)
118 {
119   Internal::Control&       controlInternal = Toolkit::Internal::GetImplementation(control);
120   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlInternal);
121   controlDataImpl.DoActionExtension(visualIndex, actionId, attributes);
122 }
123
124 void SetInputMethodContext(Internal::Control& control, InputMethodContext& inputMethodContext)
125 {
126   Internal::Control::Impl::Get(control).SetInputMethodContext(inputMethodContext);
127 }
128
129 VisualEventSignalType& VisualEventSignal(Control control)
130 {
131   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
132   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
133   return controlDataImpl.VisualEventSignal();
134 }
135
136 Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, Dali::Property::Key visualPropertyKey)
137 {
138   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
139   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
140   return controlDataImpl.GetVisualProperty(index, visualPropertyKey);
141 }
142
143 Toolkit::DevelControl::AccessibilityActivateSignalType& AccessibilityActivateSignal(Toolkit::Control control)
144 {
145   return GetControlImplementation(control).mAccessibilityActivateSignal;
146 }
147
148 Toolkit::DevelControl::AccessibilityReadingSkippedSignalType& AccessibilityReadingSkippedSignal(Toolkit::Control control)
149 {
150   return GetControlImplementation(control).mAccessibilityReadingSkippedSignal;
151 }
152
153 Toolkit::DevelControl::AccessibilityReadingPausedSignalType& AccessibilityReadingPausedSignal(Toolkit::Control control)
154 {
155   return GetControlImplementation(control).mAccessibilityReadingPausedSignal;
156 }
157
158 Toolkit::DevelControl::AccessibilityReadingResumedSignalType& AccessibilityReadingResumedSignal(Toolkit::Control control)
159 {
160   return GetControlImplementation(control).mAccessibilityReadingResumedSignal;
161 }
162
163 Toolkit::DevelControl::AccessibilityReadingCancelledSignalType& AccessibilityReadingCancelledSignal(Toolkit::Control control)
164 {
165   return GetControlImplementation(control).mAccessibilityReadingCancelledSignal;
166 }
167
168 Toolkit::DevelControl::AccessibilityReadingStoppedSignalType& AccessibilityReadingStoppedSignal(Toolkit::Control control)
169 {
170   return GetControlImplementation(control).mAccessibilityReadingStoppedSignal;
171 }
172
173 Toolkit::DevelControl::AccessibilityGetNameSignalType& AccessibilityGetNameSignal(Toolkit::Control control)
174 {
175   return GetControlImplementation(control).mAccessibilityGetNameSignal;
176 }
177
178 Toolkit::DevelControl::AccessibilityGetDescriptionSignalType& AccessibilityGetDescriptionSignal(Toolkit::Control control)
179 {
180   return GetControlImplementation(control).mAccessibilityGetDescriptionSignal;
181 }
182
183 Toolkit::DevelControl::AccessibilityDoGestureSignalType& AccessibilityDoGestureSignal(Toolkit::Control control)
184 {
185   return GetControlImplementation(control).mAccessibilityDoGestureSignal;
186 }
187
188 void AppendAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
189 {
190   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
191   {
192     GetControlImplementation(control).mAccessibilityRelations[relation].insert(destinationAccessible);
193   }
194 }
195
196 void RemoveAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
197 {
198   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
199   {
200     auto& relations = GetControlImplementation(control).mAccessibilityRelations;
201
202     relations[relation].erase(destinationAccessible);
203
204     if(relations[relation].empty())
205     {
206       relations.erase(relation);
207     }
208   }
209 }
210
211 std::vector<Accessibility::Relation> GetAccessibilityRelations(Toolkit::Control control)
212 {
213   const auto&                          relations = GetControlImplementation(control).mAccessibilityRelations;
214   std::vector<Accessibility::Relation> result;
215
216   for(auto& relation : relations)
217   {
218     auto& targets = relation.second;
219
220     result.emplace_back(Accessibility::Relation{relation.first, {}});
221     std::copy(targets.begin(), targets.end(), std::back_inserter(result.back().mTargets));
222   }
223
224   return result;
225 }
226
227 void ClearAccessibilityRelations(Toolkit::Control control)
228 {
229   GetControlImplementation(control).mAccessibilityRelations.clear();
230 }
231
232 void AppendAccessibilityAttribute(Toolkit::Control control, const std::string& key, const std::string& value)
233 {
234   GetControlImplementation(control).AppendAccessibilityAttribute(key, value);
235 }
236
237 void RemoveAccessibilityAttribute(Toolkit::Control control, const std::string& key)
238 {
239   GetControlImplementation(control).RemoveAccessibilityAttribute(key);
240 }
241
242 void ClearAccessibilityAttributes(Toolkit::Control control)
243 {
244   GetControlImplementation(control).ClearAccessibilityAttributes();
245 }
246
247 void SetAccessibilityReadingInfoType(Toolkit::Control control, const Dali::Accessibility::ReadingInfoTypes types)
248 {
249   GetControlImplementation(control).SetAccessibilityReadingInfoType(types);
250 }
251
252 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Toolkit::Control control)
253 {
254   return GetControlImplementation(control).GetAccessibilityReadingInfoType();
255 }
256
257 bool ClearAccessibilityHighlight(Toolkit::Control control)
258 {
259   auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
260   if(DALI_LIKELY(controlAccessible))
261   {
262     return controlAccessible->ClearHighlight();
263   }
264   return false;
265 }
266
267 bool GrabAccessibilityHighlight(Toolkit::Control control)
268 {
269   auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
270   if(DALI_LIKELY(controlAccessible))
271   {
272     return controlAccessible->GrabHighlight();
273   }
274   return false;
275 }
276
277 Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
278 {
279   auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
280   if(DALI_LIKELY(controlAccessible))
281   {
282     return controlAccessible->GetStates();
283   }
284   return Dali::Accessibility::States{};
285 }
286
287 void NotifyAccessibilityStateChange(Toolkit::Control control, Dali::Accessibility::States states, bool recurse)
288 {
289   auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
290   if(DALI_LIKELY(controlAccessible))
291   {
292     controlAccessible->NotifyAccessibilityStateChange(std::move(states), recurse);
293   }
294 }
295
296 bool IsAccessibleCreated(Toolkit::Control control)
297 {
298   return GetControlImplementation(control).IsAccessibleCreated();
299 }
300
301 void EnableCreateAccessible(Toolkit::Control control, bool enable)
302 {
303   GetControlImplementation(control).EnableCreateAccessible(enable);
304 }
305
306 bool IsCreateAccessibleEnabled(Toolkit::Control control)
307 {
308   return GetControlImplementation(control).IsCreateAccessibleEnabled();
309 }
310
311 } // namespace DevelControl
312
313 } // namespace Toolkit
314
315 } // namespace Dali