From c743662add0573283ea443f1c8682924ef4357fe Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Wed, 4 Nov 2026 05:46:56 -0800 Subject: [PATCH] Accessibility: a set-value request without a number leaves a dialog slider as it is --- crates/ui-egui/src/dialogs/tests.rs | 3 +++ crates/ui-egui/src/widgets/color.rs | 12 ++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/ui-egui/src/dialogs/tests.rs b/crates/ui-egui/src/dialogs/tests.rs index b52328dd1..782b3de29 100644 --- a/crates/ui-egui/src/dialogs/tests.rs +++ b/crates/ui-egui/src/dialogs/tests.rs @@ -2056,6 +2056,9 @@ fn screen_readers_set_a_dialog_slider_number() { assert_eq!(angle(&app), -90.0, "not a number"); f.run(&mut app, vec![set(30.0), set(f64::INFINITY)]); assert_eq!(angle(&app), -90.0, "the last request is not a finite number"); + let empty = ActionRequest { action: Action::SetValue, target_node: node, target_tree: TreeId::ROOT, data: None }; + f.run(&mut app, vec![set(30.0), egui::Event::AccessKitActionRequest(empty)]); + assert_eq!(angle(&app), -90.0, "the last request has no number"); // A field past its rail's end extends the range screen readers get, and a set value can go // that far: Transform Each's Horizontal Scale at 300% on a rail that ends at 200%. app.ui.dialog = None; diff --git a/crates/ui-egui/src/widgets/color.rs b/crates/ui-egui/src/widgets/color.rs index b982d1707..cb44bfe04 100644 --- a/crates/ui-egui/src/widgets/color.rs +++ b/crates/ui-egui/src/widgets/color.rs @@ -249,14 +249,10 @@ fn rail_step(ui: &Ui, id: egui::Id, focused: bool, s: &SliderValue) -> Option Some(value), - _ => None, - }) - .last() - .filter(|value| value.is_finite()); + let set = i.accesskit_action_requests(id, Action::SetValue).last().and_then(|request| match request.data { + Some(ActionData::NumericValue(value)) if value.is_finite() => Some(value), + _ => None, + }); if let Some(value) = set { // The number the field would show, as `SliderValue::field` reads it. let shown = s.decimals.map_or(value, |d| field_text(value, "", d).parse().unwrap_or(value));