1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-29 04:40:03 -04:00

Let the theme set a button's atom gap

`Button` hard-coded `spacing.icon_spacing` as the gap between its icon and
its text. A theme that gives a button its own metrics wants to set that gap
too, so it becomes a `ButtonStyle` field, overridden by `Button::gap`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lucas Meurer
2026-08-25 09:27:05 +02:00
parent 46fe9d73fa
commit 487c8f1dda
5 changed files with 17 additions and 0 deletions

View File

@@ -107,6 +107,13 @@ impl<'a> AtomLayout<'a> {
self
}
/// Set the gap between atoms, unless [`Self::gap`] already set one.
#[inline]
pub fn fallback_gap(mut self, gap: f32) -> Self {
self.gap.get_or_insert(gap);
self
}
/// Set the [`Frame`].
#[inline]
pub fn frame(mut self, frame: Frame) -> Self {

View File

@@ -91,6 +91,7 @@ impl StyleProvider<ButtonStyle> for DefaultStyle {
// Historically only the height was floored, so that a button is at least as tall as
// any other interactive widget on the same row.
min_size: Vec2::new(0.0, spacing.interact_size.y),
gap: spacing.icon_spacing,
}
}
}

View File

@@ -58,6 +58,11 @@ pub struct ButtonStyle {
/// Ignored by a [`crate::Button::small`] button, which sizes itself purely from its contents
/// and its own [`crate::Button::min_size`].
pub min_size: Vec2,
/// The gap between the button's atoms, e.g. between its icon and its text.
///
/// Overridden by [`crate::Button::gap`].
pub gap: f32,
}
impl WidgetStyle for ButtonStyle {}

View File

@@ -327,8 +327,11 @@ impl<'a> Button<'a> {
frame,
text_style,
min_size: style_min_size,
gap,
} = ui.widget_style(id, &classes);
layout = layout.fallback_gap(gap);
// The theme decides how small a button may get — unless it is a `small` one, which sizes
// itself purely from its contents.
if !small {

View File

@@ -69,6 +69,7 @@ impl StyleProvider<ButtonStyle> for MyTheme {
.inner_margin(8),
text_style: base.text,
min_size: args.style.spacing.interact_size,
gap: args.style.spacing.icon_spacing,
}
}
}