X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcontrol%2Fcontrol-data-impl.cpp;h=0af44fb760b836415aaa7519f5947398fe852f64;hb=646440beeb663fc5efcccadeba73dd46016ed1b3;hp=ff1ca1e0cd8b5dcc29466a1baef47b0797459d37;hpb=f2039d47f9bed8104575da80a2ecf0bb6e37ff8d;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index ff1ca1e..0af44fb 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -222,44 +222,57 @@ static bool DoAction(BaseObject* object, const std::string& actionName, const Pr DALI_ASSERT_ALWAYS(control); - if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED) || - actionName == "activate") + if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED) || actionName == "activate") { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityActivateSignal(control).Empty()) + { DevelControl::AccessibilityActivateSignal(control).Emit(); + } else + { ret = Internal::GetImplementation(control).OnAccessibilityActivated(); + } } else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_SKIPPED)) { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityReadingSkippedSignal(control).Empty()) + { DevelControl::AccessibilityReadingSkippedSignal(control).Emit(); + } } else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_PAUSED)) { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityReadingPausedSignal(control).Empty()) + { DevelControl::AccessibilityReadingPausedSignal(control).Emit(); + } } else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_RESUMED)) { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityReadingResumedSignal(control).Empty()) + { DevelControl::AccessibilityReadingResumedSignal(control).Emit(); + } } else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_CANCELLED)) { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityReadingCancelledSignal(control).Empty()) + { DevelControl::AccessibilityReadingCancelledSignal(control).Emit(); + } } else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_STOPPED)) { // if cast succeeds there is an implementation so no need to check if(!DevelControl::AccessibilityReadingStoppedSignal(control).Empty()) + { DevelControl::AccessibilityReadingStoppedSignal(control).Emit(); + } } else { @@ -414,13 +427,12 @@ const PropertyRegistration Control::Impl::PROPERTY_12(typeRegistration, "rightFo const PropertyRegistration Control::Impl::PROPERTY_13(typeRegistration, "upFocusableActorId", Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); const PropertyRegistration Control::Impl::PROPERTY_14(typeRegistration, "downFocusableActorId", Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); const PropertyRegistration Control::Impl::PROPERTY_15(typeRegistration, "shadow", Toolkit::DevelControl::Property::SHADOW, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_16(typeRegistration, "accessibilityAttributes", Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_17(typeRegistration, "accessibilityName", Toolkit::DevelControl::Property::ACCESSIBILITY_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_18(typeRegistration, "accessibilityDescription", Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_19(typeRegistration, "accessibilityTranslationDomain", Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_20(typeRegistration, "accessibilityRole", Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_21(typeRegistration, "accessibilityHighlightable", Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); -const PropertyRegistration Control::Impl::PROPERTY_22(typeRegistration, "accessibilityAnimated", Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_16(typeRegistration, "accessibilityName", Toolkit::DevelControl::Property::ACCESSIBILITY_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_17(typeRegistration, "accessibilityDescription", Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_18(typeRegistration, "accessibilityTranslationDomain", Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_19(typeRegistration, "accessibilityRole", Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_20(typeRegistration, "accessibilityHighlightable", Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_21(typeRegistration, "accessibilityAttributes", Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); // clang-format on Control::Impl::Impl(Control& controlImpl) @@ -462,14 +474,13 @@ Control::Impl::Impl(Control& controlImpl) return Control::Impl::GetAccessibilityObject(actor); }); - accessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr { - return std::unique_ptr(new AccessibleImpl(actor, - Dali::Accessibility::Role::UNKNOWN)); + mAccessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr { + return std::unique_ptr(new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::UNKNOWN)); }; - size_t len = static_cast(Dali::Accessibility::RelationType::MAX_COUNT); - mAccessibilityRelations.reserve(len); - for(auto i = 0u; i < len; ++i) + size_t length = static_cast(Dali::Accessibility::RelationType::MAX_COUNT); + mAccessibilityRelations.reserve(length); + for(auto i = 0u; i < length; ++i) { mAccessibilityRelations.push_back({}); } @@ -487,7 +498,6 @@ Control::Impl::~Impl() StopObservingVisual(iter->visual); } - AccessibilityDeregister(); // All gesture detectors will be destroyed so no need to disconnect. delete mStartingPinchScale; @@ -960,11 +970,10 @@ void Control::Impl::DoAction(Dali::Property::Index visualIndex, Dali::Property:: } } -void Control::Impl::AppendAccessibilityAttribute(const std::string& key, - const std::string value) +void Control::Impl::AppendAccessibilityAttribute(const std::string& key, const std::string value) { - Property::Value* val = mAccessibilityAttributes.Find(key); - if(val) + Property::Value* checkedValue = mAccessibilityAttributes.Find(key); + if(checkedValue) { mAccessibilityAttributes[key] = Property::Value(value); } @@ -1047,76 +1056,6 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const } break; - case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: - { - std::string name; - if(value.Get(name)) - { - controlImpl.mImpl->mAccessibilityName = name; - controlImpl.mImpl->mAccessibilityNameSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityNameSet = false; - } - } - break; - - case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: - { - std::string txt; - if(value.Get(txt)) - { - controlImpl.mImpl->mAccessibilityDescription = txt; - controlImpl.mImpl->mAccessibilityDescriptionSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityDescriptionSet = false; - } - } - break; - - case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: - { - std::string txt; - if(value.Get(txt)) - { - controlImpl.mImpl->mAccessibilityTranslationDomain = txt; - controlImpl.mImpl->mAccessibilityTranslationDomainSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityTranslationDomainSet = false; - } - } - break; - - case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: - { - bool highlightable; - if(value.Get(highlightable)) - { - controlImpl.mImpl->mAccessibilityHighlightable = highlightable; - controlImpl.mImpl->mAccessibilityHighlightableSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityHighlightableSet = false; - } - } - break; - - case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: - { - Dali::Accessibility::Role val; - if(value.Get(val)) - { - controlImpl.mImpl->mAccessibilityRole = val; - } - } - break; - case Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID: { int focusId; @@ -1226,22 +1165,82 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const break; } - case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: + case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: { - const Property::Map* map = value.GetMap(); - if(map && !map->Empty()) + std::string name; + if(value.Get(name)) { - controlImpl.mImpl->mAccessibilityAttributes = *map; + controlImpl.mImpl->mAccessibilityName = name; + controlImpl.mImpl->mAccessibilityNameSet = true; + } + else + { + controlImpl.mImpl->mAccessibilityNameSet = false; + } + } + break; + + case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: + { + std::string text; + if(value.Get(text)) + { + controlImpl.mImpl->mAccessibilityDescription = text; + controlImpl.mImpl->mAccessibilityDescriptionSet = true; + } + else + { + controlImpl.mImpl->mAccessibilityDescriptionSet = false; } - break; } + break; - case Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED: + case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: { - bool animated; - if(value.Get(animated)) + std::string text; + if(value.Get(text)) + { + controlImpl.mImpl->mAccessibilityTranslationDomain = text; + controlImpl.mImpl->mAccessibilityTranslationDomainSet = true; + } + else { - controlImpl.mImpl->mAccessibilityAnimated = animated; + controlImpl.mImpl->mAccessibilityTranslationDomainSet = false; + } + } + break; + + case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: + { + Dali::Accessibility::Role role; + if(value.Get(role)) + { + controlImpl.mImpl->mAccessibilityRole = role; + } + } + break; + + case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: + { + bool highlightable; + if(value.Get(highlightable)) + { + controlImpl.mImpl->mAccessibilityHighlightable = highlightable; + controlImpl.mImpl->mAccessibilityHighlightableSet = true; + } + else + { + controlImpl.mImpl->mAccessibilityHighlightableSet = false; + } + } + break; + + case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: + { + const Property::Map* map = value.GetMap(); + if(map && !map->Empty()) + { + controlImpl.mImpl->mAccessibilityAttributes = *map; } break; } @@ -1291,48 +1290,6 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i break; } - case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: - { - if(controlImpl.mImpl->mAccessibilityNameSet) - { - value = controlImpl.mImpl->mAccessibilityName; - } - break; - } - - case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: - { - if(controlImpl.mImpl->mAccessibilityDescriptionSet) - { - value = controlImpl.mImpl->mAccessibilityDescription; - } - break; - } - - case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: - { - if(controlImpl.mImpl->mAccessibilityTranslationDomainSet) - { - value = controlImpl.mImpl->mAccessibilityTranslationDomain; - } - break; - } - - case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: - { - if(controlImpl.mImpl->mAccessibilityHighlightableSet) - { - value = controlImpl.mImpl->mAccessibilityHighlightable; - } - break; - } - - case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: - { - value = Property::Value(controlImpl.mImpl->mAccessibilityRole); - break; - } - case Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID: { value = controlImpl.mImpl->mUpFocusableActorId; @@ -1400,15 +1357,51 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i break; } - case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: + case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: { - value = controlImpl.mImpl->mAccessibilityAttributes; + if(controlImpl.mImpl->mAccessibilityNameSet) + { + value = controlImpl.mImpl->mAccessibilityName; + } + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: + { + if(controlImpl.mImpl->mAccessibilityDescriptionSet) + { + value = controlImpl.mImpl->mAccessibilityDescription; + } + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: + { + if(controlImpl.mImpl->mAccessibilityTranslationDomainSet) + { + value = controlImpl.mImpl->mAccessibilityTranslationDomain; + } + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: + { + value = Property::Value(controlImpl.mImpl->mAccessibilityRole); break; } - case Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED: + case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: + { + if(controlImpl.mImpl->mAccessibilityHighlightableSet) + { + value = controlImpl.mImpl->mAccessibilityHighlightable; + } + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: { - value = controlImpl.mImpl->mAccessibilityAnimated; + value = controlImpl.mImpl->mAccessibilityAttributes; break; } } @@ -1419,9 +1412,11 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i void Control::Impl::RemoveAccessibilityAttribute(const std::string& key) { - Property::Value* val = mAccessibilityAttributes.Find(key); - if(val) + Property::Value* value = mAccessibilityAttributes.Find(key); + if(value) + { mAccessibilityAttributes[key] = Property::Value(); + } } void Control::Impl::ClearAccessibilityAttributes() @@ -1431,7 +1426,7 @@ void Control::Impl::ClearAccessibilityAttributes() void Control::Impl::SetAccessibilityReadingInfoType(const Dali::Accessibility::ReadingInfoTypes types) { - std::string value; + std::string value{}; if(types[Dali::Accessibility::ReadingInfoType::NAME]) { value += READING_INFO_TYPE_NAME; @@ -1465,12 +1460,21 @@ void Control::Impl::SetAccessibilityReadingInfoType(const Dali::Accessibility::R Dali::Accessibility::ReadingInfoTypes Control::Impl::GetAccessibilityReadingInfoType() const { - std::string value; + std::string value{}; auto place = mAccessibilityAttributes.Find(READING_INFO_TYPE_ATTRIBUTE_NAME); if(place) { place->Get(value); } + else + { + Dali::Accessibility::ReadingInfoTypes types; + types[Dali::Accessibility::ReadingInfoType::NAME] = true; + types[Dali::Accessibility::ReadingInfoType::ROLE] = true; + types[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = true; + types[Dali::Accessibility::ReadingInfoType::STATE] = true; + return types; + } if(value.empty()) { @@ -1830,6 +1834,78 @@ Dali::Property Control::Impl::GetVisualProperty(Dali::Property::Index index, Dal return Dali::Property(handle, Property::INVALID_INDEX); } +void Control::Impl::MakeVisualTransition(Dali::Animation& animation, Dali::Toolkit::Control source, Dali::Property::Index visualIndex, AlphaFunction alphaFunction, TimePeriod timePeriod) +{ + Dali::Toolkit::Control sourceHandle = Dali::Toolkit::Control::DownCast(source); + Property::Map sourceMap = sourceHandle.GetProperty(visualIndex); + Dali::Toolkit::Control destinationHandle = Dali::Toolkit::Control::DownCast(mControlImpl.Self()); + Property::Map destinationMap = destinationHandle.GetProperty(visualIndex); + + Vector4 mixColor(1.0f, 1.0f, 1.0f, 1.0f); + Vector4 cornerRadius(0.0f, 0.0f, 0.0f, 0.0f); + + if(!destinationMap.Empty()) + { + static auto findValue = [](const Property::Map& map, Property::Index index) -> Vector4 { + Property::Value* propertyValue = map.Find(index); + if(propertyValue) + { + return propertyValue->Get(); + } + return Vector4{}; + }; + + mixColor = findValue(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR); + cornerRadius = findValue(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS); + + if(sourceMap.Empty()) + { + sourceMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR); + sourceMap.Insert(Dali::Toolkit::Visual::Property::MIX_COLOR, Color::TRANSPARENT); + sourceMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); + } + + Vector4 sourceMixColor = findValue(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR); + Vector4 sourceCornerRadius = findValue(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS); + + std::vector properties; + std::vector> values; + + if(Vector3(sourceMixColor) != Vector3(mixColor)) + { + properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::Visual::Property::MIX_COLOR)); + values.push_back(std::make_pair(Vector3(sourceMixColor), Vector3(mixColor))); + } + + if(std::abs(sourceMixColor.a - mixColor.a) > Math::MACHINE_EPSILON_1) + { + properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::Visual::Property::OPACITY)); + values.push_back(std::make_pair(sourceMixColor.a, mixColor.a)); + } + + if(sourceCornerRadius != cornerRadius) + { + properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS)); + values.push_back(std::make_pair(sourceCornerRadius, cornerRadius)); + } + + for(uint32_t i = 0; i < properties.size(); ++i) + { + if(timePeriod.delaySeconds > 0.0f) + { + Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); + initialKeyframes.Add(0.0f, values[i].first); + initialKeyframes.Add(1.0f, values[i].first); + animation.AnimateBetween(properties[i], initialKeyframes, TimePeriod(timePeriod.delaySeconds)); + } + Dali::KeyFrames keyframes = Dali::KeyFrames::New(); + keyframes.Add(0.0f, values[i].first); + keyframes.Add(1.0f, values[i].second); + animation.AnimateBetween(properties[i], keyframes, alphaFunction, timePeriod); + } + } +} + void Control::Impl::EmitResourceReadySignal() { if(!mIsEmittingResourceReadySignal) @@ -1884,456 +1960,27 @@ void Control::Impl::OnIdleCallback() Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject() { - if(!accessibilityObject) - accessibilityObject = accessibilityConstructor(mControlImpl.Self()); - return accessibilityObject.get(); + if(!mAccessibilityObject) + { + mAccessibilityObject = mAccessibilityConstructor(mControlImpl.Self()); + } + return mAccessibilityObject.get(); } Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject(Dali::Actor actor) { if(actor) { - auto q = Dali::Toolkit::Control::DownCast(actor); - if(q) + auto control = Dali::Toolkit::Control::DownCast(actor); + if(control) { - auto q2 = static_cast(&q.GetImplementation()); - return q2->mImpl->GetAccessibilityObject(); + auto controlImpl = static_cast(&control.GetImplementation()); + return controlImpl->mImpl->GetAccessibilityObject(); } } return nullptr; } -Control::Impl::AccessibleImpl::AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal) -: self(self), - modal(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 Control::Impl::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); - - if(!controlImpl.mAccessibilityGetNameSignal.Empty()) - { - std::string ret; - controlImpl.mAccessibilityGetNameSignal.Emit(ret); - return ret; - } - - if(controlImpl.mAccessibilityNameSet) - return controlImpl.mAccessibilityName; - - if(auto raw = GetNameRaw(); !raw.empty()) - return raw; - - return self.GetProperty(Actor::Property::NAME); -} - -std::string Control::Impl::AccessibleImpl::GetNameRaw() -{ - return {}; -} - -std::string Control::Impl::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); - - if(!controlImpl.mAccessibilityGetDescriptionSignal.Empty()) - { - std::string ret; - controlImpl.mAccessibilityGetDescriptionSignal.Emit(ret); - return ret; - } - - if(controlImpl.mAccessibilityDescriptionSet) - return controlImpl.mAccessibilityDescription; - - return GetDescriptionRaw(); -} - -std::string Control::Impl::AccessibleImpl::GetDescriptionRaw() -{ - return ""; -} - -Dali::Accessibility::Accessible* Control::Impl::AccessibleImpl::GetParent() -{ - return Dali::Accessibility::Accessible::Get(self.GetParent()); -} - -size_t Control::Impl::AccessibleImpl::GetChildCount() -{ - return self.GetChildCount(); -} - -Dali::Accessibility::Accessible* Control::Impl::AccessibleImpl::GetChildAtIndex(size_t index) -{ - return Dali::Accessibility::Accessible::Get(self.GetChildAt(static_cast(index))); -} - -size_t Control::Impl::AccessibleImpl::GetIndexInParent() -{ - auto s = self; - auto parent = s.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 c = parent.GetChildAt(i); - if(c == s) - return i; - } - DALI_ASSERT_ALWAYS(false && "object isn't child of it's parent"); - return static_cast(-1); -} - -Dali::Accessibility::Role Control::Impl::AccessibleImpl::GetRole() -{ - return self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE); -} - -Dali::Accessibility::States Control::Impl::AccessibleImpl::CalculateStates() -{ - Dali::Accessibility::States s; - s[Dali::Accessibility::State::FOCUSABLE] = self.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE); - s[Dali::Accessibility::State::FOCUSED] = Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor() == self; - if(self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType() == Property::NONE) - s[Dali::Accessibility::State::HIGHLIGHTABLE] = false; - else - s[Dali::Accessibility::State::HIGHLIGHTABLE] = self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get(); - s[Dali::Accessibility::State::HIGHLIGHTED] = GetCurrentlyHighlightedActor() == self; - s[Dali::Accessibility::State::ENABLED] = true; - s[Dali::Accessibility::State::SENSITIVE] = true; - s[Dali::Accessibility::State::ANIMATED] = self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED).Get(); - s[Dali::Accessibility::State::VISIBLE] = true; - if(modal) - { - s[Dali::Accessibility::State::MODAL] = true; - } - s[Dali::Accessibility::State::SHOWING] = !self.GetProperty(Dali::DevelActor::Property::CULLED).Get() && self.GetCurrentProperty(Actor::Property::VISIBLE); - - s[Dali::Accessibility::State::DEFUNCT] = !self.GetProperty(Dali::DevelActor::Property::CONNECTED_TO_SCENE).Get(); - return s; -} - -Dali::Accessibility::States Control::Impl::AccessibleImpl::GetStates() -{ - return CalculateStates(); -} - -Dali::Accessibility::Attributes Control::Impl::AccessibleImpl::GetAttributes() -{ - std::unordered_map attribute_map; - auto q = Dali::Toolkit::Control::DownCast(self); - auto w = - q.GetProperty(Dali::Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES); - auto z = w.GetMap(); - - if(z) - { - auto map_size = z->Count(); - - for(unsigned int i = 0; i < map_size; i++) - { - auto map_key = z->GetKeyAt(i); - if(map_key.type == Property::Key::STRING) - { - std::string map_value; - if(z->GetValue(i).Get(map_value)) - { - attribute_map.emplace(std::move(map_key.stringKey), - std::move(map_value)); - } - } - } - } - - return attribute_map; -} - -Dali::Accessibility::ComponentLayer Control::Impl::AccessibleImpl::GetLayer() -{ - return Dali::Accessibility::ComponentLayer::WINDOW; -} - -Dali::Rect<> Control::Impl::AccessibleImpl::GetExtents(Dali::Accessibility::CoordType ctype) -{ - Vector2 screenPosition = - self.GetProperty(Dali::DevelActor::Property::SCREEN_POSITION) - .Get(); - auto size = self.GetCurrentProperty(Actor::Property::SIZE) * self.GetCurrentProperty(Actor::Property::WORLD_SCALE); - bool positionUsesAnchorPoint = - self.GetProperty(Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT) - .Get(); - Vector3 anchorPointOffSet = - size * (positionUsesAnchorPoint ? self.GetCurrentProperty(Actor::Property::ANCHOR_POINT) - : AnchorPoint::TOP_LEFT); - Vector2 position = Vector2(screenPosition.x - anchorPointOffSet.x, - screenPosition.y - anchorPointOffSet.y); - - return {position.x, position.y, size.x, size.y}; -} - -int16_t Control::Impl::AccessibleImpl::GetMdiZOrder() -{ - return 0; -} -double Control::Impl::AccessibleImpl::GetAlpha() -{ - return 0; -} - -bool Control::Impl::AccessibleImpl::GrabFocus() -{ - return Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor(self); -} - -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", ""); - actor.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, true); - actor.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false); - - return actor; -} - -bool Control::Impl::AccessibleImpl::GrabHighlight() -{ - auto old = GetCurrentlyHighlightedActor(); - - if(!Dali::Accessibility::IsUp()) - return false; - if(self == old) - return true; - if(old) - { - auto c = dynamic_cast(GetAccessibilityObject(old)); - if(c) - c->ClearHighlight(); - } - auto highlight = GetHighlightActor(); - if(!highlight) - { - highlight = CreateHighlightIndicatorActor(); - SetHighlightActor(highlight); - } - highlight.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); - highlight.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); - highlight.SetProperty(Actor::Property::POSITION_Z, 1.0f); - highlight.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f)); - - EnsureSelfVisible(); - self.Add(highlight); - SetCurrentlyHighlightedActor(self); - EmitHighlighted(true); - - return true; -} - -bool Control::Impl::AccessibleImpl::ClearHighlight() -{ - if(!Dali::Accessibility::IsUp()) - return false; - if(GetCurrentlyHighlightedActor() == self) - { - self.Remove(GetHighlightActor()); - SetCurrentlyHighlightedActor({}); - EmitHighlighted(false); - return true; - } - return false; -} - -std::string Control::Impl::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 Control::Impl::AccessibleImpl::GetLocalizedActionName(size_t index) -{ - // TODO: add localization - return GetActionName(index); -} -std::string Control::Impl::AccessibleImpl::GetActionDescription(size_t index) -{ - return ""; -} -size_t Control::Impl::AccessibleImpl::GetActionCount() -{ - Dali::TypeInfo type; - self.GetTypeInfo(type); - DALI_ASSERT_ALWAYS(type && "no TypeInfo object"); - return type.GetActionCount(); -} -std::string Control::Impl::AccessibleImpl::GetActionKeyBinding(size_t index) -{ - return ""; -} -bool Control::Impl::AccessibleImpl::DoAction(size_t index) -{ - std::string actionName = GetActionName(index); - return self.DoAction(actionName, {}); -} -bool Control::Impl::AccessibleImpl::DoAction(const std::string& name) -{ - return self.DoAction(name, {}); -} - -bool Control::Impl::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 Control::Impl::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 ret; - - auto& v = controlImpl.mAccessibilityRelations; - for(auto i = 0u; i < v.size(); ++i) - { - if(v[i].empty()) - continue; - - ret.emplace_back(Accessibility::Relation{static_cast(i), v[i]}); - } - - return ret; -} - -void Control::Impl::AccessibleImpl::EnsureChildVisible(Actor child) -{ -} - -void Control::Impl::AccessibleImpl::EnsureSelfVisible() -{ - auto parent = dynamic_cast(GetParent()); - if(parent) - { - parent->EnsureChildVisible(self); - } -} - -Property::Index Control::Impl::AccessibleImpl::GetNamePropertyIndex() -{ - return Actor::Property::NAME; -} - -Property::Index Control::Impl::AccessibleImpl::GetDescriptionPropertyIndex() -{ - return Property::INVALID_INDEX; -} - -void Control::Impl::PositionOrSizeChangedCallback(PropertyNotification& p) -{ - auto self = Dali::Actor::DownCast(p.GetTarget()); - if(Dali::Accessibility::IsUp() && !self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED).Get()) - { - auto extents = DevelActor::CalculateScreenExtents(self); - Dali::Accessibility::Accessible::Get(self)->EmitBoundsChanged(extents); - } -} - -void Control::Impl::CulledChangedCallback(PropertyNotification& p) -{ - if(Dali::Accessibility::IsUp()) - { - auto self = Dali::Actor::DownCast(p.GetTarget()); - Dali::Accessibility::Accessible::Get(self)->EmitShowing(!self.GetProperty(DevelActor::Property::CULLED).Get()); - } -} - -void Control::Impl::AccessibilityRegister() -{ - if(!accessibilityNotificationSet) - { - accessibilityNotificationPosition = mControlImpl.Self().AddPropertyNotification(Actor::Property::POSITION, StepCondition(0.01f)); - accessibilityNotificationPosition.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); - accessibilityNotificationPosition.NotifySignal().Connect(&Control::Impl::PositionOrSizeChangedCallback); - - accessibilityNotificationSize = mControlImpl.Self().AddPropertyNotification(Actor::Property::SIZE, StepCondition(0.01f)); - accessibilityNotificationSize.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); - accessibilityNotificationSize.NotifySignal().Connect(&Control::Impl::PositionOrSizeChangedCallback); - - accessibilityNotificationCulled = mControlImpl.Self().AddPropertyNotification(DevelActor::Property::CULLED, LessThanCondition(0.5f)); - accessibilityNotificationCulled.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); - accessibilityNotificationCulled.NotifySignal().Connect(&Control::Impl::CulledChangedCallback); - - accessibilityNotificationSet = true; - } -} - -void Control::Impl::AccessibilityDeregister() -{ - if(accessibilityNotificationSet) - { - accessibilityNotificationPosition = {}; - accessibilityNotificationSize = {}; - accessibilityNotificationCulled = {}; - accessibilityNotificationSet = false; - } -} - } // namespace Internal } // namespace Toolkit