Fix AccessKit node bounds (#18706)
# Objective Fixes #18685 ## Solution * Don't apply the camera translation. * Calculate the min and max bounds of the accessibility node rect taking the UI translation relative to its center not the top-left corner. ## Testing Install [NVDA](https://www.nvaccess.org/). In NVDA set `Preferences -> Settings -> Vision -> Enable Highlighting`. Then run bevy's `tab_navigation` example: ``` cargo run --example tab_navigation ``` If everything is working correctly, NVDA should draw a border around the currently selected tab button: 
This commit is contained in:
parent
c439fdb34c
commit
3cd83031e1
@ -13,7 +13,8 @@ use bevy_ecs::{
|
|||||||
system::{Commands, Query},
|
system::{Commands, Query},
|
||||||
world::Ref,
|
world::Ref,
|
||||||
};
|
};
|
||||||
use bevy_render::{camera::CameraUpdateSystem, prelude::Camera};
|
use bevy_math::Vec3Swizzles;
|
||||||
|
use bevy_render::camera::CameraUpdateSystem;
|
||||||
use bevy_transform::prelude::GlobalTransform;
|
use bevy_transform::prelude::GlobalTransform;
|
||||||
|
|
||||||
use accesskit::{Node, Rect, Role};
|
use accesskit::{Node, Rect, Role};
|
||||||
@ -36,28 +37,20 @@ fn calc_label(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn calc_bounds(
|
fn calc_bounds(
|
||||||
camera: Query<(&Camera, &GlobalTransform)>,
|
|
||||||
mut nodes: Query<(
|
mut nodes: Query<(
|
||||||
&mut AccessibilityNode,
|
&mut AccessibilityNode,
|
||||||
Ref<ComputedNode>,
|
Ref<ComputedNode>,
|
||||||
Ref<GlobalTransform>,
|
Ref<GlobalTransform>,
|
||||||
)>,
|
)>,
|
||||||
) {
|
) {
|
||||||
if let Ok((camera, camera_transform)) = camera.single() {
|
for (mut accessible, node, transform) in &mut nodes {
|
||||||
for (mut accessible, node, transform) in &mut nodes {
|
if node.is_changed() || transform.is_changed() {
|
||||||
if node.is_changed() || transform.is_changed() {
|
let center = transform.translation().xy();
|
||||||
if let Ok(translation) =
|
let half_size = 0.5 * node.size;
|
||||||
camera.world_to_viewport(camera_transform, transform.translation())
|
let min = center - half_size;
|
||||||
{
|
let max = center + half_size;
|
||||||
let bounds = Rect::new(
|
let bounds = Rect::new(min.x as f64, min.y as f64, max.x as f64, max.y as f64);
|
||||||
translation.x.into(),
|
accessible.set_bounds(bounds);
|
||||||
translation.y.into(),
|
|
||||||
(translation.x + node.size.x).into(),
|
|
||||||
(translation.y + node.size.y).into(),
|
|
||||||
);
|
|
||||||
accessible.set_bounds(bounds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user