#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Role {
Button,
ToggleButton,
CheckBox,
Radio,
Switch,
ComboBox,
TextBox,
SpinButton,
Slider,
ScrollBar,
ProgressBar,
Meter,
Label,
Link,
Image,
List,
ListItem,
Separator,
Tab,
TabList,
TabPanel,
MenuItem,
Dialog,
Window,
Other(String),
}
impl Role {
pub fn element_name(&self) -> &str {
match self {
Role::Button => "Button",
Role::ToggleButton => "ToggleButton",
Role::CheckBox => "CheckBox",
Role::Radio => "Radio",
Role::Switch => "Switch",
Role::ComboBox => "ComboBox",
Role::TextBox => "TextBox",
Role::SpinButton => "SpinButton",
Role::Slider => "Slider",
Role::ScrollBar => "ScrollBar",
Role::ProgressBar => "ProgressBar",
Role::Meter => "Meter",
Role::Label => "Label",
Role::Link => "Link",
Role::Image => "Image",
Role::List => "List",
Role::ListItem => "ListItem",
Role::Separator => "Separator",
Role::Tab => "Tab",
Role::TabList => "TabList",
Role::TabPanel => "TabPanel",
Role::MenuItem => "MenuItem",
Role::Dialog => "Dialog",
Role::Window => "Window",
Role::Other(s) => s.as_str(),
}
}
pub fn element_names(&self) -> Vec<&str> {
match self {
Role::CheckBox => vec!["CheckBox", "Checkbox"],
Role::TextBox => vec!["TextBox", "Text", "Entry"],
Role::Radio => vec!["Radio", "RadioButton"],
Role::Meter => vec!["Meter", "LevelBar"],
Role::Tab => vec!["Tab", "PageTab"],
Role::TabList => vec!["TabList", "PageTabList"],
Role::Window => vec!["Window", "Frame"],
_ => vec![self.element_name()],
}
}
}
#[cfg(test)]
mod tests {
use super::Role;
#[test]
fn named_roles_map_to_gtk4_element_names() {
assert_eq!(Role::Button.element_name(), "Button");
assert_eq!(Role::TextBox.element_name(), "TextBox");
assert_eq!(Role::CheckBox.element_name(), "CheckBox");
assert_eq!(Role::Radio.element_name(), "Radio");
assert_eq!(Role::Meter.element_name(), "Meter");
}
#[test]
fn other_passes_element_name_through_verbatim() {
assert_eq!(Role::Other("Calendar".into()).element_name(), "Calendar");
}
#[test]
fn non_divergent_roles_have_a_single_element_name() {
assert_eq!(Role::Button.element_names(), vec!["Button"]);
assert_eq!(Role::ComboBox.element_names(), vec!["ComboBox"]);
assert_eq!(
Role::Other("Calendar".into()).element_names(),
vec!["Calendar"]
);
}
#[test]
fn divergent_roles_carry_reference_tag_first_then_aliases() {
for role in [Role::CheckBox, Role::TextBox, Role::Radio, Role::Meter] {
let names = role.element_names();
assert_eq!(names[0], role.element_name());
assert!(names.len() > 1, "{role:?} should expose an alias");
}
assert_eq!(Role::CheckBox.element_names(), vec!["CheckBox", "Checkbox"]);
assert_eq!(Role::Tab.element_names(), vec!["Tab", "PageTab"]);
}
}