From e4bed7b8660bd201c33c27c4b774c74ec6e031b9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Thu, 24 Sep 2020 17:38:23 +0200 Subject: [PATCH] [AT-SPI] Implement accessibility for Popup Change-Id: I9afe522913bfaacd5f6bf66e5abe0cd815d7c8af --- .../internal/controls/popup/popup-impl.cpp | 49 ++++++++++++++-------- dali-toolkit/internal/controls/popup/popup-impl.h | 8 +++- dali-toolkit/internal/controls/tooltip/tooltip.cpp | 2 +- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/dali-toolkit/internal/controls/popup/popup-impl.cpp b/dali-toolkit/internal/controls/popup/popup-impl.cpp index 94a0ead..8e18342 100644 --- a/dali-toolkit/internal/controls/popup/popup-impl.cpp +++ b/dali-toolkit/internal/controls/popup/popup-impl.cpp @@ -339,16 +339,14 @@ void Popup::OnInitialize() SetupTouch(); - DevelControl::SetAccessibilityConstructor( self, []( Dali::Actor actor ) { - return std::unique_ptr< Dali::Accessibility::Accessible >( - new Control::Impl::AccessibleImpl( actor, Dali::Accessibility::Role::DIALOG, true ) ); - } ); + DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) + { + return std::unique_ptr(new AccessibleImpl(actor, Dali::Accessibility::Role::DIALOG, true)); + }); } Popup::~Popup() { - if( DevelControl::GetBoundAccessibilityObject( Self() ) ) - Accessibility::Bridge::GetCurrentBridge()->RemovePopup( DevelControl::GetBoundAccessibilityObject( Self() ) ); mEntryAnimationData.Clear(); mExitAnimationData.Clear(); } @@ -570,8 +568,11 @@ void Popup::DisplayStateChangeComplete() bool Popup::OnAutoHideTimeReached() { - // Display timer has expired, auto hide the popup exactly as if the user had clicked outside. - SetDisplayState( Toolkit::Popup::HIDDEN ); + if (!Dali::Accessibility::IsUp() || true) // TODO: remove 'true' in sync with EFL (UX change) + { + // Display timer has expired, auto hide the popup exactly as if the user had clicked outside. + SetDisplayState( Toolkit::Popup::HIDDEN ); + } if( mAutoHideTimer ) { @@ -720,6 +721,18 @@ void Popup::SetDisplayState( Toolkit::Popup::DisplayState displayState ) return; } + auto *accessible = Dali::Accessibility::Accessible::Get(Self()); + if (display) + { + Dali::Accessibility::Bridge::GetCurrentBridge()->AddPopup(accessible); + accessible->EmitStateChanged(Dali::Accessibility::State::SHOWING, 1, 0); + } + else + { + accessible->EmitStateChanged(Dali::Accessibility::State::SHOWING, 0, 0); + Dali::Accessibility::Bridge::GetCurrentBridge()->RemovePopup(accessible); + } + // Convert the bool state to the actual display state to use. mDisplayState = display ? Toolkit::Popup::SHOWING : Toolkit::Popup::HIDING; @@ -1572,21 +1585,12 @@ bool Popup::OnDialogTouched( Actor actor, const TouchEvent& touch ) return false; } -void Popup::OnSceneDisconnection() -{ - auto p = Dali::Accessibility::Accessible::Get(Self()); - Accessibility::Bridge::GetCurrentBridge()->RemovePopup( p ); - Control::OnSceneDisconnection(); -} - void Popup::OnSceneConnection( int depth ) { mLayoutDirty = true; RelayoutRequest(); Control::OnSceneConnection( depth ); - auto p = Dali::Accessibility::Accessible::Get(Self()); - Accessibility::Bridge::GetCurrentBridge()->AddPopup( p ); } void Popup::OnChildAdd( Actor& child ) @@ -1994,6 +1998,17 @@ void Popup::SetupTouch() } } +Dali::Accessibility::States Popup::AccessibleImpl::CalculateStates() +{ + auto states = Control::Impl::AccessibleImpl::CalculateStates(); + auto popup = Toolkit::Popup::DownCast(self); + auto displayState = popup.GetProperty(Toolkit::Popup::Property::DISPLAY_STATE); + + states[Dali::Accessibility::State::SHOWING] = (displayState == "SHOWN" || displayState == "SHOWING"); + + return states; +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/controls/popup/popup-impl.h b/dali-toolkit/internal/controls/popup/popup-impl.h index 8c60d40..359570b 100644 --- a/dali-toolkit/internal/controls/popup/popup-impl.h +++ b/dali-toolkit/internal/controls/popup/popup-impl.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace Dali { @@ -244,6 +245,12 @@ public: static Property::Value GetProperty( BaseObject* object, Property::Index propertyIndex ); protected: + struct AccessibleImpl : public Control::Impl::AccessibleImpl + { + using Control::Impl::AccessibleImpl::AccessibleImpl; + + Dali::Accessibility::States CalculateStates() override; + }; /** * Construct a new Popup. @@ -438,7 +445,6 @@ private: * Called when the popup is directly or indirectly parented to the stage. */ void OnSceneConnection( int depth ) override; - void OnSceneDisconnection() override; /** * From Control; called after a child has been added to the owning actor. diff --git a/dali-toolkit/internal/controls/tooltip/tooltip.cpp b/dali-toolkit/internal/controls/tooltip/tooltip.cpp index e7f8b9f..3a2ccc0 100644 --- a/dali-toolkit/internal/controls/tooltip/tooltip.cpp +++ b/dali-toolkit/internal/controls/tooltip/tooltip.cpp @@ -277,7 +277,7 @@ void Tooltip::SetContent( Toolkit::Control& control, const Property::Value& valu if( value.Get( text ) ) { mContentTextVisual[ Toolkit::TextVisual::Property::TEXT ] = text; - mContentTextVisual[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT; + mContentTextVisual[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::TEXT; mContentArray.Clear(); connectSignals = true; } -- 2.7.4