X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcontrol%2Fcontrol-data-impl.cpp;h=f9f437633614915ca3d3bb06c68d01d050bf4e8e;hb=d905c34da8009d5da7772461ce3c73cf49d043a5;hp=0b41d3fbdc8d6b81cb028af0a4f9fdd44493ca4d;hpb=b0faad981257720e1a5fb15af45647f30b669adf;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 0b41d3f..f9f4376 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -439,6 +439,11 @@ Dali::Rect<> GetShowingGeometry(Dali::Rect<> rect, Dali::Toolkit::DevelControl:: return rect; } +static bool IsShowingGeometryOnScreen(Dali::Rect<> rect) +{ + return rect.width > 0 && rect.height > 0; +} + } // unnamed namespace // clang-format off @@ -462,6 +467,8 @@ 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); + // clang-format on Control::Impl::Impl(Control& controlImpl) @@ -496,7 +503,8 @@ 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* { @@ -547,7 +555,7 @@ const Control::Impl& Control::Impl::Get(const Internal::Control& internalControl return *internalControl.mImpl; } -void Control::Impl::CheckHighlightedObjectGeometry(PropertyNotification& propertyNotification) +void Control::Impl::CheckHighlightedObjectGeometry() { auto accessibleImpl = dynamic_cast(mAccessibilityObject.get()); if(!accessibleImpl) @@ -558,40 +566,52 @@ void Control::Impl::CheckHighlightedObjectGeometry(PropertyNotification& propert auto lastPosition = accessibleImpl->GetLastPosition(); auto accessibleRect = accessibleImpl->GetExtents(Dali::Accessibility::CoordinateType::WINDOW); - - if(lastPosition.x == accessibleRect.x && lastPosition.y == accessibleRect.y) - { - return; - } - auto rect = GetShowingGeometry(accessibleRect, accessibleImpl); - // MoveOuted is sent already, no need to send it again - if(mAccessibilityMovedOutOfScreenDirection != Dali::Accessibility::MovedOutOfScreenType::NONE) + switch(mAccessibilityLastScreenRelativeMoveType) { - if(rect.width > 0 && rect.height > 0) + case Dali::Accessibility::ScreenRelativeMoveType::OUTSIDE: { - // flick next does not use MoveOuted - ScrollToSelf makes object show, so reset for sending MoveOuted next - mAccessibilityMovedOutOfScreenDirection = Dali::Accessibility::MovedOutOfScreenType::NONE; + 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) + { + mAccessibilityObject.get()->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; } - return; - } - - if(rect.width < 0) - { - mAccessibilityMovedOutOfScreenDirection = (accessibleRect.x < lastPosition.x) ? Dali::Accessibility::MovedOutOfScreenType::TOP_LEFT : Dali::Accessibility::MovedOutOfScreenType::BOTTOM_RIGHT; - } - - if(rect.height < 0) - { - mAccessibilityMovedOutOfScreenDirection = (accessibleRect.y < lastPosition.y) ? Dali::Accessibility::MovedOutOfScreenType::TOP_LEFT : Dali::Accessibility::MovedOutOfScreenType::BOTTOM_RIGHT; - } - - if(mAccessibilityMovedOutOfScreenDirection != Dali::Accessibility::MovedOutOfScreenType::NONE) - { - mAccessibilityObject.get()->EmitMovedOutOfScreen(mAccessibilityMovedOutOfScreenDirection); - accessibleImpl->SetLastPosition(Vector2(0.0f, 0.0f)); - return; } accessibleImpl->SetLastPosition(Vector2(accessibleRect.x, accessibleRect.y)); @@ -603,11 +623,13 @@ void Control::Impl::RegisterAccessibilityPositionPropertyNotification() { return; } - - mAccessibilityMovedOutOfScreenDirection = Dali::Accessibility::MovedOutOfScreenType::NONE; - mAccessibilityPositionNotification = mControlImpl.Self().AddPropertyNotification(Actor::Property::WORLD_POSITION, StepCondition(1.0f, 1.0f)); + // 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, &Control::Impl::CheckHighlightedObjectGeometry); + mAccessibilityPositionNotification.NotifySignal().Connect(this, [this](PropertyNotification&){ CheckHighlightedObjectGeometry(); }); mIsAccessibilityPositionPropertyNotificationSet = true; } @@ -1343,6 +1365,16 @@ 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; + } } } } @@ -1503,6 +1535,11 @@ 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; + } } }