diff --git a/crates/egui/src/widget_rect.rs b/crates/egui/src/widget_rect.rs index e03423623..a84dde519 100644 --- a/crates/egui/src/widget_rect.rs +++ b/crates/egui/src/widget_rect.rs @@ -164,6 +164,8 @@ impl WidgetRects { let InteractOptions { move_to_top } = options; + let mut shift_layer_index_after = None; + let layer_widgets = by_layer.entry(layer_id).or_default(); match by_id.entry(widget_rect.id) { @@ -187,6 +189,7 @@ impl WidgetRects { if existing.layer_id == widget_rect.layer_id { if move_to_top { layer_widgets.remove(*idx_in_layer); + shift_layer_index_after = Some(*idx_in_layer); *idx_in_layer = layer_widgets.len(); layer_widgets.push(*existing); } else { @@ -200,6 +203,16 @@ impl WidgetRects { } } } + + if let Some(shift_start) = shift_layer_index_after { + #[expect(clippy::needless_range_loop)] + for i in shift_start..layer_widgets.len() { + let w = &layer_widgets[i]; + if let Some((idx_in_by_id, _)) = by_id.get_mut(&w.id) { + *idx_in_by_id = i; + } + } + } } pub fn set_info(&mut self, id: Id, info: WidgetInfo) {