1 #include <dali/devel-api/adaptor-framework/accessibility.h>
2 #include <dali/integration-api/debug.h>
3 #include <dali/public-api/actors/actor.h>
4 #include <dali/public-api/actors/layer.h>
5 #include <dali/public-api/common/stage.h>
6 #include <dali/public-api/object/base-object.h>
7 #include <dali/public-api/object/object-registry.h>
8 #include <dali/public-api/object/type-info.h>
9 #include <dali/public-api/object/type-registry-helper.h>
11 using namespace Dali::Accessibility;
13 std::string EmptyAccessibleWithAddress::GetRoleName()
18 std::string Accessible::GetLocalizedRoleName()
23 std::string Accessible::GetRoleName()
31 case Role::AcceleratorLabel:
33 return "accelerator label";
59 case Role::CheckMenuItem:
61 return "check menu item";
63 case Role::ColorChooser:
65 return "color chooser";
67 case Role::ColumnHeader:
69 return "column header";
75 case Role::DateEditor:
79 case Role::DesktopIcon:
81 return "desktop icon";
83 case Role::DesktopFrame:
85 return "desktop frame";
95 case Role::DirectoryPane:
97 return "directory pane";
99 case Role::DrawingArea:
101 return "drawing area";
103 case Role::FileChooser:
105 return "file chooser";
111 case Role::FocusTraversable:
113 return "focus traversable";
115 case Role::FontChooser:
117 return "font chooser";
123 case Role::GlassPane:
127 case Role::HtmlContainer:
129 return "html container";
139 case Role::InternalFrame:
141 return "internal frame";
147 case Role::LayeredPane:
149 return "layered pane";
171 case Role::OptionPane:
173 return "option pane";
179 case Role::PageTabList:
181 return "page tab list";
187 case Role::PasswordText:
189 return "password text";
191 case Role::PopupMenu:
195 case Role::ProgressBar:
197 return "progress bar";
199 case Role::PushButton:
201 return "push button";
203 case Role::RadioButton:
205 return "radio button";
207 case Role::RadioMenuItem:
209 return "radio menu item";
215 case Role::RowHeader:
219 case Role::ScrollBar:
223 case Role::ScrollPane:
225 return "scroll pane";
227 case Role::Separator:
235 case Role::SpinButton:
237 return "spin button";
239 case Role::SplitPane:
243 case Role::StatusBar:
251 case Role::TableCell:
255 case Role::TableColumnHeader:
257 return "table column header";
259 case Role::TableRowHeader:
261 return "table row header";
263 case Role::TearoffMenuItem:
265 return "tearoff menu item";
275 case Role::ToggleButton:
277 return "toggle button";
291 case Role::TreeTable:
319 case Role::Paragraph:
327 case Role::Application:
329 return "application";
331 case Role::Autocomplete:
333 return "autocomplete";
355 case Role::DocumentFrame:
357 return "document frame";
371 case Role::RedundantObject:
373 return "redundant object";
383 case Role::InputMethodWindow:
385 return "input method window";
395 case Role::DocumentSpreadsheet:
397 return "document spreadsheet";
399 case Role::DocumentPresentation:
401 return "document presentation";
403 case Role::DocumentText:
405 return "document text";
407 case Role::DocumentWeb:
409 return "document web";
411 case Role::DocumentEmail:
413 return "document email";
431 case Role::Notification:
433 return "notification";
447 case Role::BlockQuote:
449 return "block quote";
459 case Role::Definition:
495 case Role::MathFraction:
497 return "math fraction";
503 case Role::Subscript:
507 case Role::Superscript:
509 return "superscript";
519 void Bridge::SetIsOnRootLevel( Accessible* o )
521 o->isOnRootLevel = true;
524 class NonControlAccessible : public virtual Accessible, public virtual Collection
530 NonControlAccessible( Dali::Actor actor ) : actor( actor )
532 Dali::Stage stage = Dali::Stage::GetCurrent();
533 root = stage.GetRootLayer() == actor;
536 std::string GetName() override
538 return actor.GetName();
540 std::string GetDescription() override
544 Accessible* GetParent() override
546 if( GetIsOnRootLevel() )
548 auto b = GetBridgeData();
549 return b->bridge->GetApplication();
551 return Get( actor.GetParent() );
553 size_t GetChildCount() override
555 return static_cast< size_t >( actor.GetChildCount() );
557 Accessible* GetChildAtIndex( size_t index ) override
559 auto s = static_cast< size_t >( actor.GetChildCount() );
561 throw AccessibleError{"invalid index " + std::to_string( index ) + " for object with " + std::to_string( s ) + " children"};
562 return Get( actor.GetChildAt( static_cast< unsigned int >( index ) ) );
564 size_t GetIndexInParent() override
566 auto p = actor.GetParent();
569 auto s = static_cast< size_t >( p.GetChildCount() );
570 for( auto i = 0u; i < s; ++i )
572 if( p.GetChildAt( i ) == actor )
575 throw AccessibleError{"actor is not a child of it's parent"};
577 Role GetRole() override
579 return root ? Role::Window : Role::RedundantObject;
581 States GetStates() override
586 s[State::Highlightable] = true;
587 s[State::Enabled] = true;
588 s[State::Sensitive] = true;
589 s[State::Showing] = true;
590 s[State::Active] = true;
594 auto t = GetParent()->GetStates();
595 s[State::Showing] = t[State::Showing];
596 s[State::Visible] = t[State::Visible];
600 Attributes GetAttributes() override
603 actor.GetTypeInfo( type );
605 {"t", type.GetName()},
610 using NonControlAccessiblesType = std::unordered_map< const Dali::RefObject*, std::unique_ptr< NonControlAccessible > >;
611 static NonControlAccessiblesType nonControlAccessibles;
613 static std::function< Accessible*( Dali::Actor ) > convertingFunctor = []( Dali::Actor ) -> Accessible* {
617 void Accessible::RegisterControlAccessibilityGetter( std::function< Accessible*( Dali::Actor ) > functor )
619 convertingFunctor = functor;
622 Accessible* Accessible::Get( Dali::Actor actor )
628 auto p = convertingFunctor( actor );
631 if( nonControlAccessibles.empty() )
633 auto registry = Dali::Stage::GetCurrent().GetObjectRegistry();
634 registry.ObjectDestroyedSignal().Connect( []( const Dali::RefObject* obj ) {
635 nonControlAccessibles.erase( obj );
638 auto it = nonControlAccessibles.emplace( &actor.GetBaseObject(), nullptr );
641 it.first->second.reset( new NonControlAccessible( actor ) );
643 p = it.first->second.get();