diff --git a/crates/egui/src/widgets/drag_value.rs b/crates/egui/src/widgets/drag_value.rs index 1cf5ba7b..f0f35c1e 100644 --- a/crates/egui/src/widgets/drag_value.rs +++ b/crates/egui/src/widgets/drag_value.rs @@ -451,10 +451,11 @@ impl Widget for DragValue<'_> { // it is immediately rendered in edit mode, rather than being rendered // in button mode for just one frame. This is important for // screen readers. - let is_kb_editing = ui.memory_mut(|mem| { - mem.interested_in_focus(id, ui.layer_id()); - mem.has_focus(id) - }); + let is_kb_editing = ui.is_enabled() + && ui.memory_mut(|mem| { + mem.interested_in_focus(id, ui.layer_id()); + mem.has_focus(id) + }); if ui.memory_mut(|mem| mem.gained_focus(id)) { ui.data_mut(|data| data.remove::(id)); diff --git a/crates/egui_kittest/tests/regression_tests.rs b/crates/egui_kittest/tests/regression_tests.rs index e7186dca..bd3f7926 100644 --- a/crates/egui_kittest/tests/regression_tests.rs +++ b/crates/egui_kittest/tests/regression_tests.rs @@ -29,6 +29,31 @@ pub fn focus_should_skip_over_disabled_buttons() { assert!(button_1.is_focused()); } +#[test] +pub fn focus_should_skip_over_disabled_drag_values() { + let mut value_1: u16 = 1; + let mut value_2: u16 = 2; + let mut value_3: u16 = 3; + + let mut harness = Harness::new_ui(|ui| { + ui.add(egui::DragValue::new(&mut value_1)); + ui.add_enabled(false, egui::DragValue::new(&mut value_2)); + ui.add(egui::DragValue::new(&mut value_3)); + }); + + harness.press_key(egui::Key::Tab); + harness.run(); + + let drag_value_1 = harness.get_by(|node| node.numeric_value() == Some(1.0)); + assert!(drag_value_1.is_focused()); + + harness.press_key(egui::Key::Tab); + harness.run(); + + let drag_value_3 = harness.get_by(|node| node.numeric_value() == Some(3.0)); + assert!(drag_value_3.is_focused()); +} + #[test] fn image_failed() { let mut harness = Harness::new_ui(|ui| {