2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "control-devel.h"
22 #include <dali/public-api/actors/actor.h>
23 #include <dali/public-api/animation/animation.h>
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>
33 Dali::Toolkit::Internal::Control::Impl& GetControlImplementation(Dali::Toolkit::Control control)
35 auto& internalControl = Dali::Toolkit::Internal::GetImplementation(control);
37 return Dali::Toolkit::Internal::Control::Impl::Get(internalControl);
40 } // unnamed namespace
46 namespace DevelControl
48 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual)
50 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
51 controlDataImpl.RegisterVisual(index, visual);
54 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, int depthIndex)
56 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
57 controlDataImpl.RegisterVisual(index, visual, depthIndex);
60 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled)
62 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
63 controlDataImpl.RegisterVisual(index, visual, enabled);
66 void RegisterVisual(Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex)
68 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
69 controlDataImpl.RegisterVisual(index, visual, enabled, depthIndex);
72 void UnregisterVisual(Internal::Control& control, Dali::Property::Index index)
74 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
75 controlDataImpl.UnregisterVisual(index);
78 Toolkit::Visual::Base GetVisual(const Internal::Control& control, Dali::Property::Index index)
80 const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
81 return controlDataImpl.GetVisual(index);
84 void EnableVisual(Internal::Control& control, Dali::Property::Index index, bool enable)
86 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
87 controlDataImpl.EnableVisual(index, enable);
90 bool IsVisualEnabled(const Internal::Control& control, Dali::Property::Index index)
92 const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
93 return controlDataImpl.IsVisualEnabled(index);
96 Dali::Animation CreateTransition(Internal::Control& control, const Toolkit::TransitionData& handle)
98 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
99 return controlDataImpl.CreateTransition(handle);
102 void AddTransitions(Internal::Control& control,
103 Dali::Animation animation,
104 const Toolkit::TransitionData& transitionData)
106 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(control);
107 controlDataImpl.AddTransitions(animation, transitionData);
110 void DoAction(Control& control, Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes)
112 Internal::Control& controlInternal = Toolkit::Internal::GetImplementation(control);
113 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlInternal);
114 controlDataImpl.DoAction(visualIndex, actionId, attributes);
117 void SetInputMethodContext(Internal::Control& control, InputMethodContext& inputMethodContext)
119 Internal::Control::Impl::Get(control).SetInputMethodContext(inputMethodContext);
122 VisualEventSignalType& VisualEventSignal(Control control)
124 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
125 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
126 return controlDataImpl.VisualEventSignal();
129 Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, Dali::Property::Key visualPropertyKey)
131 Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
132 Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl);
133 return controlDataImpl.GetVisualProperty(index, visualPropertyKey);
136 Toolkit::DevelControl::AccessibilityActivateSignalType& AccessibilityActivateSignal(Toolkit::Control control)
138 return GetControlImplementation(control).mAccessibilityActivateSignal;
141 Toolkit::DevelControl::AccessibilityReadingSkippedSignalType& AccessibilityReadingSkippedSignal(Toolkit::Control control)
143 return GetControlImplementation(control).mAccessibilityReadingSkippedSignal;
146 Toolkit::DevelControl::AccessibilityReadingPausedSignalType& AccessibilityReadingPausedSignal(Toolkit::Control control)
148 return GetControlImplementation(control).mAccessibilityReadingPausedSignal;
151 Toolkit::DevelControl::AccessibilityReadingResumedSignalType& AccessibilityReadingResumedSignal(Toolkit::Control control)
153 return GetControlImplementation(control).mAccessibilityReadingResumedSignal;
156 Toolkit::DevelControl::AccessibilityReadingCancelledSignalType& AccessibilityReadingCancelledSignal(Toolkit::Control control)
158 return GetControlImplementation(control).mAccessibilityReadingCancelledSignal;
161 Toolkit::DevelControl::AccessibilityReadingStoppedSignalType& AccessibilityReadingStoppedSignal(Toolkit::Control control)
163 return GetControlImplementation(control).mAccessibilityReadingStoppedSignal;
166 Toolkit::DevelControl::AccessibilityGetNameSignalType& AccessibilityGetNameSignal(Toolkit::Control control)
168 return GetControlImplementation(control).mAccessibilityGetNameSignal;
171 Toolkit::DevelControl::AccessibilityGetDescriptionSignalType& AccessibilityGetDescriptionSignal(Toolkit::Control control)
173 return GetControlImplementation(control).mAccessibilityGetDescriptionSignal;
176 Toolkit::DevelControl::AccessibilityDoGestureSignalType& AccessibilityDoGestureSignal(Toolkit::Control control)
178 return GetControlImplementation(control).mAccessibilityDoGestureSignal;
181 void AppendAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
183 if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
185 GetControlImplementation(control).mAccessibilityRelations[relation].insert(destinationAccessible);
189 void RemoveAccessibilityRelation(Toolkit::Control control, Dali::Actor destination, Dali::Accessibility::RelationType relation)
191 if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
193 auto& relations = GetControlImplementation(control).mAccessibilityRelations;
195 relations[relation].erase(destinationAccessible);
197 if(relations[relation].empty())
199 relations.erase(relation);
204 std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations(Toolkit::Control control)
206 std::vector<std::vector<Accessibility::Address>> result(static_cast<std::size_t>(Accessibility::RelationType::MAX_COUNT));
208 // Map every Accessible* to its Address
209 for(auto& relation : GetControlImplementation(control).mAccessibilityRelations)
211 auto index = static_cast<std::size_t>(relation.first);
212 auto& targets = relation.second;
214 std::transform(targets.begin(), targets.end(), std::back_inserter(result[index]), [](auto* x) {
215 return x->GetAddress();
222 void ClearAccessibilityRelations(Toolkit::Control control)
224 GetControlImplementation(control).mAccessibilityRelations.clear();
227 void SetAccessibilityConstructor(Dali::Actor control, std::function<std::unique_ptr<Dali::Accessibility::Accessible>(Dali::Actor)> constructor)
229 GetControlImplementation(Toolkit::Control::DownCast(control)).mAccessibilityConstructor = constructor;
232 void AppendAccessibilityAttribute(Toolkit::Control control, const std::string& key, const std::string& value)
234 GetControlImplementation(control).AppendAccessibilityAttribute(key, value);
237 void RemoveAccessibilityAttribute(Toolkit::Control control, const std::string& key)
239 GetControlImplementation(control).RemoveAccessibilityAttribute(key);
242 void ClearAccessibilityAttributes(Toolkit::Control control)
244 GetControlImplementation(control).ClearAccessibilityAttributes();
247 void SetAccessibilityReadingInfoType(Toolkit::Control control, const Dali::Accessibility::ReadingInfoTypes types)
249 GetControlImplementation(control).SetAccessibilityReadingInfoType(types);
252 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Toolkit::Control control)
254 return GetControlImplementation(control).GetAccessibilityReadingInfoType();
257 bool ClearAccessibilityHighlight(Toolkit::Control control)
259 auto* accessible = Dali::Accessibility::Component::DownCast(GetControlImplementation(control).GetAccessibilityObject());
261 return accessible ? accessible->ClearHighlight() : false;
264 bool GrabAccessibilityHighlight(Toolkit::Control control)
266 auto* accessible = Dali::Accessibility::Component::DownCast(GetControlImplementation(control).GetAccessibilityObject());
268 return accessible ? accessible->GrabHighlight() : false;
271 Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
273 auto* accessible = GetControlImplementation(control).GetAccessibilityObject();
275 return accessible->GetStates();
278 void NotifyAccessibilityStateChange(Toolkit::Control control, Dali::Accessibility::States states, bool recurse)
280 GetControlImplementation(control).GetAccessibilityObject()->NotifyAccessibilityStateChange(std::move(states), recurse);
283 } // namespace DevelControl
285 } // namespace Toolkit