mirror of
https://github.com/bevyengine/bevy
synced 2025-01-21 17:44:09 +00:00
89cbc78d3d
# Objective Be consistent with `Resource`s and `Components` and have `Event` types be more self-documenting. Although not susceptible to accidentally using a function instead of a value due to `Event`s only being initialized by their type, much of the same reasoning for removing the blanket impl on `Resource` also applies here. * Not immediately obvious if a type is intended to be an event * Prevent invisible conflicts if the same third-party or primitive types are used as events * Allows for further extensions (e.g. opt-in warning for missed events) ## Solution Remove the blanket impl for the `Event` trait. Add a derive macro for it. --- ## Changelog - `Event` is no longer implemented for all applicable types. Add the `#[derive(Event)]` macro for events. ## Migration Guide * Add the `#[derive(Event)]` macro for events. Third-party types used as events should be wrapped in a newtype.
75 lines
2.3 KiB
Rust
75 lines
2.3 KiB
Rust
//! Accessibility for Bevy
|
|
|
|
#![warn(missing_docs)]
|
|
#![allow(clippy::type_complexity)]
|
|
#![forbid(unsafe_code)]
|
|
|
|
use std::{
|
|
num::NonZeroU128,
|
|
sync::{atomic::AtomicBool, Arc},
|
|
};
|
|
|
|
pub use accesskit;
|
|
use accesskit::{NodeBuilder, NodeId};
|
|
use bevy_app::Plugin;
|
|
use bevy_derive::{Deref, DerefMut};
|
|
use bevy_ecs::{
|
|
prelude::{Component, Entity, Event},
|
|
system::Resource,
|
|
};
|
|
|
|
/// Wrapper struct for [`accesskit::ActionRequest`]. Required to allow it to be used as an `Event`.
|
|
#[derive(Event, Deref, DerefMut)]
|
|
pub struct ActionRequest(pub accesskit::ActionRequest);
|
|
|
|
/// Resource that tracks whether an assistive technology has requested
|
|
/// accessibility information.
|
|
///
|
|
/// Useful if a third-party plugin needs to conditionally integrate with
|
|
/// `AccessKit`
|
|
#[derive(Resource, Default, Clone, Debug, Deref, DerefMut)]
|
|
pub struct AccessibilityRequested(Arc<AtomicBool>);
|
|
|
|
/// Component to wrap a [`accesskit::Node`], representing this entity to the platform's
|
|
/// accessibility API.
|
|
///
|
|
/// If an entity has a parent, and that parent also has an `AccessibilityNode`,
|
|
/// the entity's node will be a child of the parent's node.
|
|
///
|
|
/// If the entity doesn't have a parent, or if the immediate parent doesn't have
|
|
/// an `AccessibilityNode`, its node will be an immediate child of the primary window.
|
|
#[derive(Component, Clone, Deref, DerefMut)]
|
|
pub struct AccessibilityNode(pub NodeBuilder);
|
|
|
|
impl From<NodeBuilder> for AccessibilityNode {
|
|
fn from(node: NodeBuilder) -> Self {
|
|
Self(node)
|
|
}
|
|
}
|
|
|
|
/// Extensions to ease integrating entities with [`AccessKit`](https://accesskit.dev).
|
|
pub trait AccessKitEntityExt {
|
|
/// Convert an entity to a stable [`NodeId`].
|
|
fn to_node_id(&self) -> NodeId;
|
|
}
|
|
|
|
impl AccessKitEntityExt for Entity {
|
|
fn to_node_id(&self) -> NodeId {
|
|
let id = NonZeroU128::new(self.to_bits() as u128 + 1);
|
|
NodeId(id.unwrap())
|
|
}
|
|
}
|
|
|
|
/// Resource representing which entity has keyboard focus, if any.
|
|
#[derive(Resource, Default, Deref, DerefMut)]
|
|
pub struct Focus(Option<Entity>);
|
|
|
|
/// Plugin managing non-GUI aspects of integrating with accessibility APIs.
|
|
pub struct AccessibilityPlugin;
|
|
|
|
impl Plugin for AccessibilityPlugin {
|
|
fn build(&self, app: &mut bevy_app::App) {
|
|
app.init_resource::<AccessibilityRequested>()
|
|
.init_resource::<Focus>();
|
|
}
|
|
}
|