diff --git a/crates/egui/src/widgets/button.rs b/crates/egui/src/widgets/button.rs index 750c4b1abf7a..68753bc0d637 100644 --- a/crates/egui/src/widgets/button.rs +++ b/crates/egui/src/widgets/button.rs @@ -306,10 +306,14 @@ impl Widget for Button<'_> { let mut cursor_x = rect.min.x + button_padding.x; if let Some(image) = &image { - let image_rect = Rect::from_min_size( - pos2(cursor_x, rect.center().y - 0.5 - (image_size.y / 2.0)), - image_size, - ); + let mut image_pos = ui + .layout() + .align_size_within_rect(image_size, rect.shrink2(button_padding)) + .min; + if galley.is_some() || shortcut_galley.is_some() { + image_pos.x = cursor_x; + } + let image_rect = Rect::from_min_size(image_pos, image_size); cursor_x += image_size.x; let tlr = image.load_for_size(ui.ctx(), image_size); widgets::image::paint_texture_load_result( @@ -331,22 +335,26 @@ impl Widget for Button<'_> { } if let Some(galley) = galley { - let text_pos = if image.is_some() || shortcut_galley.is_some() { - pos2(cursor_x, rect.center().y - 0.5 * galley.size().y) - } else { - // Make sure button text is centered if within a centered layout - ui.layout() - .align_size_within_rect(galley.size(), rect.shrink2(button_padding)) - .min - }; + let mut text_pos = ui + .layout() + .align_size_within_rect(galley.size(), rect.shrink2(button_padding)) + .min; + if image.is_some() || shortcut_galley.is_some() { + text_pos.x = cursor_x; + } ui.painter().galley(text_pos, galley, visuals.text_color()); } if let Some(shortcut_galley) = shortcut_galley { - let shortcut_text_pos = pos2( - rect.max.x - button_padding.x - shortcut_galley.size().x, - rect.center().y - 0.5 * shortcut_galley.size().y, - ); + // Always align to the right + let layout = if ui.layout().is_horizontal() { + ui.layout().with_main_align(Align::Max) + } else { + ui.layout().with_cross_align(Align::Max) + }; + let shortcut_text_pos = layout + .align_size_within_rect(shortcut_galley.size(), rect.shrink2(button_padding)) + .min; ui.painter().galley( shortcut_text_pos, shortcut_galley,