X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Fdevel-api%2Fcontrols%2Fcontrol-accessible.cpp;h=8788adea9bd07107ddcf76557daeab633e145ecd;hb=aacd99acd8b97834374449f6cbe8f75887604a84;hp=5b9725aca0eb52907dcc02131833cb16a042e3d0;hpb=2f746c0479e119947e13e01a5189654d5ddc7756;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/devel-api/controls/control-accessible.cpp b/dali-toolkit/devel-api/controls/control-accessible.cpp index 5b9725a..8788ade 100644 --- a/dali-toolkit/devel-api/controls/control-accessible.cpp +++ b/dali-toolkit/devel-api/controls/control-accessible.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -25,6 +25,7 @@ #include #include +#include // INTERNAL INCLUDES #include @@ -69,33 +70,6 @@ static Dali::Actor CreateHighlightIndicatorActor() ControlAccessible::ControlAccessible(Dali::Actor self) : ActorAccessible(self) { - auto control = Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl); - - 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.mAccessibilityName.empty())) - { - if(controlImpl.mAccessibilityGetNameSignal.Empty()) - { - Emit(Dali::Accessibility::ObjectPropertyChangeEvent::NAME); - } - } - - if(index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION || (index == GetDescriptionPropertyIndex() && controlImpl.mAccessibilityDescription.empty())) - { - if(controlImpl.mAccessibilityGetDescriptionSignal.Empty()) - { - Emit(Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION); - } - } - }); } std::string ControlAccessible::GetName() const @@ -220,7 +194,7 @@ Dali::Accessibility::States ControlAccessible::CalculateStates() states[State::HIGHLIGHTABLE] = self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE); states[State::HIGHLIGHTED] = GetCurrentlyHighlightedActor() == self; states[State::ENABLED] = true; - states[State::SENSITIVE] = self.GetProperty(Actor::Property::SENSITIVE); + states[State::SENSITIVE] = (Dali::DevelActor::IsHittable(self) && Dali::DevelActor::GetTouchRequired(self)); states[State::VISIBLE] = self.GetProperty(Actor::Property::VISIBLE); states[State::SHOWING] = IsShowing(); states[State::DEFUNCT] = !self.GetProperty(Dali::DevelActor::Property::CONNECTED_TO_SCENE).Get(); @@ -235,36 +209,49 @@ Dali::Accessibility::States ControlAccessible::GetStates() Dali::Accessibility::Attributes ControlAccessible::GetAttributes() const { - std::unordered_map attributeMap; - auto control = Dali::Toolkit::Control::DownCast(Self()); - auto attribute = control.GetProperty(Dali::Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES); - auto map = attribute.GetMap(); + static const std::string automationIdKey = "automationId"; + static const std::string classKey = "class"; - if(map) + Accessibility::Attributes result; + Toolkit::Control control = Toolkit::Control::DownCast(Self()); + Dali::Property::Value property = control.GetProperty(DevelControl::Property::ACCESSIBILITY_ATTRIBUTES); + Dali::Property::Map* attributeMap = property.GetMap(); + std::size_t attributeCount = attributeMap ? attributeMap->Count() : 0U; + + for(std::size_t i = 0; i < attributeCount; i++) { - auto mapSize = map->Count(); + Dali::Property::Key mapKey = attributeMap->GetKeyAt(i); + std::string mapValue; - for(unsigned int i = 0; i < mapSize; i++) + if(mapKey.type == Dali::Property::Key::STRING && attributeMap->GetValue(i).Get(mapValue)) { - 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)); - } - } + result.emplace(std::move(mapKey.stringKey), std::move(mapValue)); } } - auto automationId = control.GetProperty(Dali::Toolkit::DevelControl::Property::AUTOMATION_ID); + auto automationId = control.GetProperty(DevelControl::Property::AUTOMATION_ID); if(!automationId.empty()) { - attributeMap.emplace("automationId", std::move(automationId)); + result.emplace(automationIdKey, std::move(automationId)); + } + + // Add "class" if not present already + if(result.find(classKey) == result.end()) + { + Dali::TypeInfo typeInfo; + Self().GetTypeInfo(typeInfo); + if(typeInfo) + { + const std::string& typeName = typeInfo.GetName(); + + result.emplace(classKey, typeName); + + // Save the 'typeName' so we don't have to calculate it again + DevelControl::AppendAccessibilityAttribute(control, classKey, typeName); + } } - return attributeMap; + return result; } bool ControlAccessible::IsHidden() const @@ -314,6 +301,22 @@ void ControlAccessible::UnregisterPositionPropertyNotification() controlImpl.UnregisterAccessibilityPositionPropertyNotification(); } +void ControlAccessible::RegisterPropertySetSignal() +{ + auto control = Dali::Toolkit::Control::DownCast(Self()); + Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control); + Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl); + controlImpl.RegisterAccessibilityPropertySetSignal(); +} + +void ControlAccessible::UnregisterPropertySetSignal() +{ + auto control = Dali::Toolkit::Control::DownCast(Self()); + Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control); + Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get(internalControl); + controlImpl.UnregisterAccessibilityPropertySetSignal(); +} + bool ControlAccessible::GrabHighlight() { Dali::Actor self = Self(); @@ -363,6 +366,7 @@ bool ControlAccessible::GrabHighlight() SetCurrentlyHighlightedActor(self); EmitHighlighted(true); RegisterPositionPropertyNotification(); + RegisterPropertySetSignal(); return true; } @@ -378,6 +382,7 @@ bool ControlAccessible::ClearHighlight() if(GetCurrentlyHighlightedActor() == self) { + UnregisterPropertySetSignal(); UnregisterPositionPropertyNotification(); self.Remove(mCurrentHighlightActor.GetHandle()); mCurrentHighlightActor = {};