1#![forbid(unsafe_code)]
2#![cfg_attr(docsrs, feature(doc_auto_cfg))]
3#![doc(
4 html_logo_url = "https://bevyengine.org/assets/icon.png",
5 html_favicon_url = "https://bevyengine.org/assets/icon.png"
6)]
7#![no_std]
8
9#[cfg(feature = "std")]
18extern crate std;
19
20extern crate alloc;
21
22use alloc::sync::Arc;
23use core::sync::atomic::{AtomicBool, Ordering};
24
25use accesskit::Node;
26use bevy_app::Plugin;
27use bevy_derive::{Deref, DerefMut};
28use bevy_ecs::{
29 prelude::{Component, Event},
30 resource::Resource,
31 schedule::SystemSet,
32};
33
34#[cfg(feature = "bevy_reflect")]
35use {
36 bevy_ecs::reflect::ReflectResource, bevy_reflect::std_traits::ReflectDefault,
37 bevy_reflect::Reflect,
38};
39
40#[cfg(feature = "serialize")]
41use serde::{Deserialize, Serialize};
42
43#[cfg(all(feature = "bevy_reflect", feature = "serialize"))]
44use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
45
46#[derive(Event, Deref, DerefMut)]
48#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
49pub struct ActionRequest(pub accesskit::ActionRequest);
50
51#[derive(Resource, Default, Clone, Debug, Deref, DerefMut)]
57#[cfg_attr(
58 feature = "bevy_reflect",
59 derive(Reflect),
60 reflect(Default, Clone, Resource)
61)]
62pub struct AccessibilityRequested(Arc<AtomicBool>);
63
64impl AccessibilityRequested {
65 pub fn get(&self) -> bool {
68 self.load(Ordering::SeqCst)
69 }
70
71 pub fn set(&self, value: bool) {
73 self.store(value, Ordering::SeqCst);
74 }
75}
76
77#[derive(Resource, Clone, Debug, Deref, DerefMut)]
84#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
85#[cfg_attr(
86 feature = "bevy_reflect",
87 derive(Reflect),
88 reflect(Resource, Clone, Default)
89)]
90#[cfg_attr(
91 all(feature = "bevy_reflect", feature = "serialize"),
92 reflect(Serialize, Deserialize)
93)]
94pub struct ManageAccessibilityUpdates(bool);
95
96impl Default for ManageAccessibilityUpdates {
97 fn default() -> Self {
98 Self(true)
99 }
100}
101
102impl ManageAccessibilityUpdates {
103 pub fn get(&self) -> bool {
105 self.0
106 }
107
108 pub fn set(&mut self, value: bool) {
110 self.0 = value;
111 }
112}
113
114#[derive(Component, Clone, Deref, DerefMut)]
123#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
124pub struct AccessibilityNode(pub Node);
125
126impl From<Node> for AccessibilityNode {
127 fn from(node: Node) -> Self {
128 Self(node)
129 }
130}
131
132#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
134#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
135#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
136#[cfg_attr(
137 all(feature = "bevy_reflect", feature = "serialize"),
138 reflect(Serialize, Deserialize, Clone)
139)]
140pub enum AccessibilitySystem {
141 Update,
143}
144
145#[derive(Default)]
147pub struct AccessibilityPlugin;
148
149impl Plugin for AccessibilityPlugin {
150 fn build(&self, app: &mut bevy_app::App) {
151 app.init_resource::<AccessibilityRequested>()
152 .init_resource::<ManageAccessibilityUpdates>()
153 .allow_ambiguous_component::<AccessibilityNode>();
154 }
155}