Skip to content

Commit 3c2b580

Browse files
author
Bianca Marina Stana
committed
Fixed several accessibility bugs
# Conflicts: # Assets/Scripts/Screen Reader/UITk/VisualTreeAccessibilityUpdater.cs
1 parent 6a16041 commit 3c2b580

16 files changed

+193
-92
lines changed

Assets/Scripts/Screen Reader/UITk/AccessibleProperties.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void IncrementVersion(VisualElement element)
5353
internal Value<bool> m_IsActive = new(true);
5454
internal Value<string> m_Label;
5555
internal Value<AccessibilityRole> m_Role;
56+
internal Value<AccessibilityState> m_State;
5657
internal Value<bool> m_Ignored;
5758
internal Value<bool> m_Modal;
5859
internal Value<string> m_Value;
@@ -96,6 +97,13 @@ public AccessibilityRole role
9697
set => m_Role.Set(this, value);
9798
}
9899

100+
[UxmlAttribute, CreateProperty]
101+
public AccessibilityState state
102+
{
103+
get => m_State.Get();
104+
set => m_State.Set(this, value);
105+
}
106+
99107
[UxmlAttribute, CreateProperty]
100108
public string value
101109
{

Assets/Scripts/Screen Reader/UITk/Handlers/BaseFieldHandler.cs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ public override string GetLabel()
1414

1515
public override string GetValue()
1616
{
17-
var field = ownerElement as BaseField<TValueType>;
18-
return field == null ? "" : $"{field.value}";
17+
return ownerElement is BaseField<TValueType> field ? $"{field.value}" : "";
1918
}
2019

2120
protected override void BindToElement(VisualElement ve)
@@ -33,8 +32,15 @@ protected override void UnbindFromElement(VisualElement ve)
3332

3433
void OnValueChanged(ChangeEvent<TValueType> e)
3534
{
36-
EnsureLabelIsNotAccessible();
37-
NotifyChange();
35+
if (ownerElement is Toggle or RadioButton or Slider)
36+
{
37+
var updater = ownerElement.panel.GetAccessibilityUpdater();
38+
updater?.UpdateNode(this);
39+
}
40+
else
41+
{
42+
NotifyChange();
43+
}
3844
}
3945

4046
void EnsureLabelIsNotAccessible()
@@ -47,20 +53,4 @@ void EnsureLabelIsNotAccessible()
4753
}
4854
}
4955
}
50-
51-
[Preserve]
52-
class ToggleHandler : BaseFieldHandler<bool>
53-
{
54-
#if UNITY_2023_3_OR_NEWER
55-
public override AccessibilityRole GetRole() => AccessibilityRole.Toggle;
56-
#endif // UNITY_2023_3_OR_NEWER
57-
}
58-
59-
[Preserve]
60-
class RadioButtonHandler : BaseFieldHandler<bool>
61-
{
62-
#if UNITY_2023_3_OR_NEWER
63-
public override AccessibilityRole GetRole() => AccessibilityRole.Toggle;
64-
#endif // UNITY_2023_3_OR_NEWER
65-
}
6656
}

Assets/Scripts/Screen Reader/UITk/Handlers/BasePopupFieldHandler.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@ class BasePopupFieldHandler<TValue, TValueChoice> : BaseFieldHandler<TValue>
1313

1414
public BasePopupFieldHandler()
1515
{
16-
/*OnSelect += () =>
16+
selected += () =>
1717
{
18-
ownerElement.schedule.Execute(CheckForOpenedPopupMenu).ExecuteLater(200);
18+
ownerElement.schedule.Execute(CheckForOpenedPopupMenu).ExecuteLater(300);
1919

20-
using var evt = NavigationSubmitEvent.GetPooled();
20+
using var evt = NavigationSubmitEvent.GetPooled();
21+
evt.target = ownerElement;
2122
ownerElement.SendEvent(evt);
23+
2224
OnScreenDebug.Log("Submit event sent to " + ownerElement.name);
2325

24-
return false;//true;
25-
};*/
26+
return true;
27+
};
2628
}
2729

2830
public override string GetHint()
@@ -116,27 +118,23 @@ void CheckForOpenedPopupMenu()
116118

117119
itemAcc.label = itemLabel != null ? itemLabel.text : $"Item {i}";
118120
itemAcc.role = AccessibilityRole.Button;
121+
itemAcc.state = item.hasCheckedPseudoState ? AccessibilityState.Selected : AccessibilityState.None;
122+
itemAcc.selected += () =>
123+
{
124+
using var evt = NavigationSubmitEvent.GetPooled();
125+
evt.target = item;
126+
item.SendEvent(evt);
127+
128+
return true;
129+
};
130+
119131
itemLabel.GetOrCreateAccessibleProperties().ignored = true;
132+
120133
i++;
121134
}
122135

123136
// NotifyChange();
124137
}
125-
126-
/*
127-
#if UNITY_6000_3_OR_NEWER
128-
var popup = ve.Q("unity-popup");
129-
130-
if (popup != null && popup.style.display == DisplayStyle.Flex)
131-
{
132-
SetState(AccessibilityState.Expanded);
133-
}
134-
else
135-
{
136-
SetState(AccessibilityState.Collapsed);
137-
}
138-
#endif // UNITY_6000_3_OR_NEWER
139-
*/
140138
}
141139
}
142140
}

Assets/Scripts/Screen Reader/UITk/Handlers/ButtonHandler.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,9 @@ public ButtonHandler()
1111
{
1212
selected += () =>
1313
{
14-
if (ownerElement is not Button button)
15-
{
16-
return false;
17-
}
18-
19-
using var e = new NavigationSubmitEvent();
20-
e.target = button;
21-
button.SendEvent(e);
14+
using var evt = NavigationSubmitEvent.GetPooled();
15+
evt.target = ownerElement;
16+
ownerElement.SendEvent(evt);
2217

2318
return true;
2419
};
@@ -31,8 +26,8 @@ public override string GetLabel()
3126

3227
public override AccessibilityRole GetRole() => AccessibilityRole.Button;
3328

34-
protected override void BindToElement(VisualElement ve)
35-
{
36-
}
29+
public override AccessibilityState GetState() => ownerElement is Button { hasCheckedPseudoState: true }
30+
? AccessibilityState.Selected
31+
: AccessibilityState.None;
3732
}
3833
}

Assets/Scripts/Screen Reader/UITk/Handlers/DropdownFieldHandler.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@ class DropdownFieldHandler : BaseFieldHandler<string>
1313

1414
public DropdownFieldHandler()
1515
{
16-
/*OnSelect += () =>
16+
selected += () =>
1717
{
18-
ownerElement.schedule.Execute(CheckForOpenedPopupMenu).ExecuteLater(200);
18+
ownerElement.schedule.Execute(CheckForOpenedPopupMenu).ExecuteLater(300);
1919

20-
using var evt = NavigationSubmitEvent.GetPooled();
20+
using var evt = NavigationSubmitEvent.GetPooled();
21+
evt.target = ownerElement;
2122
ownerElement.SendEvent(evt);
23+
2224
OnScreenDebug.Log("Submit event sent to " + ownerElement.name);
2325

24-
return false;//true;
25-
};*/
26+
return true;
27+
};
2628
}
2729

2830
public override string GetHint()
@@ -115,27 +117,23 @@ void CheckForOpenedPopupMenu()
115117

116118
itemAcc.label = itemLabel != null ? itemLabel.text : $"Item {i}";
117119
itemAcc.role = AccessibilityRole.Button;
120+
itemAcc.state = item.hasCheckedPseudoState ? AccessibilityState.Selected : AccessibilityState.None;
121+
itemAcc.selected += () =>
122+
{
123+
using var evt = NavigationSubmitEvent.GetPooled();
124+
evt.target = item;
125+
item.SendEvent(evt);
126+
127+
return true;
128+
};
129+
118130
itemLabel.GetOrCreateAccessibleProperties().ignored = true;
131+
119132
i++;
120133
}
121134

122135
// NotifyChange();
123136
}
124-
125-
/*
126-
#if UNITY_6000_3_OR_NEWER
127-
var popup = ve.Q("unity-popup");
128-
129-
if (popup != null && popup.style.display == DisplayStyle.Flex)
130-
{
131-
SetState(AccessibilityState.Expanded);
132-
}
133-
else
134-
{
135-
SetState(AccessibilityState.Collapsed);
136-
}
137-
#endif // UNITY_6000_3_OR_NEWER
138-
*/
139137
}
140138
}
141139
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using UnityEngine.Accessibility;
2+
using UnityEngine.Scripting;
3+
using UnityEngine.UIElements;
4+
5+
namespace Unity.Samples.ScreenReader
6+
{
7+
[Preserve]
8+
class RadioButtonHandler : BaseFieldHandler<bool>
9+
{
10+
public RadioButtonHandler()
11+
{
12+
selected += () =>
13+
{
14+
using var evt = NavigationSubmitEvent.GetPooled();
15+
evt.target = ownerElement;
16+
ownerElement.SendEvent(evt);
17+
18+
return true;
19+
};
20+
}
21+
22+
public override string GetValue() => "";
23+
24+
#if UNITY_2023_3_OR_NEWER
25+
public override AccessibilityRole GetRole() => AccessibilityRole.Toggle;
26+
#endif // UNITY_2023_3_OR_NEWER
27+
28+
public override AccessibilityState GetState() => ownerElement is RadioButton { value: true }
29+
? AccessibilityState.Selected
30+
: AccessibilityState.None;
31+
}
32+
}

Assets/Scripts/Screen Reader/UITk/Handlers/RadioButtonHandler.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/Screen Reader/UITk/Handlers/SliderHandler.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public void Step(bool incr)
3030
slider.value += step;
3131
}
3232

33+
public override string GetValue()
34+
{
35+
return ownerElement is Slider field ? $"{field.value:P0}" : "";
36+
}
37+
3338
#if UNITY_2023_3_OR_NEWER
3439
public override AccessibilityRole GetRole() => AccessibilityRole.Slider;
3540
#endif // UNITY_2023_3_OR_NEWER

Assets/Scripts/Screen Reader/UITk/Handlers/TextFieldHandler.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@ class TextFieldFieldHandler : BaseFieldHandler<string>
1111
{
1212
public TextFieldFieldHandler()
1313
{
14-
selected += () =>
14+
focused += focused =>
1515
{
1616
var textField = ownerElement as TextField;
17-
textField?.Focus();
1817

19-
return true;
18+
if (focused)
19+
{
20+
textField?.Focus();
21+
}
22+
else
23+
{
24+
textField?.Blur();
25+
}
2026
};
2127
}
2228

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using UnityEngine.Accessibility;
2+
using UnityEngine.Scripting;
3+
using UnityEngine.UIElements;
4+
5+
namespace Unity.Samples.ScreenReader
6+
{
7+
[Preserve]
8+
class ToggleHandler : BaseFieldHandler<bool>
9+
{
10+
public ToggleHandler()
11+
{
12+
selected += () =>
13+
{
14+
using var evt = NavigationSubmitEvent.GetPooled();
15+
evt.target = ownerElement;
16+
ownerElement.SendEvent(evt);
17+
18+
return true;
19+
};
20+
}
21+
22+
public override string GetValue() => "";
23+
24+
#if UNITY_2023_3_OR_NEWER
25+
public override AccessibilityRole GetRole() => AccessibilityRole.Toggle;
26+
#endif // UNITY_2023_3_OR_NEWER
27+
28+
public override AccessibilityState GetState() => ownerElement is Toggle { value: true }
29+
? AccessibilityState.Selected
30+
: AccessibilityState.None;
31+
}
32+
}

0 commit comments

Comments
 (0)