X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcontrol%2Fcontrol-data-impl.cpp;h=0a19706973a5c48d2e39348eece6a661883490b5;hb=d3a278fc71c792d900071194e50d7235caff0811;hp=e3cea9273ccb0787d4e0510c320be4eea56f1015;hpb=70fdb1a1e8e2660c383079ae49bc94fbe14943d1;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 e3cea92..0a19706 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -30,17 +30,18 @@ #include #include #include +#include #include #include #include #include // INTERNAL INCLUDES -#include #include #include #include #include +#include #include #include #include @@ -51,12 +52,12 @@ namespace { -const std::string READING_INFO_TYPE_NAME = "name"; -const std::string READING_INFO_TYPE_ROLE = "role"; -const std::string READING_INFO_TYPE_DESCRIPTION = "description"; -const std::string READING_INFO_TYPE_STATE = "state"; -const std::string READING_INFO_TYPE_ATTRIBUTE_NAME = "reading_info_type"; -const std::string READING_INFO_TYPE_SEPARATOR = "|"; +const char* READING_INFO_TYPE_NAME = "name"; +const char* READING_INFO_TYPE_ROLE = "role"; +const char* READING_INFO_TYPE_DESCRIPTION = "description"; +const char* READING_INFO_TYPE_STATE = "state"; +const char* READING_INFO_TYPE_ATTRIBUTE_NAME = "reading_info_type"; +const char* READING_INFO_TYPE_SEPARATOR = "|"; } // namespace namespace Dali @@ -128,6 +129,38 @@ bool FindVisual(std::string visualName, const RegisteredVisualContainer& visuals return false; } +/** + * Finds visual in given array, returning true if found along with the iterator for that visual as a out parameter + */ +bool FindVisual(const Toolkit::Visual::Base findVisual, const RegisteredVisualContainer& visuals, RegisteredVisualContainer::Iterator& iter) +{ + for(iter = visuals.Begin(); iter != visuals.End(); iter++) + { + Toolkit::Visual::Base visual = (*iter)->visual; + if(visual && visual == findVisual) + { + return true; + } + } + return false; +} + +/** + * Finds internal visual in given array, returning true if found along with the iterator for that visual as a out parameter + */ +bool FindVisual(const Visual::Base& findInternalVisual, const RegisteredVisualContainer& visuals, RegisteredVisualContainer::Iterator& iter) +{ + for(iter = visuals.Begin(); iter != visuals.End(); iter++) + { + Visual::Base& visual = Toolkit::GetImplementation((*iter)->visual); + if((&visual == &findInternalVisual)) + { + return true; + } + } + return false; +} + void FindChangableVisuals(Dictionary& stateVisualsToAdd, Dictionary& stateVisualsToChange, DictionaryKeys& stateVisualsToRemove) @@ -445,6 +478,19 @@ static bool IsShowingGeometryOnScreen(Dali::Rect<> rect) return rect.width > 0 && rect.height > 0; } +Dali::Accessibility::Accessible* ExternalAccessibleGetter(Dali::Actor actor) +{ + auto control = Toolkit::Control::DownCast(actor); + if(!control) + { + return nullptr; + } + + auto& controlImpl = Toolkit::Internal::GetImplementation(control); + + return controlImpl.GetAccessibleObject(); +} + } // unnamed namespace // clang-format off @@ -470,6 +516,9 @@ const PropertyRegistration Control::Impl::PROPERTY_20(typeRegistration, "accessi const PropertyRegistration Control::Impl::PROPERTY_21(typeRegistration, "accessibilityAttributes", Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); const PropertyRegistration Control::Impl::PROPERTY_22(typeRegistration, "dispatchKeyEvents", Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); const PropertyRegistration Control::Impl::PROPERTY_23(typeRegistration, "accessibilityHidden", Toolkit::DevelControl::Property::ACCESSIBILITY_HIDDEN, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_24(typeRegistration, "clockwiseFocusableActorId", Toolkit::DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_25(typeRegistration, "counterClockwiseFocusableActorId", Toolkit::DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_26(typeRegistration, "automationId", Toolkit::DevelControl::Property::AUTOMATION_ID, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); // clang-format on @@ -481,6 +530,8 @@ Control::Impl::Impl(Control& controlImpl) mRightFocusableActorId(-1), mUpFocusableActorId(-1), mDownFocusableActorId(-1), + mClockwiseFocusableActorId(-1), + mCounterClockwiseFocusableActorId(-1), mStyleName(""), mBackgroundColor(Color::TRANSPARENT), mStartingPinchScale(nullptr), @@ -508,14 +559,7 @@ Control::Impl::Impl(Control& controlImpl) mNeedToEmitResourceReady(false), mDispatchKeyEvents(true) { - Dali::Accessibility::Accessible::RegisterExternalAccessibleGetter( - [](Dali::Actor actor) -> Dali::Accessibility::Accessible* { - return Control::Impl::GetAccessibilityObject(actor); - }); - - mAccessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr { - return std::unique_ptr(new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::UNKNOWN)); - }; + Dali::Accessibility::Accessible::RegisterExternalAccessibleGetter(&ExternalAccessibleGetter); } Control::Impl::~Impl() @@ -552,16 +596,10 @@ const Control::Impl& Control::Impl::Get(const Internal::Control& internalControl void Control::Impl::CheckHighlightedObjectGeometry() { - auto accessible = dynamic_cast(mAccessibilityObject.get()); - if(!accessible) - { - DALI_LOG_ERROR("accessible is not a pointer to a DevelControl::ControlAccessible type"); - return; - } - + auto accessible = GetAccessibleObject(); auto lastPosition = accessible->GetLastPosition(); auto accessibleRect = accessible->GetExtents(Dali::Accessibility::CoordinateType::WINDOW); - auto rect = GetShowingGeometry(accessibleRect, accessible); + auto rect = GetShowingGeometry(accessibleRect, accessible); switch(mAccessibilityLastScreenRelativeMoveType) { @@ -575,18 +613,18 @@ void Control::Impl::CheckHighlightedObjectGeometry() } case Dali::Accessibility::ScreenRelativeMoveType::INSIDE: { - if(rect.width < 0 && accessibleRect.x != lastPosition.x) + if(rect.width < 0 && !Dali::Equals(accessibleRect.x, lastPosition.x)) { mAccessibilityLastScreenRelativeMoveType = (accessibleRect.x < lastPosition.x) ? Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_TOP_LEFT : Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_BOTTOM_RIGHT; } - if(rect.height < 0 && accessibleRect.y != lastPosition.y) + if(rect.height < 0 && !Dali::Equals(accessibleRect.y, lastPosition.y)) { mAccessibilityLastScreenRelativeMoveType = (accessibleRect.y < lastPosition.y) ? Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_TOP_LEFT : Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_BOTTOM_RIGHT; } // notify AT-clients on outgoing moves only if(mAccessibilityLastScreenRelativeMoveType != Dali::Accessibility::ScreenRelativeMoveType::INSIDE) { - mAccessibilityObject.get()->EmitMovedOutOfScreen(mAccessibilityLastScreenRelativeMoveType); + accessible->EmitMovedOutOfScreen(mAccessibilityLastScreenRelativeMoveType); } break; } @@ -622,9 +660,9 @@ void Control::Impl::RegisterAccessibilityPositionPropertyNotification() mAccessibilityLastScreenRelativeMoveType = Dali::Accessibility::ScreenRelativeMoveType::OUTSIDE; // recalculate mAccessibilityLastScreenRelativeMoveType accordingly to the initial position CheckHighlightedObjectGeometry(); - mAccessibilityPositionNotification = mControlImpl.Self().AddPropertyNotification(Actor::Property::WORLD_POSITION, StepCondition(1.0f, 1.0f)); + mAccessibilityPositionNotification = mControlImpl.Self().AddPropertyNotification(Actor::Property::WORLD_POSITION, StepCondition(1.0f, 1.0f)); mAccessibilityPositionNotification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); - mAccessibilityPositionNotification.NotifySignal().Connect(this, [this](PropertyNotification&){ CheckHighlightedObjectGeometry(); }); + mAccessibilityPositionNotification.NotifySignal().Connect(this, [this](PropertyNotification&) { CheckHighlightedObjectGeometry(); }); mIsAccessibilityPositionPropertyNotificationSet = true; } @@ -799,7 +837,7 @@ void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& { visualImpl.SetOnScene(self); } - else if(visualImpl.IsResourceReady()) // When not being staged, check if visual already 'ResourceReady' before it was Registered. ( Resource may have been loaded already ) + else if(enabled && visualImpl.IsResourceReady()) // When not being staged, check if visual already 'ResourceReady' before it was Registered. ( Resource may have been loaded already ) { ResourceReady(visualImpl); } @@ -888,6 +926,23 @@ bool Control::Impl::IsVisualEnabled(Property::Index index) const return false; } +void Control::Impl::EnableReadyTransitionOverriden(Toolkit::Visual::Base& visual, bool enable) +{ + DALI_LOG_INFO(gLogFilter, Debug::General, "Control::EnableReadyTransitionOverriden(%p, %s)\n", visual, enable ? "T" : "F"); + + RegisteredVisualContainer::Iterator iter; + if(FindVisual(visual, mVisuals, iter)) + { + if((*iter)->overideReadyTransition == enable) + { + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::EnableReadyTransitionOverriden Visual %s(%p) already %s\n", (*iter)->visual.GetName().c_str(), visual, enable ? "enabled" : "disabled"); + return; + } + + (*iter)->overideReadyTransition = enable; + } +} + void Control::Impl::StopObservingVisual(Toolkit::Visual::Base& visual) { Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); @@ -904,6 +959,17 @@ void Control::Impl::StartObservingVisual(Toolkit::Visual::Base& visual) visualImpl.AddEventObserver(*this); } +void Control::Impl::ResourceReady() +{ + // Emit signal if all enabled visuals registered by the control are ready or there are no visuals. + if(IsResourceReady()) + { + // Reset the flag + mNeedToEmitResourceReady = false; + EmitResourceReadySignal(); + } +} + // Called by a Visual when it's resource is ready void Control::Impl::ResourceReady(Visual::Base& object) { @@ -911,41 +977,36 @@ void Control::Impl::ResourceReady(Visual::Base& object) Actor self = mControlImpl.Self(); + RegisteredVisualContainer::Iterator registeredIter; + // A resource is ready, find resource in the registered visuals container and get its index - for(auto registeredIter = mVisuals.Begin(), end = mVisuals.End(); registeredIter != end; ++registeredIter) + if(!FindVisual(object, mVisuals, registeredIter)) { - Internal::Visual::Base& registeredVisualImpl = Toolkit::GetImplementation((*registeredIter)->visual); + return; + } - if(&object == ®isteredVisualImpl) + RegisteredVisualContainer::Iterator visualToRemoveIter; + // Find visual with the same index in the removal container + // Set if off stage as it's replacement is now ready. + // Remove if from removal list as now removed from stage. + // Set Pending flag on the ready visual to false as now ready. + if(FindVisual((*registeredIter)->index, mRemoveVisuals, visualToRemoveIter)) + { + (*registeredIter)->pending = false; + if(!((*visualToRemoveIter)->overideReadyTransition)) { - RegisteredVisualContainer::Iterator visualToRemoveIter; - // Find visual with the same index in the removal container - // Set if off stage as it's replacement is now ready. - // Remove if from removal list as now removed from stage. - // Set Pending flag on the ready visual to false as now ready. - if(FindVisual((*registeredIter)->index, mRemoveVisuals, visualToRemoveIter)) - { - (*registeredIter)->pending = false; - Toolkit::GetImplementation((*visualToRemoveIter)->visual).SetOffScene(self); - mRemoveVisuals.Erase(visualToRemoveIter); - } - break; + Toolkit::GetImplementation((*visualToRemoveIter)->visual).SetOffScene(self); } + mRemoveVisuals.Erase(visualToRemoveIter); } // A visual is ready so control may need relayouting if staged - if(self.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) - { - mControlImpl.RelayoutRequest(); - } + RelayoutRequest(object); - // Emit signal if all enabled visuals registered by the control are ready. - if(IsResourceReady()) + // Called by a Visual when it's resource is ready + if(((*registeredIter)->enabled)) { - // Reset the flag - mNeedToEmitResourceReady = false; - - EmitResourceReadySignal(); + ResourceReady(); } } @@ -963,6 +1024,14 @@ void Control::Impl::NotifyVisualEvent(Visual::Base& object, Property::Index sign } } +void Control::Impl::RelayoutRequest(Visual::Base& object) +{ + if(mControlImpl.Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE)) + { + mControlImpl.RelayoutRequest(); + } +} + bool Control::Impl::IsResourceReady() const { // Iterate through and check all the enabled visuals are ready @@ -1086,6 +1155,15 @@ void Control::Impl::DoAction(Dali::Property::Index visualIndex, Dali::Property:: } } +void Control::Impl::DoActionExtension(Dali::Property::Index visualIndex, Dali::Property::Index actionId, Dali::Any attributes) +{ + RegisteredVisualContainer::Iterator iter; + if(FindVisual(visualIndex, mVisuals, iter)) + { + Toolkit::GetImplementation((*iter)->visual).DoActionExtension(actionId, attributes); + } +} + void Control::Impl::AppendAccessibilityAttribute(const std::string& key, const std::string value) { Property::Value* checkedValue = mAccessibilityAttributes.Find(key); @@ -1286,45 +1364,30 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const std::string name; if(value.Get(name)) { - controlImpl.mImpl->mAccessibilityName = name; - controlImpl.mImpl->mAccessibilityNameSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityNameSet = false; + controlImpl.mImpl->mAccessibilityName = name; } + break; } - 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; + controlImpl.mImpl->mAccessibilityDescription = text; } + break; } - break; case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: { std::string text; if(value.Get(text)) { - controlImpl.mImpl->mAccessibilityTranslationDomain = text; - controlImpl.mImpl->mAccessibilityTranslationDomainSet = true; - } - else - { - controlImpl.mImpl->mAccessibilityTranslationDomainSet = false; + controlImpl.mImpl->mAccessibilityTranslationDomain = text; } + break; } - break; case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: { @@ -1333,23 +1396,18 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const { controlImpl.mImpl->mAccessibilityRole = role; } + break; } - 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; + controlImpl.mImpl->mAccessibilityHighlightable = highlightable; } + break; } - break; case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: { @@ -1377,6 +1435,41 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const if(value.Get(hidden)) { controlImpl.mImpl->mAccessibilityHidden = hidden; + + auto* accessible = controlImpl.GetAccessibleObject(); + auto* parent = dynamic_cast(accessible->GetParent()); + if(parent) + { + parent->OnChildrenChanged(); + } + } + break; + } + case Toolkit::DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID: + { + int focusId; + if(value.Get(focusId)) + { + controlImpl.mImpl->mClockwiseFocusableActorId = focusId; + } + break; + } + case Toolkit::DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID: + { + int focusId; + if(value.Get(focusId)) + { + controlImpl.mImpl->mCounterClockwiseFocusableActorId = focusId; + } + break; + } + + case Toolkit::DevelControl::Property::AUTOMATION_ID: + { + std::string automationId; + if(value.Get(automationId)) + { + controlImpl.mImpl->mAutomationId = automationId; } break; } @@ -1495,28 +1588,19 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: { - if(controlImpl.mImpl->mAccessibilityNameSet) - { - value = controlImpl.mImpl->mAccessibilityName; - } + value = controlImpl.mImpl->mAccessibilityName; break; } case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: { - if(controlImpl.mImpl->mAccessibilityDescriptionSet) - { - value = controlImpl.mImpl->mAccessibilityDescription; - } + value = controlImpl.mImpl->mAccessibilityDescription; break; } case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: { - if(controlImpl.mImpl->mAccessibilityTranslationDomainSet) - { - value = controlImpl.mImpl->mAccessibilityTranslationDomain; - } + value = controlImpl.mImpl->mAccessibilityTranslationDomain; break; } @@ -1528,10 +1612,7 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: { - if(controlImpl.mImpl->mAccessibilityHighlightableSet) - { - value = controlImpl.mImpl->mAccessibilityHighlightable; - } + value = controlImpl.mImpl->mAccessibilityHighlightable; break; } @@ -1552,6 +1633,24 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i value = controlImpl.mImpl->mAccessibilityHidden; break; } + + case Toolkit::DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID: + { + value = controlImpl.mImpl->mClockwiseFocusableActorId; + break; + } + + case Toolkit::DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID: + { + value = controlImpl.mImpl->mCounterClockwiseFocusableActorId; + break; + } + + case Toolkit::DevelControl::Property::AUTOMATION_ID: + { + value = controlImpl.mImpl->mAutomationId; + break; + } } } @@ -1984,7 +2083,8 @@ Dali::Property Control::Impl::GetVisualProperty(Dali::Property::Index index, Dal void Control::Impl::CreateTransitions(std::vector>& sourceProperties, std::vector>& destinationProperties, - Dali::Toolkit::Control source, Dali::Toolkit::Control destination) + Dali::Toolkit::Control source, + Dali::Toolkit::Control destination) { // Retrieves background properties to be transitioned. Dali::Property::Map backgroundSourcePropertyMap, backgroundDestinationPropertyMap; @@ -2076,27 +2176,14 @@ void Control::Impl::OnIdleCallback() mIdleCallback = nullptr; } -Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject() +Toolkit::DevelControl::ControlAccessible* Control::Impl::GetAccessibleObject() { - if(!mAccessibilityObject) + if(!mAccessibleObject) { - mAccessibilityObject = mAccessibilityConstructor(mControlImpl.Self()); + mAccessibleObject.reset(mControlImpl.CreateAccessibleObject()); } - return mAccessibilityObject.get(); -} -Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject(Dali::Actor actor) -{ - if(actor) - { - auto control = Dali::Toolkit::Control::DownCast(actor); - if(control) - { - auto controlImpl = static_cast(&control.GetImplementation()); - return controlImpl->mImpl->GetAccessibilityObject(); - } - } - return nullptr; + return mAccessibleObject.get(); } } // namespace Internal