use bevy_a11y::AccessibilityNode;
use bevy_ecs::{
component::Component,
lifecycle::{Add, Remove},
observer::On,
reflect::ReflectComponent,
world::DeferredWorld,
};
use bevy_reflect::std_traits::ReflectDefault;
use bevy_reflect::Reflect;
#[derive(Component, Debug, Clone, Copy, Default, Reflect)]
#[reflect(Component, Default, Clone)]
pub struct InteractionDisabled;
pub(crate) fn on_add_disabled(add: On<Add, InteractionDisabled>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_disabled();
}
}
pub(crate) fn on_remove_disabled(
remove: On<Remove, InteractionDisabled>,
mut world: DeferredWorld,
) {
let mut entity = world.entity_mut(remove.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.clear_disabled();
}
}
#[derive(Component, Debug, Clone, Copy, Default, Reflect)]
#[reflect(Component, Default, Clone)]
pub struct Pressed;
#[derive(Component, Debug, Clone, Copy, Default, Reflect)]
#[reflect(Component, Default, Clone)]
pub struct Checkable;
#[derive(Component, Debug, Clone, Copy, Default, Reflect)]
#[reflect(Component, Default, Clone)]
pub struct Checked;
pub(crate) fn on_add_checkable(add: On<Add, Checkable>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
let checked = entity.get::<Checked>().is_some();
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_toggled(match checked {
true => accesskit::Toggled::True,
false => accesskit::Toggled::False,
});
}
}
pub(crate) fn on_remove_checkable(add: On<Remove, Checkable>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.clear_toggled();
}
}
pub(crate) fn on_add_checked(add: On<Add, Checked>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_toggled(accesskit::Toggled::True);
}
}
pub(crate) fn on_remove_checked(remove: On<Remove, Checked>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(remove.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_toggled(accesskit::Toggled::False);
}
}
#[derive(Component, Default, Debug)]
pub struct Selectable;
#[derive(Component, Default, Debug, Clone)]
pub struct Selected;
pub(crate) fn on_add_selectable(add: On<Add, Selectable>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
let selected = entity.get::<Selected>().is_some();
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_selected(selected);
}
}
pub(crate) fn on_remove_selectable(add: On<Add, Selectable>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.clear_selected();
}
}
pub(crate) fn on_add_selected(add: On<Add, Selected>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(add.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_selected(true);
}
}
pub(crate) fn on_remove_selected(remove: On<Remove, Selected>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(remove.entity);
if let Some(mut accessibility) = entity.get_mut::<AccessibilityNode>() {
accessibility.set_selected(false);
}
}