From 6cb266a58f6d578d048efe556d449e150f6fec6d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Fri, 13 May 2022 13:30:12 +0200 Subject: [PATCH] [NUI][AT-SPI] Make GetAccessibilityRelations() usable The Address type is useless in NUI, as there is no way to convert an Address to a View or obtain an Address of a View. With this change, GetAccessibilityRelations() returns a mapping from the relation type to a collection of View. Address and AddressCollection are removed altogether. --- .../src/internal/Interop/Interop.ControlDevel.cs | 16 +-- .../src/public/BaseComponents/ViewAccessibility.cs | 139 +++++---------------- 2 files changed, 37 insertions(+), 118 deletions(-) diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs b/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs index 33a6dfe..a8811a7 100755 --- a/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs +++ b/src/Tizen.NUI/src/internal/Interop/Interop.ControlDevel.cs @@ -72,20 +72,12 @@ namespace Tizen.NUI public static extern void DaliToolkitDevelControlRemoveAccessibilityRelation(HandleRef arg1, HandleRef arg2, int arg3); [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_new_GetAccessibilityRelations")] - public static extern IntPtr DaliToolkitDevelControlNewGetAccessibilityRelations(HandleRef arg1); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void GetAccessibilityRelationsCallback(int relationType, IntPtr relationTarget, IntPtr userData); [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_AccessibilityRelations_RelationSize")] - public static extern uint DaliToolkitDevelControlAccessibilityRelationsRelationSize(BaseComponents.AddressCollection arg1, int relation); - - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_AccessibilityRelations_At")] - public static extern string DaliToolkitDevelControlAccessibilityRelationsAt(BaseComponents.AddressCollection arg1, int rel, int pos, int id); - - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_delete_AccessibilityRelations")] - public static extern void DaliToolkitDevelControlDeleteAccessibilityRelations(IntPtr arg1); + [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_GetAccessibilityRelations")] + public static extern void DaliToolkitDevelControlGetAccessibilityRelations(HandleRef arg1_control, GetAccessibilityRelationsCallback arg2_callback, IntPtr arg3_userData); [EditorBrowsable(EditorBrowsableState.Never)] [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityRelations")] diff --git a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs index be93bbe..7ad8da8 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/ViewAccessibility.cs @@ -16,6 +16,7 @@ */ using System; +using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; using Tizen.NUI; @@ -23,109 +24,6 @@ using Tizen.NUI; namespace Tizen.NUI.BaseComponents { /// - /// Address represents an unique object address on accessibility bus. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public class Address - { - /// - /// Creates an initialized Address. - /// - /// Accessibility bus - /// Accessibility path - [EditorBrowsable(EditorBrowsableState.Never)] - public Address(string bus, string path) - { - Bus = bus; - Path = path; - } - - /// - /// Gets or sets accessibility bus. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public string Bus { get; set; } - - /// - /// Gets or sets accessibility path. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public string Path { get; set; } - } - - /// - /// AddressCollection. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public class AddressCollection : SafeHandle - { - /// - /// Creates an initialized AddressCollection. - /// - /// Initialized AddressCollection - [EditorBrowsable(EditorBrowsableState.Never)] - public AddressCollection(IntPtr collection) : base(collection, true) - { - } - - /// - /// Checks whether this handle is invalid or not. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool IsInvalid - { - get - { - return this.handle == IntPtr.Zero; - } - } - - /// - /// Gets the size of accessibility relation. - /// - /// Accessibility relation - /// The size of relation, which means the number of elements - [EditorBrowsable(EditorBrowsableState.Never)] - public uint GetRelationSize(AccessibilityRelationType relation) - { - uint result = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsRelationSize(this, Convert.ToInt32(relation)); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - return result; - } - - /// - /// Gets Address object using contained bus and path. - /// - /// Accessibility relation - /// Position - /// Accessibility Adress - [EditorBrowsable(EditorBrowsableState.Never)] - public Address GetAddressAt(AccessibilityRelationType relation, int position) - { - var bus = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 0); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - - var path = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 1); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - - return new Address(bus, path); - } - - /// - /// Releases handle itself. - /// - /// true when released successfully. - [EditorBrowsable(EditorBrowsableState.Never)] - protected override bool ReleaseHandle() - { - Interop.ControlDevel.DaliToolkitDevelControlDeleteAccessibilityRelations(handle); - if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); - this.SetHandle(IntPtr.Zero); - return true; - } - } - - /// /// AccessibilityRange is used to store data related with Text. /// [EditorBrowsable(EditorBrowsableState.Never)] @@ -285,15 +183,44 @@ namespace Tizen.NUI.BaseComponents /// /// Gets accessibility collection connected with the current object. /// - /// AddressCollection + /// A dictionary mapping a relation type to a set of objects in that relation [EditorBrowsable(EditorBrowsableState.Never)] - public AddressCollection GetAccessibilityRelations() + public Dictionary> GetAccessibilityRelations() { - var result = new AddressCollection(Interop.ControlDevel.DaliToolkitDevelControlNewGetAccessibilityRelations(SwigCPtr)); + var list = new List>(); + var listHandle = GCHandle.Alloc(list); + var callback = new Interop.ControlDevel.GetAccessibilityRelationsCallback(GetAccessibilityRelationsCallback); + + Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityRelations(SwigCPtr, callback, GCHandle.ToIntPtr(listHandle)); + listHandle.Free(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + + var result = new Dictionary>(); + + foreach (var pair in list) + { + var key = (AccessibilityRelationType)pair.Key; + var value = this.GetInstanceSafely(pair.Value); + + if (!result.ContainsKey(key)) + { + result[key] = new List(); + } + + result[key].Add(value); + } + return result; } + private static void GetAccessibilityRelationsCallback(int relationType, IntPtr relationTarget, IntPtr userData) + { + var handle = GCHandle.FromIntPtr(userData); + var list = (List>)handle.Target; + + list.Add(new KeyValuePair(relationType, relationTarget)); + } + /////////////////////////////////////////////////////////////////// // ********************* ReadingInfoType *********************** // /////////////////////////////////////////////////////////////////// -- 2.7.4