diff --git a/crates/egui/src/memory/mod.rs b/crates/egui/src/memory/mod.rs index 4910d81da..d88556264 100644 --- a/crates/egui/src/memory/mod.rs +++ b/crates/egui/src/memory/mod.rs @@ -618,6 +618,27 @@ impl Focus { self.id_requested_by_accesskit = Some(*target_node); } } + + // `interested_in_focus` only picks the request up once the widget runs, which is too late + // for anything that reads the focus before it — styling the widget, for one. A widget in + // the cache asked for focus in an earlier pass, so it is one we can hand focus to now. + let accesskit_focus = self.id_requested_by_accesskit.and_then(|node_id| { + self.focus_widgets_cache + .keys() + .find(|id| id.accesskit_id() == node_id) + .copied() + }); + if let Some(id) = accesskit_focus { + self.take_focus_from_accesskit(id); + } + } + + /// Give a widget the focus that AccessKit asked for. + fn take_focus_from_accesskit(&mut self, id: Id) { + self.focused_widget = Some(FocusWidget::new(id)); + self.id_requested_by_accesskit = None; + self.give_to_next = false; + self.reset_focus(); } pub(crate) fn end_pass(&mut self, used_ids: &IdMap) { @@ -645,11 +666,10 @@ impl Focus { } fn interested_in_focus(&mut self, id: Id) { + // `begin_pass` hands out the request as soon as it can, but it can only recognize a widget + // that has been here before. This catches the first pass a widget is focusable in. if self.id_requested_by_accesskit == Some(id.accesskit_id()) { - self.focused_widget = Some(FocusWidget::new(id)); - self.id_requested_by_accesskit = None; - self.give_to_next = false; - self.reset_focus(); + self.take_focus_from_accesskit(id); } // The rect is updated at the end of the frame. diff --git a/crates/egui/src/widgets/drag_value.rs b/crates/egui/src/widgets/drag_value.rs index e47239f39..d55676987 100644 --- a/crates/egui/src/widgets/drag_value.rs +++ b/crates/egui/src/widgets/drag_value.rs @@ -603,7 +603,7 @@ impl Widget for DragValue<'_> { .clip_text(false) .horizontal_align(ui.layout().horizontal_align()) .vertical_align(ui.layout().vertical_align()) - .min_size(min_size.unwrap_or(ui.spacing().interact_size)) + .min_size(min_size.unwrap_or_else(|| ui.spacing().interact_size)) .id(id) .desired_width( ui.spacing().interact_size.x - 2.0 * ui.spacing().button_padding.x, @@ -654,7 +654,7 @@ impl Widget for DragValue<'_> { .wrap_mode(TextWrapMode::Extend) .sense(Sense::click_and_drag()) .gap(0.0) - .min_size(min_size.unwrap_or(ui.spacing().interact_size)); // TODO(emilk): find some more generic solution to `min_size` + .min_size(min_size.unwrap_or_else(|| ui.spacing().interact_size)); // TODO(emilk): find some more generic solution to `min_size` let cursor_icon = if value <= *range.start() { CursorIcon::ResizeEast @@ -822,6 +822,16 @@ fn select_all_text(ui: &Ui, widget_id: Id, response_id: Id, value_text: &str) { state.store(ui.ctx(), response_id); } +impl HasClasses for DragValue<'_> { + fn classes(&self) -> &Classes { + &self.classes + } + + fn classes_mut(&mut self) -> &mut Classes { + &mut self.classes + } +} + #[cfg(test)] mod tests { use super::clamp_value_to_range; @@ -881,13 +891,3 @@ mod tests { ); } } - -impl HasClasses for DragValue<'_> { - fn classes(&self) -> &Classes { - &self.classes - } - - fn classes_mut(&mut self) -> &mut Classes { - &mut self.classes - } -} diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs index c443c1a2f..e224f1282 100644 --- a/crates/egui/src/widgets/text_edit/builder.rs +++ b/crates/egui/src/widgets/text_edit/builder.rs @@ -745,7 +745,7 @@ impl TextEdit<'_> { let allocated = AtomLayout::new(atoms) .id(id) - .fallback_gap(gap) + .gap(gap) .min_size(Vec2::new(allocate_width, min_height.at_least(min_size.y))) .max_width(allocate_width) .sense(sense) diff --git a/tests/egui_tests/tests/snapshots/text_edit_delay_0_empty.png b/tests/egui_tests/tests/snapshots/text_edit_delay_0_empty.png index 7f85cf977..89de59f1d 100644 --- a/tests/egui_tests/tests/snapshots/text_edit_delay_0_empty.png +++ b/tests/egui_tests/tests/snapshots/text_edit_delay_0_empty.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:570216d6ffa3cc278705582d95b96200bc3ef1608b8f2983a6ed3f8b2ee7276c -size 2280 +oid sha256:806f3f69228e62d9d0838fb27a02f46cae29efffee54d8182ecbfd2c12f405ba +size 2413 diff --git a/tests/egui_tests/tests/snapshots/text_edit_halign.png b/tests/egui_tests/tests/snapshots/text_edit_halign.png index 31c19aede..4cb5beade 100644 --- a/tests/egui_tests/tests/snapshots/text_edit_halign.png +++ b/tests/egui_tests/tests/snapshots/text_edit_halign.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b66afca19d0a0a6fac4737816443fbd481635897807689dbd75321360ffa079d -size 13803 +oid sha256:2ae71de200dfb36f64e1ce95c2ad78ef3c1e88e792ada5b5fa1d8fa8c938d8fd +size 13806 diff --git a/tests/egui_tests/tests/snapshots/text_edit_rtl_0.png b/tests/egui_tests/tests/snapshots/text_edit_rtl_0.png index b4338fa85..3a3f83593 100644 --- a/tests/egui_tests/tests/snapshots/text_edit_rtl_0.png +++ b/tests/egui_tests/tests/snapshots/text_edit_rtl_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20afbde3e1edc7a599936f83188fb1a2c35d2d1344ce7ad8e115b937266481fc -size 2547 +oid sha256:10459c5ac931ee55d814e7e4122167f1d4050fff39c409cef995c91d6deaef55 +size 2563 diff --git a/tests/egui_tests/tests/snapshots/text_edit_scroll_0_focus.png b/tests/egui_tests/tests/snapshots/text_edit_scroll_0_focus.png index 01076e11f..beb304759 100644 --- a/tests/egui_tests/tests/snapshots/text_edit_scroll_0_focus.png +++ b/tests/egui_tests/tests/snapshots/text_edit_scroll_0_focus.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4b0af10fca47b33752aed2549528dba6b6e8c4818f2fc2b9de60451afdd30a2b -size 1690 +oid sha256:123f7d1a86d644d2e830a2c8b73e8c509ce33fd5d3ead28d3eccf6180a2fcfc5 +size 1790 diff --git a/tests/egui_tests/tests/snapshots/visuals/drag_value.png b/tests/egui_tests/tests/snapshots/visuals/drag_value.png index 90be73b8d..00b0c0b5b 100644 --- a/tests/egui_tests/tests/snapshots/visuals/drag_value.png +++ b/tests/egui_tests/tests/snapshots/visuals/drag_value.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:76be7b08da637ecbf898efd8322615d5e2f1cb1757665e5486db86ccb7fb3438 +oid sha256:f916e217bd4beb3637acb5394a7da876f9ec684860c9ca922f8bfa3ded6a2684 size 9462