use crate::{ experimental::UiChildren, prelude::{Button, Label}, widget::{ImageNode, TextUiReader}, ComputedNode, }; use bevy_a11y::AccessibilityNode; use bevy_app::{App, Plugin, PostUpdate}; use bevy_ecs::{ prelude::{DetectChanges, Entity}, query::{Changed, Without}, schedule::IntoScheduleConfigs, system::{Commands, Query}, world::Ref, }; use bevy_math::Vec3Swizzles; use bevy_render::camera::CameraUpdateSystem; use bevy_transform::prelude::GlobalTransform; use accesskit::{Node, Rect, Role}; fn calc_label( text_reader: &mut TextUiReader, children: impl Iterator, ) -> Option> { let mut name = None; for child in children { let values = text_reader .iter(child) .map(|(_, _, text, _, _)| text.into()) .collect::>(); if !values.is_empty() { name = Some(values.join(" ")); } } name.map(String::into_boxed_str) } fn calc_bounds( mut nodes: Query<( &mut AccessibilityNode, Ref, Ref, )>, ) { for (mut accessible, node, transform) in &mut nodes { if node.is_changed() || transform.is_changed() { let center = transform.translation().xy(); let half_size = 0.5 * node.size; let min = center - half_size; let max = center + half_size; let bounds = Rect::new(min.x as f64, min.y as f64, max.x as f64, max.y as f64); accessible.set_bounds(bounds); } } } fn button_changed( mut commands: Commands, mut query: Query<(Entity, Option<&mut AccessibilityNode>), Changed