1use crate::runtime::ElementId;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
4#[non_exhaustive]
5pub enum AccessibleRole {
6 Button,
7 Text,
8 TextField,
9 TextArea,
10 Checkbox,
11 Switch,
12 Slider,
13 List,
14 ListItem,
15 Table,
16 Tree,
17 TreeItem,
18 Dialog,
19 Menu,
20 MenuItem,
21 Progress,
22 Image,
23 Group,
24 Radio,
25 RadioGroup,
26}
27
28#[derive(Clone, Debug, PartialEq, Eq)]
29pub struct Accessible {
30 pub role: AccessibleRole,
31 pub label: String,
32
33 pub value: Option<String>,
36
37 pub caret: Option<usize>,
39
40 pub selection: Option<(usize, usize)>,
42
43 pub disabled: bool,
44}
45
46impl Accessible {
47 pub fn new(role: AccessibleRole, label: impl Into<String>) -> Self {
48 Self {
49 role,
50 label: label.into(),
51 value: None,
52 caret: None,
53 selection: None,
54 disabled: false,
55 }
56 }
57
58 pub fn value(mut self, value: impl Into<String>) -> Self {
59 self.value = Some(value.into());
60 self
61 }
62
63 pub fn caret(mut self, caret: Option<usize>) -> Self {
64 self.caret = caret;
65 self
66 }
67
68 pub fn selection(mut self, selection: Option<(usize, usize)>) -> Self {
69 self.selection = selection;
70 self
71 }
72
73 pub fn disabled(mut self, disabled: bool) -> Self {
74 self.disabled = disabled;
75 self
76 }
77}
78
79#[derive(Clone, Debug, PartialEq, Eq)]
80pub struct AccessibleNode {
81 pub element: ElementId,
82 pub role: AccessibleRole,
83 pub label: String,
84 pub value: Option<String>,
85 pub caret: Option<usize>,
86 pub selection: Option<(usize, usize)>,
87 pub disabled: bool,
88 pub children: Vec<AccessibleNode>,
89}
90
91impl AccessibleNode {
92 pub fn flat_labels(&self) -> Vec<String> {
93 let mut out = vec![self.label.clone()];
94 for c in &self.children {
95 out.extend(c.flat_labels());
96 }
97 out
98 }
99}