Browse Source

More work on ComboBox OSX a11y.

Implement "Show Menu" and "Perform Press" actions.
ui-automation-test
Steven Kirk 5 years ago
parent
commit
8ded356614
  1. 48
      native/Avalonia.Native/src/OSX/automation.mm
  2. 1
      src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs
  3. 9
      src/Avalonia.Controls/Automation/Provider/IExpandCollapseProvider.cs
  4. 14
      src/Avalonia.Native/AvnAutomationPeer.cs
  5. 6
      src/Avalonia.Native/avn.idl

48
native/Avalonia.Native/src/OSX/automation.mm

@ -222,11 +222,33 @@ public:
return [self accessibilityTopLevelUIElement];
}
- (BOOL)accessibilityPerformPress
- (BOOL)isAccessibilityExpanded
{
if (!_peer->IsInvokeProvider())
if (!_peer->IsExpandCollapseProvider())
return NO;
_peer->InvokeProvider_Invoke();
return _peer->ExpandCollapseProvider_IsExpanded();
}
- (void)setAccessibilityExpanded:(BOOL)accessibilityExpanded
{
if (!_peer->IsExpandCollapseProvider())
return;
if (accessibilityExpanded)
_peer->ExpandCollapseProvider_Expand();
else
_peer->ExpandCollapseProvider_Collapse();
}
- (BOOL)accessibilityPerformPress
{
if (_peer->IsInvokeProvider())
{
_peer->InvokeProvider_Invoke();
}
else if (_peer->IsExpandCollapseProvider())
{
_peer->ExpandCollapseProvider_Expand();
}
return YES;
}
@ -250,11 +272,27 @@ public:
return YES;
}
- (BOOL)accessibilityPerformShowMenu
{
if (!_peer->IsExpandCollapseProvider())
return NO;
_peer->ExpandCollapseProvider_Expand();
return YES;
}
- (BOOL)isAccessibilitySelectorAllowed:(SEL)selector
{
if (selector == @selector(accessibilityPerformPress))
if (selector == @selector(accessibilityPerformShowMenu))
{
return _peer->IsExpandCollapseProvider() && _peer->ExpandCollapseProvider_ShowsMenu();
}
else if (selector == @selector(isAccessibilityExpanded))
{
return _peer->IsExpandCollapseProvider();
}
else if (selector == @selector(accessibilityPerformPress))
{
return _peer->IsInvokeProvider();
return _peer->IsInvokeProvider() || _peer->IsExpandCollapseProvider();
}
else if (selector == @selector(accessibilityPerformIncrement) ||
selector == @selector(accessibilityPerformDecrement))

1
src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs

@ -20,6 +20,7 @@ namespace Avalonia.Automation.Peers
public new ComboBox Owner => (ComboBox)base.Owner;
public ExpandCollapseState ExpandCollapseState => ToState(Owner.IsDropDownOpen);
public bool ShowsMenu => true;
public void Collapse() => Owner.IsDropDownOpen = false;
public void Expand() => Owner.IsDropDownOpen = true;

9
src/Avalonia.Controls/Automation/Provider/IExpandCollapseProvider.cs

@ -11,6 +11,15 @@
/// </summary>
ExpandCollapseState ExpandCollapseState { get; }
/// <summary>
/// Gets a value indicating whether expanding the element shows a menu of items to the user,
/// such as drop-down list.
/// </summary>
/// <remarks>
/// Used in OSX to enable the "Show Menu" action on the element.
/// </remarks>
bool ShowsMenu { get; }
/// <summary>
/// Displays all child nodes, controls, or content of the control.
/// </summary>

14
src/Avalonia.Native/AvnAutomationPeer.cs

@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using Avalonia.Automation;
using Avalonia.Automation.Peers;
using Avalonia.Automation.Provider;
using Avalonia.Native.Interop;
@ -75,6 +76,19 @@ namespace Avalonia.Native
return Wrap(result);
}
public int IsExpandCollapseProvider() => (_inner is IExpandCollapseProvider).AsComBool();
public int ExpandCollapseProvider_IsExpanded() => ((IExpandCollapseProvider)_inner).ExpandCollapseState switch
{
ExpandCollapseState.Expanded => 1,
ExpandCollapseState.PartiallyExpanded => 1,
_ => 0,
};
public int ExpandCollapseProvider_ShowsMenu() => ((IExpandCollapseProvider)_inner).ShowsMenu.AsComBool();
public void ExpandCollapseProvider_Expand() => ((IExpandCollapseProvider)_inner).Expand();
public void ExpandCollapseProvider_Collapse() => ((IExpandCollapseProvider)_inner).Collapse();
public int IsInvokeProvider() => (_inner is IInvokeProvider).AsComBool();
public void InvokeProvider_Invoke() => ((IInvokeProvider)_inner).Invoke();

6
src/Avalonia.Native/avn.idl

@ -816,6 +816,12 @@ interface IAvnAutomationPeer : IUnknown
IAvnAutomationPeer* RootProvider_GetFocus();
IAvnAutomationPeer* RootProvider_GetPeerFromPoint(AvnPoint point);
bool IsExpandCollapseProvider();
bool ExpandCollapseProvider_IsExpanded();
bool ExpandCollapseProvider_ShowsMenu();
void ExpandCollapseProvider_Expand();
void ExpandCollapseProvider_Collapse();
bool IsInvokeProvider();
void InvokeProvider_Invoke();

Loading…
Cancel
Save