X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcontrol%2Fcontrol-data-impl.cpp;h=c1618f3d6d019394d2461aaed2e48fc88155f80b;hp=db346bd60822cf16c39a54bac3ee8254639a3366;hb=36b6c48b03fa926529904947f222aadebbf0c1ff;hpb=fa3f750c6878eb126034d7958458dc3a1f67924f diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index db346bd..c1618f3 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -36,6 +36,7 @@ #include // INTERNAL INCLUDES +#include #include #include #include @@ -410,6 +411,53 @@ void SetVisualsOffScene(const RegisteredVisualContainer& container, Actor parent } } +Dali::Rect<> GetShowingGeometry(Dali::Rect<> rect, Dali::Toolkit::DevelControl::ControlAccessible* accessible) +{ + Rect<> parentRect; + Vector2 currentPosition; + auto parent = dynamic_cast(accessible->GetParent()); + + while(parent) + { + parentRect = parent->GetExtents(Dali::Accessibility::CoordinateType::WINDOW); + + currentPosition.x = rect.x; + currentPosition.y = rect.y; + + rect.x = rect.x > parentRect.x ? rect.x : parentRect.x; + rect.y = rect.y > parentRect.y ? rect.y : parentRect.y; + rect.width = currentPosition.x + rect.width < parentRect.x + parentRect.width ? currentPosition.x + rect.width - rect.x : parentRect.x + parentRect.width - rect.x; + rect.height = currentPosition.y + rect.height < parentRect.y + parentRect.height ? currentPosition.y + rect.height - rect.y : parentRect.y + parentRect.height - rect.y; + + if(rect.width < 0 || rect.height < 0) + { + return rect; + } + + parent = dynamic_cast(parent->GetParent()); + } + + return rect; +} + +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 @@ -433,6 +481,9 @@ const PropertyRegistration Control::Impl::PROPERTY_18(typeRegistration, "accessi 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); +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); + // clang-format on Control::Impl::Impl(Control& controlImpl) @@ -467,23 +518,10 @@ Control::Impl::Impl(Control& controlImpl) mIsKeyboardNavigationSupported(false), mIsKeyboardFocusGroup(false), mIsEmittingResourceReadySignal(false), - mNeedToEmitResourceReady(false) + mNeedToEmitResourceReady(false), + mDispatchKeyEvents(true) { - Dali::Accessibility::Accessible::RegisterControlAccessibilityGetter( - [](Dali::Actor actor) -> Dali::Accessibility::Accessible* { - return Control::Impl::GetAccessibilityObject(actor); - }); - - mAccessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr { - return std::unique_ptr(new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::UNKNOWN)); - }; - - size_t length = static_cast(Dali::Accessibility::RelationType::MAX_COUNT); - mAccessibilityRelations.reserve(length); - for(auto i = 0u; i < length; ++i) - { - mAccessibilityRelations.push_back({}); - } + Dali::Accessibility::Accessible::RegisterExternalAccessibleGetter(&ExternalAccessibleGetter); } Control::Impl::~Impl() @@ -518,6 +556,84 @@ const Control::Impl& Control::Impl::Get(const Internal::Control& internalControl return *internalControl.mImpl; } +void Control::Impl::CheckHighlightedObjectGeometry() +{ + auto accessible = GetAccessibleObject(); + auto lastPosition = accessible->GetLastPosition(); + auto accessibleRect = accessible->GetExtents(Dali::Accessibility::CoordinateType::WINDOW); + auto rect = GetShowingGeometry(accessibleRect, accessible); + + switch(mAccessibilityLastScreenRelativeMoveType) + { + case Dali::Accessibility::ScreenRelativeMoveType::OUTSIDE: + { + if(IsShowingGeometryOnScreen(rect)) + { + mAccessibilityLastScreenRelativeMoveType = Dali::Accessibility::ScreenRelativeMoveType::INSIDE; + } + break; + } + case Dali::Accessibility::ScreenRelativeMoveType::INSIDE: + { + if(rect.width < 0 && 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) + { + 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) + { + accessible->EmitMovedOutOfScreen(mAccessibilityLastScreenRelativeMoveType); + } + break; + } + case Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_TOP_LEFT: + case Dali::Accessibility::ScreenRelativeMoveType::OUTGOING_BOTTOM_RIGHT: + { + if(IsShowingGeometryOnScreen(rect)) + { + mAccessibilityLastScreenRelativeMoveType = Dali::Accessibility::ScreenRelativeMoveType::INSIDE; + } + else + { + mAccessibilityLastScreenRelativeMoveType = Dali::Accessibility::ScreenRelativeMoveType::OUTSIDE; + } + break; + } + default: + { + break; + } + } + + accessible->SetLastPosition(Vector2(accessibleRect.x, accessibleRect.y)); +} + +void Control::Impl::RegisterAccessibilityPositionPropertyNotification() +{ + if(mIsAccessibilityPositionPropertyNotificationSet) + { + return; + } + // set default value until first move of object is detected + 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.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); + mAccessibilityPositionNotification.NotifySignal().Connect(this, [this](PropertyNotification&){ CheckHighlightedObjectGeometry(); }); + mIsAccessibilityPositionPropertyNotificationSet = true; +} + +void Control::Impl::UnregisterAccessibilityPositionPropertyNotification() +{ + mControlImpl.Self().RemovePropertyNotification(mAccessibilityPositionNotification); + mIsAccessibilityPositionPropertyNotificationSet = false; +} + // Gesture Detection Methods void Control::Impl::PinchDetected(Actor actor, const PinchGesture& pinch) { @@ -1170,45 +1286,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: { @@ -1217,23 +1318,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: { @@ -1244,6 +1340,33 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const } break; } + + case Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS: + { + bool dispatch; + if(value.Get(dispatch)) + { + controlImpl.mImpl->mDispatchKeyEvents = dispatch; + } + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_HIDDEN: + { + bool hidden; + if(value.Get(hidden)) + { + controlImpl.mImpl->mAccessibilityHidden = hidden; + + auto* accessible = controlImpl.GetAccessibleObject(); + auto* parent = dynamic_cast(accessible->GetParent()); + if (parent) + { + parent->OnChildrenChanged(); + } + } + break; + } } } } @@ -1359,28 +1482,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; } @@ -1392,10 +1506,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; } @@ -1404,6 +1515,18 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i value = controlImpl.mImpl->mAccessibilityAttributes; break; } + + case Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS: + { + value = controlImpl.mImpl->mDispatchKeyEvents; + break; + } + + case Toolkit::DevelControl::Property::ACCESSIBILITY_HIDDEN: + { + value = controlImpl.mImpl->mAccessibilityHidden; + break; + } } } @@ -1834,115 +1957,46 @@ 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) +void Control::Impl::CreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, Dali::Toolkit::Control destination) { - 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); - float borderlineWidth(0.0f); - Vector4 borderlineColor(0.0f, 0.0f, 0.0f, 1.0f); - float borderlineOffset(0.0f); - - if(!destinationMap.Empty()) + // Retrieves background properties to be transitioned. + Dali::Property::Map backgroundSourcePropertyMap, backgroundDestinationPropertyMap; + mControlImpl.MakeVisualTransition(backgroundSourcePropertyMap, backgroundDestinationPropertyMap, source, destination, Toolkit::Control::Property::BACKGROUND); + if(backgroundSourcePropertyMap.Count() > 0) { - static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - mixColor = findValueVector4(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR, mixColor); - cornerRadius = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); - borderlineWidth = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - borderlineColor = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - borderlineOffset = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - - 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); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - } - - Vector4 sourceMixColor = findValueVector4(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR, mixColor); - Vector4 sourceCornerRadius = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); - float sourceBorderlineWidth = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - Vector4 sourceBorderlineColor = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - float sourceBorderlineOffset = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - - 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)); - } + sourceProperties.push_back(std::pair(Toolkit::Control::Property::BACKGROUND, backgroundSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::Control::Property::BACKGROUND, backgroundDestinationPropertyMap)); + } - if(sourceBorderlineWidth != borderlineWidth) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH)); - values.push_back(std::make_pair(sourceBorderlineWidth, borderlineWidth)); - } + // Retrieves shadow properties to be transitioned. + Dali::Property::Map shadowSourcePropertyMap, shadowDestinationPropertyMap; + mControlImpl.MakeVisualTransition(shadowSourcePropertyMap, shadowDestinationPropertyMap, source, destination, Toolkit::DevelControl::Property::SHADOW); + if(shadowSourcePropertyMap.Count() > 0) + { + sourceProperties.push_back(std::pair(Toolkit::DevelControl::Property::SHADOW, shadowSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::DevelControl::Property::SHADOW, shadowDestinationPropertyMap)); + } - if(sourceBorderlineColor != borderlineColor) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_COLOR)); - values.push_back(std::make_pair(sourceBorderlineColor, borderlineColor)); - } + // Retrieves transition from inherited class. + mControlImpl.OnCreateTransitions(sourceProperties, destinationProperties, source, destination); +} - if(sourceBorderlineOffset != borderlineOffset) +void Control::Impl::UpdateVisualProperties(const std::vector>& properties) +{ + for(auto&& data : properties) + { + if(data.first == Toolkit::Control::Property::BACKGROUND) { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)); - values.push_back(std::make_pair(sourceBorderlineOffset, borderlineOffset)); + DoAction(Toolkit::Control::Property::BACKGROUND, DevelVisual::Action::UPDATE_PROPERTY, data.second); } - - for(uint32_t i = 0; i < properties.size(); ++i) + else if(data.first == Toolkit::DevelControl::Property::SHADOW) { - 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); + DoAction(Toolkit::DevelControl::Property::SHADOW, DevelVisual::Action::UPDATE_PROPERTY, data.second); } } + mControlImpl.OnUpdateVisualProperties(properties); } void Control::Impl::EmitResourceReadySignal() @@ -1997,27 +2051,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