Skip to main content

sequoia_view/
a11y.rs

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    /// Current text value for inputs. Secure fields expose their masked value,
34    /// never the real one.
35    pub value: Option<String>,
36
37    /// Caret position in the value, in characters.
38    pub caret: Option<usize>,
39
40    /// Selection range in characters, `(start, end)`.
41    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}