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(remove: On<Remove<Checkable>>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(remove.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(remove: On<Remove<Selectable>>, mut world: DeferredWorld) {
let mut entity = world.entity_mut(remove.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);
}
}