From 8db6ccad4a6185e1e272ea3639563f9c66238c81 Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Fri, 21 Aug 2026 14:22:35 +0200 Subject: [PATCH] Let DragValue set a min_size, and honor TextEdit::min_size height --- crates/egui/src/widgets/drag_value.rs | 17 ++++++++++++++--- crates/egui/src/widgets/text_edit/builder.rs | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/egui/src/widgets/drag_value.rs b/crates/egui/src/widgets/drag_value.rs index 516195673..e47239f39 100644 --- a/crates/egui/src/widgets/drag_value.rs +++ b/crates/egui/src/widgets/drag_value.rs @@ -65,6 +65,7 @@ pub struct DragValue<'a> { custom_parser: Option>, update_while_editing: bool, classes: Classes, + min_size: Option, } impl<'a> DragValue<'a> { @@ -100,9 +101,19 @@ impl<'a> DragValue<'a> { custom_parser: None, update_while_editing: true, classes: Classes::default(), + min_size: None, } } + /// The minimum size of the drag value, in both its dragged and its text-edited state. + /// + /// Defaults to [`crate::style::Spacing::interact_size`]. + #[inline] + pub fn min_size(mut self, min_size: Vec2) -> Self { + self.min_size = Some(min_size); + self + } + /// How much the value changes when dragged one point (logical pixel). /// /// Should be finite and greater than zero. @@ -453,6 +464,7 @@ impl Widget for DragValue<'_> { custom_parser, update_while_editing, classes, + min_size, } = self; let mut prefix_text = String::new(); @@ -591,8 +603,7 @@ impl Widget for DragValue<'_> { .clip_text(false) .horizontal_align(ui.layout().horizontal_align()) .vertical_align(ui.layout().vertical_align()) - .margin(ui.spacing().button_padding) - .min_size(ui.spacing().interact_size) + .min_size(min_size.unwrap_or(ui.spacing().interact_size)) .id(id) .desired_width( ui.spacing().interact_size.x - 2.0 * ui.spacing().button_padding.x, @@ -643,7 +654,7 @@ impl Widget for DragValue<'_> { .wrap_mode(TextWrapMode::Extend) .sense(Sense::click_and_drag()) .gap(0.0) - .min_size(ui.spacing().interact_size); // TODO(emilk): find some more generic solution to `min_size` + .min_size(min_size.unwrap_or(ui.spacing().interact_size)); // TODO(emilk): find some more generic solution to `min_size` let cursor_icon = if value <= *range.start() { CursorIcon::ResizeEast diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs index 0c4251d3a..1af9b0fd8 100644 --- a/crates/egui/src/widgets/text_edit/builder.rs +++ b/crates/egui/src/widgets/text_edit/builder.rs @@ -736,7 +736,7 @@ impl TextEdit<'_> { let allocated = AtomLayout::new(atoms) .id(id) - .min_size(Vec2::new(allocate_width, min_height)) + .min_size(Vec2::new(allocate_width, min_height.at_least(min_size.y))) .max_width(allocate_width) .sense(sense) .frame(frame)