1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 06:10:06 -04:00

Update accesskit to 0.17 (#5372)

Updates accesskit and kittest. 

* [x] I have followed the instructions in the PR template
This commit is contained in:
lucasmerlin
2024-11-26 15:16:08 +01:00
committed by GitHub
parent 2f9b14def8
commit e28505077d
13 changed files with 56 additions and 54 deletions

View File

@@ -69,7 +69,7 @@ winit = { workspace = true, default-features = false }
#! ### Optional dependencies
# feature accesskit
accesskit_winit = { version = "0.22", optional = true }
accesskit_winit = { version = "0.23", optional = true }
## Enable this when generating docs.
document-features = { workspace = true, optional = true }

View File

@@ -87,7 +87,7 @@ ahash.workspace = true
nohash-hasher.workspace = true
#! ### Optional dependencies
accesskit = { version = "0.16", optional = true }
accesskit = { version = "0.17.0", optional = true }
backtrace = { workspace = true, optional = true }

View File

@@ -552,13 +552,13 @@ impl ContextImpl {
crate::profile_scope!("accesskit");
use crate::pass_state::AccessKitPassState;
let id = crate::accesskit_root_id();
let mut builder = accesskit::NodeBuilder::new(accesskit::Role::Window);
let mut root_node = accesskit::Node::new(accesskit::Role::Window);
let pixels_per_point = viewport.input.pixels_per_point();
builder.set_transform(accesskit::Affine::scale(pixels_per_point.into()));
let mut node_builders = IdMap::default();
node_builders.insert(id, builder);
root_node.set_transform(accesskit::Affine::scale(pixels_per_point.into()));
let mut nodes = IdMap::default();
nodes.insert(id, root_node);
viewport.this_pass.accesskit_state = Some(AccessKitPassState {
node_builders,
nodes,
parent_stack: vec![id],
});
}
@@ -640,9 +640,9 @@ impl ContextImpl {
}
#[cfg(feature = "accesskit")]
fn accesskit_node_builder(&mut self, id: Id) -> &mut accesskit::NodeBuilder {
fn accesskit_node_builder(&mut self, id: Id) -> &mut accesskit::Node {
let state = self.viewport().this_pass.accesskit_state.as_mut().unwrap();
let builders = &mut state.node_builders;
let builders = &mut state.nodes;
if let std::collections::hash_map::Entry::Vacant(entry) = builders.entry(id) {
entry.insert(Default::default());
let parent_id = state.parent_stack.last().unwrap();
@@ -1281,7 +1281,7 @@ impl Context {
#[cfg(feature = "accesskit")]
if enabled
&& sense.click
&& input.has_accesskit_action_request(id, accesskit::Action::Default)
&& input.has_accesskit_action_request(id, accesskit::Action::Click)
{
res.fake_primary_click = true;
}
@@ -2361,9 +2361,9 @@ impl ContextImpl {
let root_id = crate::accesskit_root_id().accesskit_id();
let nodes = {
state
.node_builders
.nodes
.into_iter()
.map(|(id, builder)| (id.accesskit_id(), builder.build()))
.map(|(id, node)| (id.accesskit_id(), node))
.collect()
};
let focus_id = self
@@ -3272,7 +3272,7 @@ impl Context {
pub fn accesskit_node_builder<R>(
&self,
id: Id,
writer: impl FnOnce(&mut accesskit::NodeBuilder) -> R,
writer: impl FnOnce(&mut accesskit::Node) -> R,
) -> Option<R> {
self.write(|ctx| {
ctx.viewport()

View File

@@ -70,7 +70,7 @@ impl ScrollTarget {
#[cfg(feature = "accesskit")]
#[derive(Clone)]
pub struct AccessKitPassState {
pub node_builders: IdMap<accesskit::NodeBuilder>,
pub nodes: IdMap<accesskit::Node>,
pub parent_stack: Vec<Id>,
}

View File

@@ -988,7 +988,7 @@ impl Response {
}
#[cfg(feature = "accesskit")]
pub(crate) fn fill_accesskit_node_common(&self, builder: &mut accesskit::NodeBuilder) {
pub(crate) fn fill_accesskit_node_common(&self, builder: &mut accesskit::Node) {
if !self.enabled {
builder.set_disabled();
}
@@ -1001,15 +1001,15 @@ impl Response {
if self.sense.focusable {
builder.add_action(accesskit::Action::Focus);
}
if self.sense.click && builder.default_action_verb().is_none() {
builder.set_default_action_verb(accesskit::DefaultActionVerb::Click);
if self.sense.click {
builder.add_action(accesskit::Action::Click);
}
}
#[cfg(feature = "accesskit")]
fn fill_accesskit_node_from_widget_info(
&self,
builder: &mut accesskit::NodeBuilder,
builder: &mut accesskit::Node,
info: crate::WidgetInfo,
) {
use crate::WidgetType;
@@ -1039,7 +1039,11 @@ impl Response {
builder.set_disabled();
}
if let Some(label) = info.label {
builder.set_name(label);
if matches!(builder.role(), Role::Label) {
builder.set_value(label);
} else {
builder.set_label(label);
}
}
if let Some(value) = info.current_text_value {
builder.set_value(value);

View File

@@ -29,8 +29,6 @@ pub fn update_accesskit_for_text_widget(
});
}
builder.set_default_action_verb(accesskit::DefaultActionVerb::Focus);
builder.set_role(role);
parent_id
@@ -44,7 +42,7 @@ pub fn update_accesskit_for_text_widget(
for (row_index, row) in galley.rows.iter().enumerate() {
let row_id = parent_id.with(row_index);
ctx.accesskit_node_builder(row_id, |builder| {
builder.set_role(accesskit::Role::InlineTextBox);
builder.set_role(accesskit::Role::TextRun);
let rect = row.rect.translate(galley_pos.to_vec2());
builder.set_bounds(accesskit::Rect {
x0: rect.min.x.into(),

View File

@@ -686,7 +686,7 @@ impl<'a> Widget for DragValue<'a> {
}
// The name field is set to the current value by the button,
// but we don't want it set that way on this widget type.
builder.clear_name();
builder.clear_label();
// Always expose the value as a string. This makes the widget
// more stable to accessibility users as it switches
// between edit and button modes. This is particularly important

View File

@@ -46,7 +46,7 @@ fn button_node() {
.find(|(_, node)| node.role() == Role::Button)
.expect("Button should exist in the accesskit output");
assert_eq!(button.name(), Some(button_text));
assert_eq!(button.label(), Some(button_text));
assert!(!button.is_disabled());
}
@@ -72,7 +72,7 @@ fn disabled_button_node() {
.find(|(_, node)| node.role() == Role::Button)
.expect("Button should exist in the accesskit output");
assert_eq!(button.name(), Some(button_text));
assert_eq!(button.label(), Some(button_text));
assert!(button.is_disabled());
}
@@ -97,7 +97,7 @@ fn toggle_button_node() {
.find(|(_, node)| node.role() == Role::Button)
.expect("Toggle button should exist in the accesskit output");
assert_eq!(toggle.name(), Some(button_text));
assert_eq!(toggle.label(), Some(button_text));
assert!(!toggle.is_disabled());
}
@@ -165,14 +165,14 @@ fn accesskit_output_single_egui_frame(run_ui: impl FnMut(&Context)) -> TreeUpdat
}
#[track_caller]
fn assert_button_exists(tree: &TreeUpdate, name: &str, parent: NodeId) {
fn assert_button_exists(tree: &TreeUpdate, label: &str, parent: NodeId) {
let (node_id, _) = tree
.nodes
.iter()
.find(|(_, node)| {
!node.is_hidden() && node.role() == Role::Button && node.name() == Some(name)
!node.is_hidden() && node.role() == Role::Button && node.label() == Some(label)
})
.expect("No visible button with that name exists.");
.expect("No visible button with that label exists.");
assert_parent_child(tree, parent, *node_id);
}
@@ -183,7 +183,7 @@ fn assert_window_exists(tree: &TreeUpdate, title: &str, parent: NodeId) -> NodeI
.nodes
.iter()
.find(|(_, node)| {
!node.is_hidden() && node.role() == Role::Window && node.name() == Some(title)
!node.is_hidden() && node.role() == Role::Window && node.label() == Some(title)
})
.expect("No visible window with that title exists.");

View File

@@ -409,7 +409,7 @@ mod tests {
let window = harness.node().children().next().unwrap();
// TODO(lucasmerlin): Windows should probably have a label?
//let window = harness.get_by_name(name);
//let window = harness.get_by_label(name);
let size = window.raw_bounds().expect("window bounds").size();
harness.set_size(Vec2::new(size.width as f32, size.height as f32));

View File

@@ -20,13 +20,13 @@ fn main() {
let mut harness = Harness::builder().with_size(egui::Vec2::new(200.0, 100.0)).build(app);
let checkbox = harness.get_by_name("Check me!");
let checkbox = harness.get_by_label("Check me!");
assert_eq!(checkbox.toggled(), Some(Toggled::False));
checkbox.click();
harness.run();
let checkbox = harness.get_by_name("Check me!");
let checkbox = harness.get_by_label("Check me!");
assert_eq!(checkbox.toggled(), Some(Toggled::True));
// You can even render the ui and do image snapshot tests

View File

@@ -56,7 +56,7 @@ impl<State> HarnessBuilder<State> {
/// });
/// }, checked);
///
/// harness.get_by_name("Check me!").click();
/// harness.get_by_label("Check me!").click();
/// harness.run();
///
/// assert_eq!(*harness.state(), true);
@@ -85,7 +85,7 @@ impl<State> HarnessBuilder<State> {
/// ui.checkbox(checked, "Check me!");
/// }, checked);
///
/// harness.get_by_name("Check me!").click();
/// harness.get_by_label("Check me!").click();
/// harness.run();
///
/// assert_eq!(*harness.state(), true);

View File

@@ -119,7 +119,7 @@ impl<'a, State> Harness<'a, State> {
/// });
/// }, checked);
///
/// harness.get_by_name("Check me!").click();
/// harness.get_by_label("Check me!").click();
/// harness.run();
///
/// assert_eq!(*harness.state(), true);
@@ -144,7 +144,7 @@ impl<'a, State> Harness<'a, State> {
/// ui.checkbox(checked, "Check me!");
/// }, checked);
///
/// harness.get_by_name("Check me!").click();
/// harness.get_by_label("Check me!").click();
/// harness.run();
///
/// assert_eq!(*harness.state(), true);