a604433e1f08b69aface0d3bdafca4e67cb20fa4
[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
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 SetInputMethodContext(Internal::Control& control, InputMethodContext& inputMethodContext)
118 {
119   Internal::Control::Impl::Get(control).SetInputMethodContext(inputMethodContext);
120 }
121
122 VisualEventSignalType& VisualEventSignal(Control control)
123 {
124   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
125   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
126   return controlDataImpl.VisualEventSignal();
127 }
128
129 Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, Dali::Property::Key visualPropertyKey)
130 {
131   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
132   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
133   return controlDataImpl.GetVisualProperty(index, visualPropertyKey);
134 }
135
136 Toolkit::DevelControl::AccessibilityActivateSignalType& AccessibilityActivateSignal(Toolkit::Control control)
137 {
138   return GetControlImplementation(control).mAccessibilityActivateSignal;
139 }
140
141 Toolkit::DevelControl::AccessibilityReadingSkippedSignalType& AccessibilityReadingSkippedSignal(Toolkit::Control control)
142 {
143   return GetControlImplementation(control).mAccessibilityReadingSkippedSignal;
144 }
145
146 Toolkit::DevelControl::AccessibilityReadingPausedSignalType& AccessibilityReadingPausedSignal(Toolkit::Control control)
147 {
148   return GetControlImplementation(control).mAccessibilityReadingPausedSignal;
149 }
150
151 Toolkit::DevelControl::AccessibilityReadingResumedSignalType& AccessibilityReadingResumedSignal(Toolkit::Control control)
152 {
153   return GetControlImplementation(control).mAccessibilityReadingResumedSignal;
154 }
155
156 Toolkit::DevelControl::AccessibilityReadingCancelledSignalType& AccessibilityReadingCancelledSignal(Toolkit::Control control)
157 {
158   return GetControlImplementation(control).mAccessibilityReadingCancelledSignal;
159 }
160
161 Toolkit::DevelControl::AccessibilityReadingStoppedSignalType& AccessibilityReadingStoppedSignal(Toolkit::Control control)
162 {
163   return GetControlImplementation(control).mAccessibilityReadingStoppedSignal;
164 }
165
166 Toolkit::DevelControl::AccessibilityGetNameSignalType& AccessibilityGetNameSignal(Toolkit::Control control)
167 {
168   return GetControlImplementation(control).mAccessibilityGetNameSignal;
169 }
170
171 Toolkit::DevelControl::AccessibilityGetDescriptionSignalType& AccessibilityGetDescriptionSignal(Toolkit::Control control)
172 {
173   return GetControlImplementation(control).mAccessibilityGetDescriptionSignal;
174 }
175
176 Toolkit::DevelControl::AccessibilityDoGestureSignalType& AccessibilityDoGestureSignal(Toolkit::Control control)
177 {
178   return GetControlImplementation(control).mAccessibilityDoGestureSignal;
179 }
180
181 void AppendAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
182 {
183   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
184   {
185     GetControlImplementation(control).mAccessibilityRelations[relation].insert(destinationAccessible);
186   }
187 }
188
189 void RemoveAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
190 {
191   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
192   {
193     auto& relations = GetControlImplementation(control).mAccessibilityRelations;
194
195     relations[relation].erase(destinationAccessible);
196
197     if(relations[relation].empty())
198     {
199       relations.erase(relation);
200     }
201   }
202 }
203
204 std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations(Toolkit::Control control)
205 {
206   std::vector<std::vector<Accessibility::Address>> result(static_cast<std::size_t>(Accessibility::RelationType::MAX_COUNT));
207
208   // Map every Accessible* to its Address
209   for(auto& relation : GetControlImplementation(control).mAccessibilityRelations)
210   {
211     auto  index   = static_cast<std::size_t>(relation.first);
212     auto& targets = relation.second;
213
214     std::transform(targets.begin(), targets.end(), std::back_inserter(result[index]), [](auto* x) {
215       return x->GetAddress();
216     });
217   }
218
219   return result;
220 }
221
222 void ClearAccessibilityRelations(Toolkit::Control control)
223 {
224   GetControlImplementation(control).mAccessibilityRelations.clear();
225 }
226
227 void AppendAccessibilityAttribute(Toolkit::Control control, const std::string& key, const std::string& value)
228 {
229   GetControlImplementation(control).AppendAccessibilityAttribute(key, value);
230 }
231
232 void RemoveAccessibilityAttribute(Toolkit::Control control, const std::string& key)
233 {
234   GetControlImplementation(control).RemoveAccessibilityAttribute(key);
235 }
236
237 void ClearAccessibilityAttributes(Toolkit::Control control)
238 {
239   GetControlImplementation(control).ClearAccessibilityAttributes();
240 }
241
242 void SetAccessibilityReadingInfoType(Toolkit::Control control, const Dali::Accessibility::ReadingInfoTypes types)
243 {
244   GetControlImplementation(control).SetAccessibilityReadingInfoType(types);
245 }
246
247 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Toolkit::Control control)
248 {
249   return GetControlImplementation(control).GetAccessibilityReadingInfoType();
250 }
251
252 bool ClearAccessibilityHighlight(Toolkit::Control control)
253 {
254   return GetControlImplementation(control).GetAccessibleObject()->ClearHighlight();
255 }
256
257 bool GrabAccessibilityHighlight(Toolkit::Control control)
258 {
259   return GetControlImplementation(control).GetAccessibleObject()->GrabHighlight();
260 }
261
262 Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
263 {
264   return GetControlImplementation(control).GetAccessibleObject()->GetStates();
265 }
266
267 void NotifyAccessibilityStateChange(Toolkit::Control control, Dali::Accessibility::States states, bool recurse)
268 {
269   GetControlImplementation(control).GetAccessibleObject()->NotifyAccessibilityStateChange(std::move(states), recurse);
270 }
271
272 } // namespace DevelControl
273
274 } // namespace Toolkit
275
276 } // namespace Dali