Wait(application);
- auto* accessibleParent = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(scrollView));
+ auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(scrollView));
DALI_TEST_CHECK(accessibleParent);
- auto* accessibleA = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(actorA));
+ auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorA));
DALI_TEST_CHECK(accessibleA);
- auto* accessibleB = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(actorB));
+ auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(actorB));
DALI_TEST_CHECK(accessibleB);
accessibleA->GrabHighlight(); // == scrollView.ScrollTo(actorA)
Wait(application);
- auto* accessibleParent = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(view));
+ auto* accessibleParent = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view));
DALI_TEST_CHECK(accessibleParent);
- auto* accessibleA = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(view.GetItem(0)));
+ auto* accessibleA = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(0)));
DALI_TEST_CHECK(accessibleA);
- auto* accessibleB = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(view.GetItem(1)));
+ auto* accessibleB = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(view.GetItem(1)));
DALI_TEST_CHECK(accessibleB);
accessibleA->GrabHighlight(); // == view.ScrollToItem(view.GetItemId(actorA))
TextLabel label = TextLabel::New("123");
- auto* accessible = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(label));
+ auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(label));
DALI_TEST_CHECK(accessible);
DALI_TEST_EQUALS(accessible->IsScrollable(), false, TEST_LOCATION);
Wait(application);
// Set highlight to first child (A) to enable movement tracking
- auto* accessible = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(buttonA));
+ auto* accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
DALI_TEST_CHECK(accessible);
accessible->GrabHighlight();
Wait(application);
Dali::Accessibility::TestResetMoveOutedCalled();
// Set highlight to second child (B) to enable movement tracking
- accessible = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(buttonB));
+ accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonB));
DALI_TEST_CHECK(accessible);
accessible->GrabHighlight();
Wait(application);
Dali::Accessibility::TestResetMoveOutedCalled();
// Disable movement tracking on B by giving highlight to A
- accessible = dynamic_cast<DevelControl::AccessibleImpl*>(Dali::Accessibility::Accessible::Get(buttonA));
+ accessible = dynamic_cast<DevelControl::ControlAccessible*>(Dali::Accessibility::Accessible::Get(buttonA));
DALI_TEST_CHECK(accessible);
accessible->GrabHighlight();
Wait(application);
+++ /dev/null
-/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// CLASS HEADER
-#include "accessible-impl.h"
-
-// EXTERNAL INCLUDES
-#ifdef DGETTEXT_ENABLED
-#include <libintl.h>
-#endif
-
-#include <dali/devel-api/actors/actor-devel.h>
-#include <dali/devel-api/adaptor-framework/window-devel.h>
-
-// INTERNAL INCLUDES
-#include <dali-toolkit/devel-api/asset-manager/asset-manager.h>
-#include <dali-toolkit/internal/controls/control/control-data-impl.h>
-#include <dali-toolkit/public-api/controls/control-impl.h>
-#include <dali-toolkit/public-api/controls/control.h>
-#include <dali-toolkit/public-api/controls/image-view/image-view.h>
-#include <dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h>
-
-namespace Dali::Toolkit::DevelControl
-{
-namespace
-{
-static std::string GetLocaleText(std::string string, const char *domain = "dali-toolkit")
-{
-#ifdef DGETTEXT_ENABLED
- /*TODO: currently non-localized string is used as a key for translation lookup. In case the lookup key formatting is forced
- consider calling utility function for converting non-localized string into well-formatted key before lookup. */
- return dgettext(domain, string.c_str());
-#else
- return string;
-#endif
-}
-
-static Dali::Actor CreateHighlightIndicatorActor()
-{
- std::string focusBorderImagePath(AssetManager::GetDaliImagePath());
- focusBorderImagePath += "/keyboard_focus.9.png";
-
- // Create the default if it hasn't been set and one that's shared by all the
- // keyboard focusable actors
- auto actor = Toolkit::ImageView::New(focusBorderImagePath);
- actor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
-
- DevelControl::AppendAccessibilityAttribute(actor, "highlight", std::string());
- actor.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false);
-
- return actor;
-}
-} // unnamed namespace
-
-AccessibleImpl::AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal)
-: mSelf(self),
- mIsModal(modal)
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
-
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
- if(controlImpl.mAccessibilityRole == Dali::Accessibility::Role::UNKNOWN)
- {
- controlImpl.mAccessibilityRole = role;
- }
-
- Self().PropertySetSignal().Connect(&controlImpl, [this, &controlImpl](Dali::Handle& handle, Dali::Property::Index index, Dali::Property::Value value) {
- if(this->Self() != Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor())
- {
- return;
- }
-
- if(index == DevelControl::Property::ACCESSIBILITY_NAME || (index == GetNamePropertyIndex() && !controlImpl.mAccessibilityNameSet))
- {
- if(controlImpl.mAccessibilityGetNameSignal.Empty())
- {
- Emit(Dali::Accessibility::ObjectPropertyChangeEvent::NAME);
- }
- }
-
- if(index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION || (index == GetDescriptionPropertyIndex() && !controlImpl.mAccessibilityDescriptionSet))
- {
- if(controlImpl.mAccessibilityGetDescriptionSignal.Empty())
- {
- Emit(Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION);
- }
- }
- });
-}
-
-std::string AccessibleImpl::GetName()
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
-
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
- std::string name;
-
- if(!controlImpl.mAccessibilityGetNameSignal.Empty())
- {
- controlImpl.mAccessibilityGetNameSignal.Emit(name);
- }
- else if(controlImpl.mAccessibilityNameSet)
- {
- name = controlImpl.mAccessibilityName;
- }
- else if(auto raw = GetNameRaw(); !raw.empty())
- {
- name = raw;
- }
- else
- {
- name = Self().GetProperty<std::string>(Actor::Property::NAME);
- }
-
- if(controlImpl.mAccessibilityTranslationDomainSet)
- {
- return GetLocaleText(name, controlImpl.mAccessibilityTranslationDomain.c_str());
- }
-
- return GetLocaleText(name);
-}
-
-std::string AccessibleImpl::GetNameRaw()
-{
- return {};
-}
-
-std::string AccessibleImpl::GetDescription()
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
-
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
- std::string description;
-
- if(!controlImpl.mAccessibilityGetDescriptionSignal.Empty())
- {
- controlImpl.mAccessibilityGetDescriptionSignal.Emit(description);
- }
- else if(controlImpl.mAccessibilityDescriptionSet)
- {
- description = controlImpl.mAccessibilityDescription;
- }
- else
- {
- description = GetDescriptionRaw();
- }
- if(controlImpl.mAccessibilityTranslationDomainSet)
- {
- return GetLocaleText(description, controlImpl.mAccessibilityTranslationDomain.c_str());
- }
-
- return GetLocaleText(description);
-}
-
-std::string AccessibleImpl::GetDescriptionRaw()
-{
- return {};
-}
-
-Dali::Accessibility::Accessible* AccessibleImpl::GetParent()
-{
- return Dali::Accessibility::Accessible::Get(Self().GetParent());
-}
-
-size_t AccessibleImpl::GetChildCount()
-{
- return Self().GetChildCount();
-}
-
-Dali::Accessibility::Accessible* AccessibleImpl::GetChildAtIndex(size_t index)
-{
- return Dali::Accessibility::Accessible::Get(Self().GetChildAt(static_cast<unsigned int>(index)));
-}
-
-size_t AccessibleImpl::GetIndexInParent()
-{
- auto self = Self();
- auto parent = self.GetParent();
- DALI_ASSERT_ALWAYS(parent && "can't call GetIndexInParent on object without parent");
-
- auto count = parent.GetChildCount();
- for(auto i = 0u; i < count; ++i)
- {
- auto child = parent.GetChildAt(i);
- if(child == self)
- {
- return i;
- }
- }
- DALI_ASSERT_ALWAYS(false && "object isn't child of it's parent");
- return static_cast<size_t>(-1);
-}
-
-Dali::Accessibility::Role AccessibleImpl::GetRole()
-{
- return Self().GetProperty<Dali::Accessibility::Role>(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE);
-}
-
-std::string AccessibleImpl::GetLocalizedRoleName()
-{
- return GetLocaleText(GetRoleName());
-}
-
-bool AccessibleImpl::IsShowing()
-{
- Dali::Actor self = Self();
- if(!self.GetProperty<bool>(Actor::Property::VISIBLE) || self.GetProperty<Vector4>(Actor::Property::WORLD_COLOR).a == 0 || self.GetProperty<bool>(Dali::DevelActor::Property::CULLED))
- {
- return false;
- }
-
- auto* child = this;
- auto* parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(child->GetParent());
- if(!parent)
- {
- return true;
- }
-
- auto childExtent = child->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
- while(parent)
- {
- auto control = Dali::Toolkit::Control::DownCast(parent->Self());
- if(!control.GetProperty<bool>(Actor::Property::VISIBLE))
- {
- return false;
- }
- auto clipMode = control.GetProperty(Actor::Property::CLIPPING_MODE).Get<bool>();
- auto parentExtent = parent->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
- if ((clipMode != ClippingMode::DISABLED) && !parentExtent.Intersects(childExtent))
- {
- return false;
- }
- parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(parent->GetParent());
- }
-
- return true;
-}
-
-Dali::Accessibility::States AccessibleImpl::CalculateStates()
-{
- Dali::Actor self = Self();
- Dali::Accessibility::States state;
- state[Dali::Accessibility::State::FOCUSABLE] = self.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE);
- state[Dali::Accessibility::State::FOCUSED] = Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor() == self;
-
- if(self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType() == Dali::Property::NONE)
- {
- state[Dali::Accessibility::State::HIGHLIGHTABLE] = false;
- }
- else
- {
- state[Dali::Accessibility::State::HIGHLIGHTABLE] = self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>();
- }
-
- state[Dali::Accessibility::State::HIGHLIGHTED] = GetCurrentlyHighlightedActor() == self;
- state[Dali::Accessibility::State::ENABLED] = true;
- state[Dali::Accessibility::State::SENSITIVE] = true;
- state[Dali::Accessibility::State::VISIBLE] = self.GetProperty<bool>(Actor::Property::VISIBLE);
-
- if(mIsModal)
- {
- state[Dali::Accessibility::State::MODAL] = true;
- }
- state[Dali::Accessibility::State::SHOWING] = IsShowing();
- state[Dali::Accessibility::State::DEFUNCT] = !self.GetProperty(Dali::DevelActor::Property::CONNECTED_TO_SCENE).Get<bool>();
- return state;
-}
-
-Dali::Accessibility::States AccessibleImpl::GetStates()
-{
- return CalculateStates();
-}
-
-Dali::Accessibility::Attributes AccessibleImpl::GetAttributes()
-{
- std::unordered_map<std::string, std::string> attributeMap;
- auto control = Dali::Toolkit::Control::DownCast(Self());
- auto attribute = control.GetProperty(Dali::Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
- auto map = attribute.GetMap();
-
- if(map)
- {
- auto mapSize = map->Count();
-
- for(unsigned int i = 0; i < mapSize; i++)
- {
- auto mapKey = map->GetKeyAt(i);
- if(mapKey.type == Dali::Property::Key::STRING)
- {
- std::string mapValue;
- if(map->GetValue(i).Get(mapValue))
- {
- attributeMap.emplace(std::move(mapKey.stringKey), std::move(mapValue));
- }
- }
- }
- }
-
- return attributeMap;
-}
-
-Dali::Accessibility::ComponentLayer AccessibleImpl::GetLayer()
-{
- return Dali::Accessibility::ComponentLayer::WINDOW;
-}
-
-Dali::Rect<> AccessibleImpl::GetExtents(Dali::Accessibility::CoordinateType type)
-{
- Dali::Actor self = Self();
-
- Vector2 screenPosition = self.GetProperty(Dali::DevelActor::Property::SCREEN_POSITION).Get<Vector2>();
- auto size = self.GetCurrentProperty<Vector3>(Actor::Property::SIZE) * self.GetCurrentProperty<Vector3>(Actor::Property::WORLD_SCALE);
- bool positionUsesAnchorPoint = self.GetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT).Get<bool>();
- Vector3 anchorPointOffSet = size * (positionUsesAnchorPoint ? self.GetCurrentProperty<Vector3>(Actor::Property::ANCHOR_POINT) : AnchorPoint::TOP_LEFT);
- Vector2 position = Vector2((screenPosition.x - anchorPointOffSet.x), (screenPosition.y - anchorPointOffSet.y));
-
- if(type == Dali::Accessibility::CoordinateType::WINDOW)
- {
- return {position.x, position.y, size.x, size.y};
- }
- else // Dali::Accessibility::CoordinateType::SCREEN
- {
- auto window = Dali::DevelWindow::Get(self);
- auto windowPosition = window.GetPosition();
- return {position.x + windowPosition.GetX(), position.y + windowPosition.GetY(), size.x, size.y};
- }
-}
-
-int16_t AccessibleImpl::GetMdiZOrder()
-{
- return 0;
-}
-double AccessibleImpl::GetAlpha()
-{
- return 0;
-}
-
-bool AccessibleImpl::GrabFocus()
-{
- return Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor(Self());
-}
-
-void AccessibleImpl::ScrollToSelf()
-{
- auto* child = this;
- auto* parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(child->GetParent());
-
- while (parent)
- {
- if (parent->IsScrollable())
- {
- parent->ScrollToChild(child->Self());
- }
-
- parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(parent->GetParent());
- }
-}
-
-void AccessibleImpl::RegisterPositionPropertyNotification()
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
- controlImpl.RegisterAccessibilityPositionPropertyNotification();
-}
-
-void AccessibleImpl::UnregisterPositionPropertyNotification()
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
- controlImpl.UnregisterAccessibilityPositionPropertyNotification();
-}
-
-bool AccessibleImpl::GrabHighlight()
-{
- Dali::Actor self = Self();
- auto oldHighlightedActor = GetCurrentlyHighlightedActor();
-
- if(!Dali::Accessibility::IsUp())
- {
- return false;
- }
-
- if(self == oldHighlightedActor)
- {
- return true;
- }
-
- // Clear the old highlight.
- if(oldHighlightedActor)
- {
- auto oldHighlightObject = dynamic_cast<Dali::Accessibility::Component*>(Internal::Control::Impl::GetAccessibilityObject(oldHighlightedActor));
- if(oldHighlightObject)
- {
- oldHighlightObject->ClearHighlight();
- }
- }
-
- auto highlight = GetHighlightActor();
- if(!highlight)
- {
- highlight = CreateHighlightIndicatorActor();
- SetHighlightActor(highlight);
- }
-
- highlight.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- highlight.SetProperty(Actor::Property::POSITION_Z, 1.0f);
- highlight.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f));
-
- // Need to set resize policy again, to update SIZE property which is set by
- // AccessibleImpl_NUI. The highlight could move from AccessibleImpl_NUI to
- // AccessibleImpl. In this case, highlight has incorrect size.
- highlight.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
-
- // Remember the highlight actor, so that when the default is changed with
- // SetHighlightActor(), the currently displayed highlight can still be cleared.
- mCurrentHighlightActor = highlight;
- ScrollToSelf();
- self.Add(highlight);
- SetCurrentlyHighlightedActor(self);
- EmitHighlighted(true);
- RegisterPositionPropertyNotification();
-
- return true;
-}
-
-bool AccessibleImpl::ClearHighlight()
-{
- Dali::Actor self = Self();
-
- if(!Dali::Accessibility::IsUp())
- {
- return false;
- }
-
- if(GetCurrentlyHighlightedActor() == self)
- {
- UnregisterPositionPropertyNotification();
- self.Remove(mCurrentHighlightActor.GetHandle());
- mCurrentHighlightActor = {};
- SetCurrentlyHighlightedActor({});
- EmitHighlighted(false);
- return true;
- }
- return false;
-}
-
-std::string AccessibleImpl::GetActionName(size_t index)
-{
- if(index >= GetActionCount())
- {
- return {};
- }
-
- Dali::TypeInfo type;
- Self().GetTypeInfo(type);
- DALI_ASSERT_ALWAYS(type && "no TypeInfo object");
- return type.GetActionName(index);
-}
-
-std::string AccessibleImpl::GetLocalizedActionName(size_t index)
-{
- return GetLocaleText(GetActionName(index));
-}
-
-std::string AccessibleImpl::GetActionDescription(size_t index)
-{
- return {};
-}
-
-size_t AccessibleImpl::GetActionCount()
-{
- Dali::TypeInfo type;
- Self().GetTypeInfo(type);
- DALI_ASSERT_ALWAYS(type && "no TypeInfo object");
- return type.GetActionCount();
-}
-
-std::string AccessibleImpl::GetActionKeyBinding(size_t index)
-{
- return {};
-}
-
-bool AccessibleImpl::DoAction(size_t index)
-{
- std::string actionName = GetActionName(index);
- return Self().DoAction(actionName, {});
-}
-
-bool AccessibleImpl::DoAction(const std::string& name)
-{
- return Self().DoAction(name, {});
-}
-
-bool AccessibleImpl::DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo)
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
-
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
-
- if(!controlImpl.mAccessibilityDoGestureSignal.Empty())
- {
- auto ret = std::make_pair(gestureInfo, false);
- controlImpl.mAccessibilityDoGestureSignal.Emit(ret);
- return ret.second;
- }
-
- return false;
-}
-
-std::vector<Dali::Accessibility::Relation> AccessibleImpl::GetRelationSet()
-{
- auto control = Dali::Toolkit::Control::DownCast(Self());
-
- Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
- Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
-
- std::vector<Dali::Accessibility::Relation> ret;
-
- for(auto& relation : controlImpl.mAccessibilityRelations)
- {
- auto& targets = relation.second;
-
- ret.emplace_back(Accessibility::Relation{relation.first, {}});
-
- // Map every Accessible* to its Address
- std::transform(targets.begin(), targets.end(), std::back_inserter(ret.back().targets), [](auto* x) {
- return x->GetAddress();
- });
- }
-
- return ret;
-}
-
-Dali::Actor AccessibleImpl::GetInternalActor()
-{
- return Dali::Actor{};
-}
-
-bool AccessibleImpl::ScrollToChild(Actor child)
-{
- return false;
-}
-
-Dali::Property::Index AccessibleImpl::GetNamePropertyIndex()
-{
- return Actor::Property::NAME;
-}
-
-Dali::Property::Index AccessibleImpl::GetDescriptionPropertyIndex()
-{
- return Dali::Property::INVALID_INDEX;
-}
-
-void AccessibleImpl::SetLastPosition(Vector2 position)
-{
- mLastPosition = position;
-}
-
-Vector2 AccessibleImpl::GetLastPosition() const
-{
- return mLastPosition;
-}
-
-} // namespace Dali::Toolkit::DevelControl
+++ /dev/null
-#ifndef DALI_TOOLKIT_ACCESSIBLE_IMPL_H
-#define DALI_TOOLKIT_ACCESSIBLE_IMPL_H
-/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-// EXTERNAL INCLUDES
-#include <dali/devel-api/adaptor-framework/accessibility.h>
-#include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
-#include <dali/devel-api/atspi-interfaces/accessible.h>
-#include <dali/devel-api/atspi-interfaces/action.h>
-#include <dali/devel-api/atspi-interfaces/collection.h>
-#include <dali/devel-api/atspi-interfaces/component.h>
-#include <dali/public-api/object/weak-handle.h>
-
-// INTERNAL INCLUDES
-#include <dali-toolkit/public-api/dali-toolkit-common.h>
-
-namespace Dali::Toolkit::DevelControl {
-
-/**
- * @brief Represents the Accessible object for Dali::Toolkit::Control and derived classes
- *
- * You can create a derived class (and register it using SetAccessibilityConstructor)
- * in order to customize Accessibility for a given control.
- *
- * @see Dali::Toolkit::DevelControl::SetAccessibilityConstructor
- * @see Dali::Accessibility::Accessible
- * @see Dali::Accessibility::Component
- * @see Dali::Accessibility::Collection
- * @see Dali::Accessibility::Action
- * @see Dali::Accessibility::Value
- * @see Dali::Accessibility::Text
- * @see Dali::Accessibility::EditableText
- */
-struct DALI_TOOLKIT_API AccessibleImpl : public virtual Dali::Accessibility::Accessible,
- public virtual Dali::Accessibility::Component,
- public virtual Dali::Accessibility::Collection,
- public virtual Dali::Accessibility::Action
-{
-protected:
- Vector2 mLastPosition{0.0f, 0.0f};
- Dali::WeakHandle<Dali::Actor> mSelf;
- Dali::WeakHandle<Dali::Actor> mCurrentHighlightActor;
- bool mIsModal = false;
- bool mIsRoot = false;
-
- Dali::Actor Self() const
- {
- auto handle = mSelf.GetHandle();
-
- // Control::Impl holds a std::unique_ptr to the Accessible object,
- // so that one does not outlive the other.
- DALI_ASSERT_ALWAYS(handle);
-
- return handle;
- }
-
- void ScrollToSelf();
-
- /**
- * @brief Register property notification to check highlighted object position
- */
- void RegisterPositionPropertyNotification();
-
- /**
- * @brief Remove property notification added by RegisterPropertyNotification
- */
- void UnregisterPositionPropertyNotification();
-
- /**
- * @brief Check if the actor is showing
- * @return True if the actor is showing
- */
- bool IsShowing();
-
-public:
- AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal = false);
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetName()
- */
- std::string GetName() override;
-
- /**
- * @brief Returns the actor's name in the absence of ACCESSIBILITY_NAME property
- */
- virtual std::string GetNameRaw();
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetDescription()
- */
- std::string GetDescription() override;
-
- /**
- * @brief Returns the actor's description in the absence of ACCESSIBILITY_DESCRIPTION property
- */
- virtual std::string GetDescriptionRaw();
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetParent()
- */
- Dali::Accessibility::Accessible* GetParent() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetChildCount()
- */
- size_t GetChildCount() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetChildAtIndex()
- */
- Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetIndexInParent()
- */
- size_t GetIndexInParent() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetRole()
- */
- Dali::Accessibility::Role GetRole() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetLocalizedRoleName()
- */
- std::string GetLocalizedRoleName() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetStates()
- */
- Dali::Accessibility::States GetStates() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetAttributes()
- */
- Dali::Accessibility::Attributes GetAttributes() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GetExtents()
- */
- Dali::Rect<> GetExtents(Accessibility::CoordinateType type) override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GetLayer()
- */
- Dali::Accessibility::ComponentLayer GetLayer() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GetMdiZOrder()
- */
- int16_t GetMdiZOrder() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GrabFocus()
- */
- bool GrabFocus() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GetAlpha()
- */
- double GetAlpha() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::GrabHighlight()
- */
- bool GrabHighlight() override;
-
- /**
- * @copydoc Dali::Accessibility::Component::ClearHighlight()
- */
- bool ClearHighlight() override;
-
- /**
- * @copydoc Dali::Accessibility::Action::GetActionName()
- */
- std::string GetActionName(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Action::GetLocalizedActionName()
- */
- std::string GetLocalizedActionName(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Action::GetActionDescription()
- */
- std::string GetActionDescription(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Action::GetActionCount()
- */
- size_t GetActionCount() override;
-
- /**
- * @copydoc Dali::Accessibility::Action::GetActionKeyBinding()
- */
- std::string GetActionKeyBinding(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Action::DoAction(size_t)
- */
- bool DoAction(size_t index) override;
-
- /**
- * @copydoc Dali::Accessibility::Action::DoAction(const std::string&)
- */
- bool DoAction(const std::string& name) override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::DoGesture()
- */
- bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetRelationSet()
- */
- std::vector<Dali::Accessibility::Relation> GetRelationSet() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetInternalActor()
- */
- Dali::Actor GetInternalActor() override;
-
- /**
- * @copydoc Dali::Accessibility::Accessible::GetStates()
- */
- virtual Dali::Accessibility::States CalculateStates();
-
- /**
- * @brief Makes sure that a given child (descendant) of this container (e.g. ItemView) is visible
- * @return false if scrolling is not supported or child is already visible
- */
- virtual bool ScrollToChild(Actor child);
-
- /**
- * @brief Returns the index of the property that represents this actor's name
- */
- virtual Dali::Property::Index GetNamePropertyIndex();
-
- /**
- * @brief Returns the index of the property that represents this actor's description
- */
- virtual Dali::Property::Index GetDescriptionPropertyIndex();
-
- /**
- * @brief Sets last object position
- * @param[in] position Last object position
- */
- void SetLastPosition(Vector2 position);
-
- /**
- * @brief Gets last object position
- * @return The Last object position
- */
- Vector2 GetLastPosition() const;
-};
-
-} // namespace Dali::Toolkit::DevelControl
-
-#endif // DALI_TOOLKIT_ACCESSIBLE_IMPL_H
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include "control-accessible.h"
+
+// EXTERNAL INCLUDES
+#ifdef DGETTEXT_ENABLED
+#include <libintl.h>
+#endif
+
+#include <dali/devel-api/actors/actor-devel.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/devel-api/asset-manager/asset-manager.h>
+#include <dali-toolkit/internal/controls/control/control-data-impl.h>
+#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/control.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
+#include <dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h>
+
+namespace Dali::Toolkit::DevelControl
+{
+namespace
+{
+static std::string GetLocaleText(std::string string, const char *domain = "dali-toolkit")
+{
+#ifdef DGETTEXT_ENABLED
+ /*TODO: currently non-localized string is used as a key for translation lookup. In case the lookup key formatting is forced
+ consider calling utility function for converting non-localized string into well-formatted key before lookup. */
+ return dgettext(domain, string.c_str());
+#else
+ return string;
+#endif
+}
+
+static Dali::Actor CreateHighlightIndicatorActor()
+{
+ std::string focusBorderImagePath(AssetManager::GetDaliImagePath());
+ focusBorderImagePath += "/keyboard_focus.9.png";
+
+ // Create the default if it hasn't been set and one that's shared by all the
+ // keyboard focusable actors
+ auto actor = Toolkit::ImageView::New(focusBorderImagePath);
+ actor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
+
+ DevelControl::AppendAccessibilityAttribute(actor, "highlight", std::string());
+ actor.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false);
+
+ return actor;
+}
+} // unnamed namespace
+
+ControlAccessible::ControlAccessible(Dali::Actor self, Dali::Accessibility::Role role, bool modal)
+: mSelf(self),
+ mIsModal(modal)
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+ if(controlImpl.mAccessibilityRole == Dali::Accessibility::Role::UNKNOWN)
+ {
+ controlImpl.mAccessibilityRole = role;
+ }
+
+ Self().PropertySetSignal().Connect(&controlImpl, [this, &controlImpl](Dali::Handle& handle, Dali::Property::Index index, Dali::Property::Value value) {
+ if(this->Self() != Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor())
+ {
+ return;
+ }
+
+ if(index == DevelControl::Property::ACCESSIBILITY_NAME || (index == GetNamePropertyIndex() && !controlImpl.mAccessibilityNameSet))
+ {
+ if(controlImpl.mAccessibilityGetNameSignal.Empty())
+ {
+ Emit(Dali::Accessibility::ObjectPropertyChangeEvent::NAME);
+ }
+ }
+
+ if(index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION || (index == GetDescriptionPropertyIndex() && !controlImpl.mAccessibilityDescriptionSet))
+ {
+ if(controlImpl.mAccessibilityGetDescriptionSignal.Empty())
+ {
+ Emit(Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION);
+ }
+ }
+ });
+}
+
+std::string ControlAccessible::GetName() const
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+ std::string name;
+
+ if(!controlImpl.mAccessibilityGetNameSignal.Empty())
+ {
+ controlImpl.mAccessibilityGetNameSignal.Emit(name);
+ }
+ else if(controlImpl.mAccessibilityNameSet)
+ {
+ name = controlImpl.mAccessibilityName;
+ }
+ else if(auto raw = GetNameRaw(); !raw.empty())
+ {
+ name = raw;
+ }
+ else
+ {
+ name = Self().GetProperty<std::string>(Actor::Property::NAME);
+ }
+
+ if(controlImpl.mAccessibilityTranslationDomainSet)
+ {
+ return GetLocaleText(name, controlImpl.mAccessibilityTranslationDomain.c_str());
+ }
+
+ return GetLocaleText(name);
+}
+
+std::string ControlAccessible::GetNameRaw() const
+{
+ return {};
+}
+
+std::string ControlAccessible::GetDescription() const
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+ std::string description;
+
+ if(!controlImpl.mAccessibilityGetDescriptionSignal.Empty())
+ {
+ controlImpl.mAccessibilityGetDescriptionSignal.Emit(description);
+ }
+ else if(controlImpl.mAccessibilityDescriptionSet)
+ {
+ description = controlImpl.mAccessibilityDescription;
+ }
+ else
+ {
+ description = GetDescriptionRaw();
+ }
+ if(controlImpl.mAccessibilityTranslationDomainSet)
+ {
+ return GetLocaleText(description, controlImpl.mAccessibilityTranslationDomain.c_str());
+ }
+
+ return GetLocaleText(description);
+}
+
+std::string ControlAccessible::GetDescriptionRaw() const
+{
+ return {};
+}
+
+Dali::Accessibility::Accessible* ControlAccessible::GetParent()
+{
+ return Dali::Accessibility::Accessible::Get(Self().GetParent());
+}
+
+size_t ControlAccessible::GetChildCount() const
+{
+ return Self().GetChildCount();
+}
+
+Dali::Accessibility::Accessible* ControlAccessible::GetChildAtIndex(size_t index)
+{
+ return Dali::Accessibility::Accessible::Get(Self().GetChildAt(static_cast<unsigned int>(index)));
+}
+
+size_t ControlAccessible::GetIndexInParent()
+{
+ auto self = Self();
+ auto parent = self.GetParent();
+ DALI_ASSERT_ALWAYS(parent && "can't call GetIndexInParent on object without parent");
+
+ auto count = parent.GetChildCount();
+ for(auto i = 0u; i < count; ++i)
+ {
+ auto child = parent.GetChildAt(i);
+ if(child == self)
+ {
+ return i;
+ }
+ }
+ DALI_ASSERT_ALWAYS(false && "object isn't child of it's parent");
+ return static_cast<size_t>(-1);
+}
+
+Dali::Accessibility::Role ControlAccessible::GetRole() const
+{
+ return Self().GetProperty<Dali::Accessibility::Role>(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE);
+}
+
+std::string ControlAccessible::GetLocalizedRoleName() const
+{
+ return GetLocaleText(GetRoleName());
+}
+
+bool ControlAccessible::IsShowing()
+{
+ Dali::Actor self = Self();
+ if(!self.GetProperty<bool>(Actor::Property::VISIBLE) || self.GetProperty<Vector4>(Actor::Property::WORLD_COLOR).a == 0 || self.GetProperty<bool>(Dali::DevelActor::Property::CULLED))
+ {
+ return false;
+ }
+
+ auto* child = this;
+ auto* parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(child->GetParent());
+ if(!parent)
+ {
+ return true;
+ }
+
+ auto childExtent = child->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
+ while(parent)
+ {
+ auto control = Dali::Toolkit::Control::DownCast(parent->Self());
+ if(!control.GetProperty<bool>(Actor::Property::VISIBLE))
+ {
+ return false;
+ }
+ auto clipMode = control.GetProperty(Actor::Property::CLIPPING_MODE).Get<bool>();
+ auto parentExtent = parent->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
+ if ((clipMode != ClippingMode::DISABLED) && !parentExtent.Intersects(childExtent))
+ {
+ return false;
+ }
+ parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(parent->GetParent());
+ }
+
+ return true;
+}
+
+Dali::Accessibility::States ControlAccessible::CalculateStates()
+{
+ Dali::Actor self = Self();
+ Dali::Accessibility::States state;
+ state[Dali::Accessibility::State::FOCUSABLE] = self.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE);
+ state[Dali::Accessibility::State::FOCUSED] = Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor() == self;
+
+ if(self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType() == Dali::Property::NONE)
+ {
+ state[Dali::Accessibility::State::HIGHLIGHTABLE] = false;
+ }
+ else
+ {
+ state[Dali::Accessibility::State::HIGHLIGHTABLE] = self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get<bool>();
+ }
+
+ state[Dali::Accessibility::State::HIGHLIGHTED] = GetCurrentlyHighlightedActor() == self;
+ state[Dali::Accessibility::State::ENABLED] = true;
+ state[Dali::Accessibility::State::SENSITIVE] = true;
+ state[Dali::Accessibility::State::VISIBLE] = self.GetProperty<bool>(Actor::Property::VISIBLE);
+
+ if(mIsModal)
+ {
+ state[Dali::Accessibility::State::MODAL] = true;
+ }
+ state[Dali::Accessibility::State::SHOWING] = IsShowing();
+ state[Dali::Accessibility::State::DEFUNCT] = !self.GetProperty(Dali::DevelActor::Property::CONNECTED_TO_SCENE).Get<bool>();
+ return state;
+}
+
+Dali::Accessibility::States ControlAccessible::GetStates()
+{
+ return CalculateStates();
+}
+
+Dali::Accessibility::Attributes ControlAccessible::GetAttributes() const
+{
+ std::unordered_map<std::string, std::string> attributeMap;
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+ auto attribute = control.GetProperty(Dali::Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES);
+ auto map = attribute.GetMap();
+
+ if(map)
+ {
+ auto mapSize = map->Count();
+
+ for(unsigned int i = 0; i < mapSize; i++)
+ {
+ auto mapKey = map->GetKeyAt(i);
+ if(mapKey.type == Dali::Property::Key::STRING)
+ {
+ std::string mapValue;
+ if(map->GetValue(i).Get(mapValue))
+ {
+ attributeMap.emplace(std::move(mapKey.stringKey), std::move(mapValue));
+ }
+ }
+ }
+ }
+
+ return attributeMap;
+}
+
+Dali::Accessibility::ComponentLayer ControlAccessible::GetLayer() const
+{
+ return Dali::Accessibility::ComponentLayer::WINDOW;
+}
+
+Dali::Rect<> ControlAccessible::GetExtents(Dali::Accessibility::CoordinateType type) const
+{
+ Dali::Actor self = Self();
+
+ Vector2 screenPosition = self.GetProperty(Dali::DevelActor::Property::SCREEN_POSITION).Get<Vector2>();
+ auto size = self.GetCurrentProperty<Vector3>(Actor::Property::SIZE) * self.GetCurrentProperty<Vector3>(Actor::Property::WORLD_SCALE);
+ bool positionUsesAnchorPoint = self.GetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT).Get<bool>();
+ Vector3 anchorPointOffSet = size * (positionUsesAnchorPoint ? self.GetCurrentProperty<Vector3>(Actor::Property::ANCHOR_POINT) : AnchorPoint::TOP_LEFT);
+ Vector2 position = Vector2((screenPosition.x - anchorPointOffSet.x), (screenPosition.y - anchorPointOffSet.y));
+
+ if(type == Dali::Accessibility::CoordinateType::WINDOW)
+ {
+ return {position.x, position.y, size.x, size.y};
+ }
+ else // Dali::Accessibility::CoordinateType::SCREEN
+ {
+ auto window = Dali::DevelWindow::Get(self);
+ auto windowPosition = window.GetPosition();
+ return {position.x + windowPosition.GetX(), position.y + windowPosition.GetY(), size.x, size.y};
+ }
+}
+
+int16_t ControlAccessible::GetMdiZOrder() const
+{
+ return 0;
+}
+
+double ControlAccessible::GetAlpha() const
+{
+ return 0;
+}
+
+bool ControlAccessible::GrabFocus()
+{
+ return Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor(Self());
+}
+
+void ControlAccessible::ScrollToSelf()
+{
+ auto* child = this;
+ auto* parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(child->GetParent());
+
+ while (parent)
+ {
+ if (parent->IsScrollable())
+ {
+ parent->ScrollToChild(child->Self());
+ }
+
+ parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(parent->GetParent());
+ }
+}
+
+void ControlAccessible::RegisterPositionPropertyNotification()
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+ controlImpl.RegisterAccessibilityPositionPropertyNotification();
+}
+
+void ControlAccessible::UnregisterPositionPropertyNotification()
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+ controlImpl.UnregisterAccessibilityPositionPropertyNotification();
+}
+
+bool ControlAccessible::GrabHighlight()
+{
+ Dali::Actor self = Self();
+ auto oldHighlightedActor = GetCurrentlyHighlightedActor();
+
+ if(!Dali::Accessibility::IsUp())
+ {
+ return false;
+ }
+
+ if(self == oldHighlightedActor)
+ {
+ return true;
+ }
+
+ // Clear the old highlight.
+ if(oldHighlightedActor)
+ {
+ auto oldHighlightObject = dynamic_cast<Dali::Accessibility::Component*>(Internal::Control::Impl::GetAccessibilityObject(oldHighlightedActor));
+ if(oldHighlightObject)
+ {
+ oldHighlightObject->ClearHighlight();
+ }
+ }
+
+ auto highlight = GetHighlightActor();
+ if(!highlight)
+ {
+ highlight = CreateHighlightIndicatorActor();
+ SetHighlightActor(highlight);
+ }
+
+ highlight.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ highlight.SetProperty(Actor::Property::POSITION_Z, 1.0f);
+ highlight.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f));
+
+ // Need to set resize policy again, to update SIZE property which is set by
+ // NUIViewAccessible. The highlight could move from NUIViewAccessible to
+ // ControlAccessible. In this case, highlight has incorrect size.
+ highlight.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
+
+ // Remember the highlight actor, so that when the default is changed with
+ // SetHighlightActor(), the currently displayed highlight can still be cleared.
+ mCurrentHighlightActor = highlight;
+ ScrollToSelf();
+ self.Add(highlight);
+ SetCurrentlyHighlightedActor(self);
+ EmitHighlighted(true);
+ RegisterPositionPropertyNotification();
+
+ return true;
+}
+
+bool ControlAccessible::ClearHighlight()
+{
+ Dali::Actor self = Self();
+
+ if(!Dali::Accessibility::IsUp())
+ {
+ return false;
+ }
+
+ if(GetCurrentlyHighlightedActor() == self)
+ {
+ UnregisterPositionPropertyNotification();
+ self.Remove(mCurrentHighlightActor.GetHandle());
+ mCurrentHighlightActor = {};
+ SetCurrentlyHighlightedActor({});
+ EmitHighlighted(false);
+ return true;
+ }
+ return false;
+}
+
+std::string ControlAccessible::GetActionName(size_t index) const
+{
+ if(index >= GetActionCount())
+ {
+ return {};
+ }
+
+ Dali::TypeInfo type;
+ Self().GetTypeInfo(type);
+ DALI_ASSERT_ALWAYS(type && "no TypeInfo object");
+ return type.GetActionName(index);
+}
+
+std::string ControlAccessible::GetLocalizedActionName(size_t index) const
+{
+ return GetLocaleText(GetActionName(index));
+}
+
+std::string ControlAccessible::GetActionDescription(size_t index) const
+{
+ return {};
+}
+
+size_t ControlAccessible::GetActionCount() const
+{
+ Dali::TypeInfo type;
+ Self().GetTypeInfo(type);
+ DALI_ASSERT_ALWAYS(type && "no TypeInfo object");
+ return type.GetActionCount();
+}
+
+std::string ControlAccessible::GetActionKeyBinding(size_t index) const
+{
+ return {};
+}
+
+bool ControlAccessible::DoAction(size_t index)
+{
+ std::string actionName = GetActionName(index);
+ return Self().DoAction(actionName, {});
+}
+
+bool ControlAccessible::DoAction(const std::string& name)
+{
+ return Self().DoAction(name, {});
+}
+
+bool ControlAccessible::DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo)
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+
+ if(!controlImpl.mAccessibilityDoGestureSignal.Empty())
+ {
+ auto ret = std::make_pair(gestureInfo, false);
+ controlImpl.mAccessibilityDoGestureSignal.Emit(ret);
+ return ret.second;
+ }
+
+ return false;
+}
+
+std::vector<Dali::Accessibility::Relation> ControlAccessible::GetRelationSet()
+{
+ auto control = Dali::Toolkit::Control::DownCast(Self());
+
+ Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control);
+ Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl);
+
+ std::vector<Dali::Accessibility::Relation> ret;
+
+ for(auto& relation : controlImpl.mAccessibilityRelations)
+ {
+ auto& targets = relation.second;
+
+ ret.emplace_back(Accessibility::Relation{relation.first, {}});
+
+ // Map every Accessible* to its Address
+ std::transform(targets.begin(), targets.end(), std::back_inserter(ret.back().targets), [](auto* x) {
+ return x->GetAddress();
+ });
+ }
+
+ return ret;
+}
+
+Dali::Actor ControlAccessible::GetInternalActor()
+{
+ return Dali::Actor{};
+}
+
+bool ControlAccessible::ScrollToChild(Actor child)
+{
+ return false;
+}
+
+Dali::Property::Index ControlAccessible::GetNamePropertyIndex()
+{
+ return Actor::Property::NAME;
+}
+
+Dali::Property::Index ControlAccessible::GetDescriptionPropertyIndex()
+{
+ return Dali::Property::INVALID_INDEX;
+}
+
+void ControlAccessible::SetLastPosition(Vector2 position)
+{
+ mLastPosition = position;
+}
+
+Vector2 ControlAccessible::GetLastPosition() const
+{
+ return mLastPosition;
+}
+
+} // namespace Dali::Toolkit::DevelControl
--- /dev/null
+#ifndef DALI_TOOLKIT_CONTROL_ACCESSIBLE_H
+#define DALI_TOOLKIT_CONTROL_ACCESSIBLE_H
+
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/accessibility.h>
+#include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/atspi-interfaces/accessible.h>
+#include <dali/devel-api/atspi-interfaces/action.h>
+#include <dali/devel-api/atspi-interfaces/collection.h>
+#include <dali/devel-api/atspi-interfaces/component.h>
+#include <dali/public-api/object/weak-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/dali-toolkit-common.h>
+
+namespace Dali::Toolkit::DevelControl {
+
+/**
+ * @brief Represents the Accessible object for Dali::Toolkit::Control and derived classes
+ *
+ * You can create a derived class (and register it using SetAccessibilityConstructor)
+ * in order to customize Accessibility for a given control.
+ *
+ * @see Dali::Toolkit::DevelControl::SetAccessibilityConstructor
+ * @see Dali::Accessibility::Accessible
+ * @see Dali::Accessibility::Component
+ * @see Dali::Accessibility::Collection
+ * @see Dali::Accessibility::Action
+ * @see Dali::Accessibility::Value
+ * @see Dali::Accessibility::Text
+ * @see Dali::Accessibility::EditableText
+ */
+struct DALI_TOOLKIT_API ControlAccessible : public virtual Dali::Accessibility::Accessible,
+ public virtual Dali::Accessibility::Component,
+ public virtual Dali::Accessibility::Collection,
+ public virtual Dali::Accessibility::Action
+{
+protected:
+ Vector2 mLastPosition{0.0f, 0.0f};
+ Dali::WeakHandle<Dali::Actor> mSelf;
+ Dali::WeakHandle<Dali::Actor> mCurrentHighlightActor;
+ bool mIsModal = false;
+ bool mIsRoot = false;
+
+ Dali::Actor Self() const
+ {
+ auto handle = mSelf.GetHandle();
+
+ // Control::Impl holds a std::unique_ptr to the Accessible object,
+ // so that one does not outlive the other.
+ DALI_ASSERT_ALWAYS(handle);
+
+ return handle;
+ }
+
+ void ScrollToSelf();
+
+ /**
+ * @brief Register property notification to check highlighted object position
+ */
+ void RegisterPositionPropertyNotification();
+
+ /**
+ * @brief Remove property notification added by RegisterPropertyNotification
+ */
+ void UnregisterPositionPropertyNotification();
+
+ /**
+ * @brief Check if the actor is showing
+ * @return True if the actor is showing
+ */
+ bool IsShowing();
+
+public:
+ ControlAccessible(Dali::Actor self, Dali::Accessibility::Role role, bool modal = false);
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetName()
+ */
+ std::string GetName() const override;
+
+ /**
+ * @brief Returns the actor's name in the absence of ACCESSIBILITY_NAME property
+ */
+ virtual std::string GetNameRaw() const;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetDescription()
+ */
+ std::string GetDescription() const override;
+
+ /**
+ * @brief Returns the actor's description in the absence of ACCESSIBILITY_DESCRIPTION property
+ */
+ virtual std::string GetDescriptionRaw() const;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetParent()
+ */
+ Dali::Accessibility::Accessible* GetParent() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetChildCount()
+ */
+ size_t GetChildCount() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetChildAtIndex()
+ */
+ Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetIndexInParent()
+ */
+ size_t GetIndexInParent() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetRole()
+ */
+ Dali::Accessibility::Role GetRole() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetLocalizedRoleName()
+ */
+ std::string GetLocalizedRoleName() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetStates()
+ */
+ Dali::Accessibility::States GetStates() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetAttributes()
+ */
+ Dali::Accessibility::Attributes GetAttributes() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GetExtents()
+ */
+ Dali::Rect<> GetExtents(Accessibility::CoordinateType type) const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GetLayer()
+ */
+ Dali::Accessibility::ComponentLayer GetLayer() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GetMdiZOrder()
+ */
+ int16_t GetMdiZOrder() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GrabFocus()
+ */
+ bool GrabFocus() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GetAlpha()
+ */
+ double GetAlpha() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::GrabHighlight()
+ */
+ bool GrabHighlight() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Component::ClearHighlight()
+ */
+ bool ClearHighlight() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::GetActionName()
+ */
+ std::string GetActionName(size_t index) const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::GetLocalizedActionName()
+ */
+ std::string GetLocalizedActionName(size_t index) const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::GetActionDescription()
+ */
+ std::string GetActionDescription(size_t index) const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::GetActionCount()
+ */
+ size_t GetActionCount() const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::GetActionKeyBinding()
+ */
+ std::string GetActionKeyBinding(size_t index) const override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::DoAction(std::size_t)
+ */
+ bool DoAction(size_t index) override;
+
+ /**
+ * @copydoc Dali::Accessibility::Action::DoAction(const std::string&)
+ */
+ bool DoAction(const std::string& name) override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::DoGesture()
+ */
+ bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetRelationSet()
+ */
+ std::vector<Dali::Accessibility::Relation> GetRelationSet() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetInternalActor()
+ */
+ Dali::Actor GetInternalActor() override;
+
+ /**
+ * @copydoc Dali::Accessibility::Accessible::GetStates()
+ */
+ virtual Dali::Accessibility::States CalculateStates();
+
+ /**
+ * @brief Makes sure that a given child (descendant) of this container (e.g. ItemView) is visible
+ * @return false if scrolling is not supported or child is already visible
+ */
+ virtual bool ScrollToChild(Actor child);
+
+ /**
+ * @brief Returns the index of the property that represents this actor's name
+ */
+ virtual Dali::Property::Index GetNamePropertyIndex();
+
+ /**
+ * @brief Returns the index of the property that represents this actor's description
+ */
+ virtual Dali::Property::Index GetDescriptionPropertyIndex();
+
+ /**
+ * @brief Sets last object position
+ * @param[in] position Last object position
+ */
+ void SetLastPosition(Vector2 position);
+
+ /**
+ * @brief Gets last object position
+ * @return The Last object position
+ */
+ Vector2 GetLastPosition() const;
+};
+
+} // namespace Dali::Toolkit::DevelControl
+
+#endif // DALI_TOOLKIT_CONTROL_ACCESSIBLE_H
#include <dali/public-api/animation/time-period.h>
// INTERNAL INCLUDES
-#include <dali-toolkit/devel-api/controls/accessible-impl.h>
+#include <dali-toolkit/devel-api/controls/control-accessible.h>
#include <dali-toolkit/devel-api/visual-factory/visual-base.h>
#include <dali-toolkit/public-api/controls/control.h>
* @code
* SetAccessibilityConstructor( []( Dali::Actor actor ) {
return std::unique_ptr< Dali::Accessibility::Accessible >(
- new AccessibleImpl( actor, Dali::Accessibility::Role::DIALOG, true ) );
+ new ControlAccessible( actor, Dali::Accessibility::Role::DIALOG, true ) );
} );
* @endcode
*
${devel_api_src_dir}/builder/builder.cpp
${devel_api_src_dir}/builder/json-parser.cpp
${devel_api_src_dir}/builder/tree-node.cpp
- ${devel_api_src_dir}/controls/accessible-impl.cpp
${devel_api_src_dir}/controls/canvas-view/canvas-view.cpp
+ ${devel_api_src_dir}/controls/control-accessible.cpp
${devel_api_src_dir}/controls/control-devel.cpp
${devel_api_src_dir}/controls/control-wrapper.cpp
${devel_api_src_dir}/controls/control-wrapper-impl.cpp
)
SET( devel_api_controls_header_files
- ${devel_api_src_dir}/controls/accessible-impl.h
${devel_api_src_dir}/controls/canvas-view/canvas-view.h
+ ${devel_api_src_dir}/controls/control-accessible.h
${devel_api_src_dir}/controls/control-depth-index-ranges.h
${devel_api_src_dir}/controls/control-devel.h
${devel_api_src_dir}/controls/control-wrapper.h
{
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::ANIMATION));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::ANIMATION));
});
}
return mForegroundPadding;
}
-std::string Button::AccessibleImpl::GetNameRaw()
+std::string Button::AccessibleImpl::GetNameRaw() const
{
std::string labelText;
auto slf = Toolkit::Button::DownCast(Self());
Dali::Accessibility::States Button::AccessibleImpl::CalculateStates()
{
- auto tmp = DevelControl::AccessibleImpl::CalculateStates();
+ auto tmp = DevelControl::ControlAccessible::CalculateStates();
tmp[Dali::Accessibility::State::SELECTABLE] = true;
auto slf = Toolkit::Button::DownCast(Self());
tmp[Dali::Accessibility::State::ENABLED] = !slf.GetProperty<bool>(Toolkit::Button::Property::DISABLED);
bool mClickActionPerforming; ///< Used to manage signal emissions during action
protected:
- struct AccessibleImpl : public DevelControl::AccessibleImpl
+ struct AccessibleImpl : public DevelControl::ControlAccessible
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
Dali::Accessibility::States CalculateStates() override;
- std::string GetNameRaw() override;
+ std::string GetNameRaw() const override;
Property::Index GetNamePropertyIndex() override;
};
};
return states;
}
-std::string ToggleButton::AccessibleImpl::GetDescriptionRaw()
+std::string ToggleButton::AccessibleImpl::GetDescriptionRaw() const
{
auto button = Toolkit::ToggleButton::DownCast(Self());
auto index = button.GetProperty<int>(Toolkit::ToggleButton::Property::CURRENT_STATE_INDEX);
using Button::AccessibleImpl::AccessibleImpl;
Dali::Accessibility::States CalculateStates() override;
- std::string GetDescriptionRaw() override;
+ std::string GetDescriptionRaw() const override;
Property::Index GetDescriptionPropertyIndex() override;
};
void OnStateChange(State newState) override;
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::IMAGE));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::IMAGE));
});
Adaptor::Get().RegisterProcessor(*this, true);
}
}
-Dali::Rect<> GetShowingGeometry(Dali::Rect<> rect, Dali::Toolkit::DevelControl::AccessibleImpl* accessibleImpl)
+Dali::Rect<> GetShowingGeometry(Dali::Rect<> rect, Dali::Toolkit::DevelControl::ControlAccessible* accessible)
{
Rect<> parentRect;
Vector2 currentPosition;
- auto parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(accessibleImpl->GetParent());
+ auto parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(accessible->GetParent());
while(parent)
{
return rect;
}
- parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(parent->GetParent());
+ parent = dynamic_cast<Toolkit::DevelControl::ControlAccessible*>(parent->GetParent());
}
return rect;
});
mAccessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr<Dali::Accessibility::Accessible> {
- return std::unique_ptr<Dali::Accessibility::Accessible>(new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::UNKNOWN));
+ return std::unique_ptr<Dali::Accessibility::Accessible>(new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::UNKNOWN));
};
}
void Control::Impl::CheckHighlightedObjectGeometry()
{
- auto accessibleImpl = dynamic_cast<Dali::Toolkit::DevelControl::AccessibleImpl*>(mAccessibilityObject.get());
- if(!accessibleImpl)
+ auto accessible = dynamic_cast<Dali::Toolkit::DevelControl::ControlAccessible*>(mAccessibilityObject.get());
+ if(!accessible)
{
- DALI_LOG_ERROR("accessibleImpl is not a pointer to a DevelControl::AccessibleImpl type");
+ DALI_LOG_ERROR("accessible is not a pointer to a DevelControl::ControlAccessible type");
return;
}
- auto lastPosition = accessibleImpl->GetLastPosition();
- auto accessibleRect = accessibleImpl->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
- auto rect = GetShowingGeometry(accessibleRect, accessibleImpl);
+ auto lastPosition = accessible->GetLastPosition();
+ auto accessibleRect = accessible->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
+ auto rect = GetShowingGeometry(accessibleRect, accessible);
switch(mAccessibilityLastScreenRelativeMoveType)
{
}
}
- accessibleImpl->SetLastPosition(Vector2(accessibleRect.x, accessibleRect.y));
+ accessible->SetLastPosition(Vector2(accessibleRect.x, accessibleRect.y));
}
void Control::Impl::RegisterAccessibilityPositionPropertyNotification()
*/
class Control::Impl : public ConnectionTracker, public Visual::EventObserver
{
- friend class Toolkit::DevelControl::AccessibleImpl;
+ friend class Toolkit::DevelControl::ControlAccessible;
public:
/**
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::IMAGE));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::IMAGE));
});
}
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::IMAGE));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::IMAGE));
});
}
{
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::PAGE_TAB_LIST));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::PAGE_TAB_LIST));
});
}
}
}
-std::string Popup::AccessibleImpl::GetNameRaw()
+std::string Popup::AccessibleImpl::GetNameRaw() const
{
auto popup = Toolkit::Popup::DownCast(Self());
std::string title;
Dali::Accessibility::States Popup::AccessibleImpl::CalculateStates()
{
- auto states = DevelControl::AccessibleImpl::CalculateStates();
+ auto states = DevelControl::ControlAccessible::CalculateStates();
auto popup = Toolkit::Popup::DownCast(Self());
auto displayState = popup.GetProperty<std::string>(Toolkit::Popup::Property::DISPLAY_STATE);
static Property::Value GetProperty(BaseObject* object, Property::Index propertyIndex);
protected:
- struct AccessibleImpl : public DevelControl::AccessibleImpl
+ struct AccessibleImpl : public DevelControl::ControlAccessible
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
- std::string GetNameRaw() override;
+ std::string GetNameRaw() const override;
Dali::Accessibility::States CalculateStates() override;
};
}
}
-double ProgressBar::AccessibleImpl::GetMinimum()
+double ProgressBar::AccessibleImpl::GetMinimum() const
{
return DEFAULT_LOWER_BOUND;
}
-double ProgressBar::AccessibleImpl::GetCurrent()
+double ProgressBar::AccessibleImpl::GetCurrent() const
{
auto self = Toolkit::ProgressBar::DownCast(Self());
return self.GetProperty(Toolkit::ProgressBar::Property::PROGRESS_VALUE).Get<float>();
}
-double ProgressBar::AccessibleImpl::GetMaximum()
+double ProgressBar::AccessibleImpl::GetMaximum() const
{
return DEFAULT_UPPER_BOUND;
}
return true;
}
-double ProgressBar::AccessibleImpl::GetMinimumIncrement()
+double ProgressBar::AccessibleImpl::GetMinimumIncrement() const
{
return 0.0;
}
Property::Map mSecondaryProgressVisualMap; ///< To backup visual properties when switching determinate/indeterminate.
protected:
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::Value
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
- double GetMinimum() override;
- double GetCurrent() override;
- double GetMaximum() override;
+ using DevelControl::ControlAccessible::ControlAccessible;
+
+ double GetMinimum() const override;
+ double GetCurrent() const override;
+ double GetMaximum() const override;
bool SetCurrent(double) override;
- double GetMinimumIncrement() override;
+ double GetMinimumIncrement() const override;
};
};
return handle;
}
-double ScrollBar::AccessibleImpl::GetMinimum()
+double ScrollBar::AccessibleImpl::GetMinimum() const
{
auto self = Toolkit::ScrollBar::DownCast(Self());
Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(self).mPropertyMinScrollPosition) : 0.0f;
}
-double ScrollBar::AccessibleImpl::GetCurrent()
+double ScrollBar::AccessibleImpl::GetCurrent() const
{
auto self = Toolkit::ScrollBar::DownCast(Self());
Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(self).mPropertyScrollPosition) : 0.0f;
}
-double ScrollBar::AccessibleImpl::GetMaximum()
+double ScrollBar::AccessibleImpl::GetMaximum() const
{
auto self = Toolkit::ScrollBar::DownCast(Self());
Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
return true;
}
-double ScrollBar::AccessibleImpl::GetMinimumIncrement()
+double ScrollBar::AccessibleImpl::GetMinimumIncrement() const
{
return 1.0;
}
bool mIndicatorFirstShow : 1; ///< True if the indicator has never been shown
protected:
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::Value
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
- double GetMinimum() override;
- double GetCurrent() override;
- double GetMaximum() override;
+ using DevelControl::ControlAccessible::ControlAccessible;
+
+ double GetMinimum() const override;
+ double GetCurrent() const override;
+ double GetMaximum() const override;
bool SetCurrent(double) override;
- double GetMinimumIncrement() override;
+ double GetMinimumIncrement() const override;
};
};
{
}
-bool Scrollable::AccessibleImpl::IsScrollable()
+bool Scrollable::AccessibleImpl::IsScrollable() const
{
return true;
}
virtual void SetOvershootSize(const Vector2& size) = 0;
protected: // From Control
- struct AccessibleImpl : public DevelControl::AccessibleImpl
+ struct AccessibleImpl : public DevelControl::ControlAccessible
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
- bool IsScrollable() override;
+ bool IsScrollable() const override;
};
/**
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
return value;
}
-double Slider::AccessibleImpl::GetMinimum()
+double Slider::AccessibleImpl::GetMinimum() const
{
auto self = Toolkit::Slider::DownCast(Self());
return self.GetProperty(Toolkit::Slider::Property::LOWER_BOUND).Get<float>();
}
-double Slider::AccessibleImpl::GetCurrent()
+double Slider::AccessibleImpl::GetCurrent() const
{
auto self = Toolkit::Slider::DownCast(Self());
return self.GetProperty(Toolkit::Slider::Property::VALUE).Get<float>();
}
-double Slider::AccessibleImpl::GetMaximum()
+double Slider::AccessibleImpl::GetMaximum() const
{
auto self = Toolkit::Slider::DownCast(Self());
return self.GetProperty(Toolkit::Slider::Property::UPPER_BOUND).Get<float>();
return true;
}
-double Slider::AccessibleImpl::GetMinimumIncrement()
+double Slider::AccessibleImpl::GetMinimumIncrement() const
{
auto self = Toolkit::Slider::DownCast(Self());
mSnapToMarks : 1; ///< Turn on or off snapping to marks
protected:
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::Value
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
- double GetMinimum() override;
- double GetCurrent() override;
- double GetMaximum() override;
+ using DevelControl::ControlAccessible::ControlAccessible;
+
+ double GetMinimum() const override;
+ double GetCurrent() const override;
+ double GetMaximum() const override;
bool SetCurrent(double) override;
- double GetMinimumIncrement() override;
+ double GetMinimumIncrement() const override;
};
};
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::FILLER));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER));
});
}
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::TABLE));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::TABLE));
});
}
/**
* @brief This structure is to connect TextAnchor with Accessible functions.
*/
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::Hyperlink
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
/**
* @copydoc Dali::Accessibility::Hyperlink::GetEndIndex()
*/
}
}
-std::string TextEditor::AccessibleImpl::GetName()
+std::string TextEditor::AccessibleImpl::GetName() const
{
auto self = Toolkit::TextEditor::DownCast(Self());
return self.GetProperty(Toolkit::TextEditor::Property::TEXT).Get<std::string>();
}
-std::string TextEditor::AccessibleImpl::GetText(size_t startOffset, size_t endOffset)
+std::string TextEditor::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) const
{
if(endOffset <= startOffset)
{
return text.substr(startOffset, endOffset - startOffset);
}
-size_t TextEditor::AccessibleImpl::GetCharacterCount()
+size_t TextEditor::AccessibleImpl::GetCharacterCount() const
{
auto self = Toolkit::TextEditor::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextEditor::Property::TEXT).Get<std::string>();
return text.size();
}
-size_t TextEditor::AccessibleImpl::GetCursorOffset()
+size_t TextEditor::AccessibleImpl::GetCursorOffset() const
{
auto slf = Toolkit::TextEditor::DownCast(Self());
return Dali::Toolkit::GetImpl(slf).GetTextController()->GetCursorPosition();
return true;
}
-Dali::Accessibility::Range TextEditor::AccessibleImpl::GetTextAtOffset(size_t offset, Dali::Accessibility::TextBoundary boundary)
+Dali::Accessibility::Range TextEditor::AccessibleImpl::GetTextAtOffset(size_t offset, Dali::Accessibility::TextBoundary boundary) const
{
auto self = Toolkit::TextEditor::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextEditor::Property::TEXT).Get<std::string>();
return range;
}
-Dali::Accessibility::Range TextEditor::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex)
+Dali::Accessibility::Range TextEditor::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) const
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
{
using namespace Dali::Accessibility;
- auto states = DevelControl::AccessibleImpl::CalculateStates();
+ auto states = DevelControl::ControlAccessible::CalculateStates();
states[State::EDITABLE] = true;
states[State::FOCUSABLE] = true;
Toolkit::Control focusControl = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl();
- if(mSelf == focusControl)
+ if(Self() == focusControl)
{
states[State::FOCUSED] = true;
}
/**
* @brief This structure is to connect TextEditor with Accessible functions.
*/
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
- public virtual Dali::Accessibility::Text,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::EditableText,
public virtual Dali::Accessibility::Hypertext
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
/**
* @copydoc Dali::Accessibility::Accessible::GetName()
*/
- std::string GetName() override;
+ std::string GetName() const override;
/**
* @copydoc Dali::Accessibility::Text::GetText()
*/
- std::string GetText(size_t startOffset, size_t endOffset) override;
+ std::string GetText(size_t startOffset, size_t endOffset) const override;
/**
* @copydoc Dali::Accessibility::Text::GetCharacterCount()
*/
- size_t GetCharacterCount() override;
+ size_t GetCharacterCount() const override;
/**
* @copydoc Dali::Accessibility::Text::GetCursorOffset()
*/
- size_t GetCursorOffset() override;
+ size_t GetCursorOffset() const override;
/**
* @copydoc Dali::Accessibility::Text::SetCursorOffset()
/**
* @copydoc Dali::Accessibility::Text::GetTextAtOffset()
*/
- Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) override;
+ Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) const override;
/**
* @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
*/
- Accessibility::Range GetRangeOfSelection(size_t selectionIndex) override;
+ Accessibility::Range GetRangeOfSelection(size_t selectionIndex) const override;
/**
* @copydoc Dali::Accessibility::Text::RemoveSelection()
return mController->GetTextPosition(startIndex, endIndex);
}
-std::string TextField::AccessibleImpl::GetName()
+std::string TextField::AccessibleImpl::GetName() const
{
auto self = Toolkit::TextField::DownCast(Self());
if(IsHiddenInput(self))
return self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
}
-std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOffset)
+std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) const
{
if(endOffset <= startOffset)
{
return text.substr(startOffset, endOffset - startOffset);
}
-size_t TextField::AccessibleImpl::GetCharacterCount()
+size_t TextField::AccessibleImpl::GetCharacterCount() const
{
auto self = Toolkit::TextField::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
return text.size();
}
-size_t TextField::AccessibleImpl::GetCursorOffset()
+size_t TextField::AccessibleImpl::GetCursorOffset() const
{
auto self = Toolkit::TextField::DownCast(Self());
return Dali::Toolkit::GetImpl(self).GetTextController()->GetCursorPosition();
}
Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset(
- size_t offset, Dali::Accessibility::TextBoundary boundary)
+ size_t offset, Dali::Accessibility::TextBoundary boundary) const
{
auto self = Toolkit::TextField::DownCast(Self());
auto range = Dali::Accessibility::Range{};
return range;
}
-Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex)
+Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) const
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
{
using namespace Dali::Accessibility;
- auto states = DevelControl::AccessibleImpl::CalculateStates();
+ auto states = DevelControl::ControlAccessible::CalculateStates();
states[State::EDITABLE] = true;
states[State::FOCUSABLE] = true;
Toolkit::Control focusControl = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl();
- if(mSelf == focusControl)
+ if(Self() == focusControl)
{
states[State::FOCUSED] = true;
}
/**
* @brief This structure is to connect TextField with Accessible functions.
*/
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
- public virtual Dali::Accessibility::Text,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::EditableText,
public virtual Dali::Accessibility::Hypertext
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
/**
* @copydoc Dali::Accessibility::Accessible::GetName()
*/
- std::string GetName() override;
+ std::string GetName() const override;
/**
* @copydoc Dali::Accessibility::Text::GetText()
*/
- std::string GetText(size_t startOffset, size_t endOffset) override;
+ std::string GetText(size_t startOffset, size_t endOffset) const override;
/**
* @copydoc Dali::Accessibility::Text::GetCharacterCount()
*/
- size_t GetCharacterCount() override;
+ size_t GetCharacterCount() const override;
/**
* @copydoc Dali::Accessibility::Text::GetCursorOffset()
*/
- size_t GetCursorOffset() override;
+ size_t GetCursorOffset() const override;
/**
* @copydoc Dali::Accessibility::Text::SetCursorOffset()
/**
* @copydoc Dali::Accessibility::Text::GetTextAtOffset()
*/
- Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) override;
+ Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) const override;
/**
* @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
*/
- Accessibility::Range GetRangeOfSelection(size_t selectionIndex) override;
+ Accessibility::Range GetRangeOfSelection(size_t selectionIndex) const override;
/**
* @copydoc Dali::Accessibility::Text::RemoveSelection()
return mController->GetTextPosition(startIndex, endIndex);
}
-std::string TextLabel::AccessibleImpl::GetNameRaw()
+std::string TextLabel::AccessibleImpl::GetNameRaw() const
{
auto self = Toolkit::TextLabel::DownCast(Self());
return self.GetProperty(Toolkit::TextLabel::Property::TEXT).Get<std::string>();
return Toolkit::TextLabel::Property::TEXT;
}
-std::string TextLabel::AccessibleImpl::GetText(size_t startOffset, size_t endOffset)
+std::string TextLabel::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) const
{
if(endOffset <= startOffset)
{
return text.substr(startOffset, endOffset - startOffset);
}
-size_t TextLabel::AccessibleImpl::GetCharacterCount()
+size_t TextLabel::AccessibleImpl::GetCharacterCount() const
{
auto self = Toolkit::TextLabel::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextLabel::Property::TEXT).Get<std::string>();
return text.size();
}
-size_t TextLabel::AccessibleImpl::GetCursorOffset()
+size_t TextLabel::AccessibleImpl::GetCursorOffset() const
{
return {};
}
return {};
}
-Dali::Accessibility::Range TextLabel::AccessibleImpl::GetTextAtOffset(size_t offset, Dali::Accessibility::TextBoundary boundary)
+Dali::Accessibility::Range TextLabel::AccessibleImpl::GetTextAtOffset(size_t offset, Dali::Accessibility::TextBoundary boundary) const
{
auto self = Toolkit::TextLabel::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextLabel::Property::TEXT).Get<std::string>();
return range;
}
-Dali::Accessibility::Range TextLabel::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex)
+Dali::Accessibility::Range TextLabel::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) const
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
/**
* @brief This structure is to connect TextLabel with Accessible functions.
*/
- struct AccessibleImpl : public DevelControl::AccessibleImpl,
+ struct AccessibleImpl : public DevelControl::ControlAccessible,
public virtual Dali::Accessibility::Text,
public virtual Dali::Accessibility::Hypertext
{
- using DevelControl::AccessibleImpl::AccessibleImpl;
+ using DevelControl::ControlAccessible::ControlAccessible;
/**
* @copydoc Dali::Accessibility::Text::GetText()
*/
- std::string GetText(size_t startOffset, size_t endOffset) override;
+ std::string GetText(size_t startOffset, size_t endOffset) const override;
/**
* @copydoc Dali::Accessibility::Text::GetCharacterCount()
*/
- size_t GetCharacterCount() override;
+ size_t GetCharacterCount() const override;
/**
* @copydoc Dali::Accessibility::Text::GetCursorOffset()
*/
- size_t GetCursorOffset() override;
+ size_t GetCursorOffset() const override;
/**
* @copydoc Dali::Accessibility::Text::SetCursorOffset()
/**
* @copydoc Dali::Accessibility::Text::GetTextAtOffset()
*/
- Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) override;
+ Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) const override;
/**
* @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
*/
- Accessibility::Range GetRangeOfSelection(size_t selectionIndex) override;
+ Accessibility::Range GetRangeOfSelection(size_t selectionIndex) const override;
/**
* @copydoc Dali::Accessibility::Text::RemoveSelection()
/**
* @copydoc Dali::Accessibility::Text::GetNameRaw()
*/
- std::string GetNameRaw() override;
+ std::string GetNameRaw() const override;
/**
* @copydoc Dali::Accessibility::Text::GetNamePropertyIndex()
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::DIALOG, true));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::DIALOG, true));
});
//Enable highightability
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::TOOL_BAR));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::TOOL_BAR));
});
}
DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::TOOL_BAR));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::TOOL_BAR));
});
}
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::VIDEO));
+ new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::VIDEO));
});
//Enable highightability