From d72e85b6b4ed817899a77e204ccdf25bb6caf0fb Mon Sep 17 00:00:00 2001 From: lucasmerlin Date: Wed, 19 Mar 2025 11:51:03 +0100 Subject: [PATCH] Add workaround for max_width set_max_width and set_max_height will limit intrinsic size but not max_rect itself --- crates/egui/src/layout.rs | 10 +++++++++- crates/egui/src/placer.rs | 14 +++++++++++++- examples/hello_world_simple/src/main.rs | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/crates/egui/src/layout.rs b/crates/egui/src/layout.rs index cf165c281..8a9c1e870 100644 --- a/crates/egui/src/layout.rs +++ b/crates/egui/src/layout.rs @@ -46,7 +46,9 @@ pub(crate) struct Region { /// The cursor can thus be `style.spacing.item_spacing` pixels outside of the `min_rect`. pub(crate) cursor: Rect, - pub intrinsic_size: Vec2, + pub(crate) intrinsic_size: Vec2, + pub max_intrinsic_width: Option, + pub max_intrinsic_height: Option, } impl Region { @@ -429,6 +431,8 @@ impl Layout { max_rect, cursor: self.initial_cursor(max_rect), intrinsic_size: Vec2::default(), + max_intrinsic_width: None, + max_intrinsic_height: None, }; let seed = self.next_widget_position(®ion); region.min_rect = Rect::from_center_size(seed, Vec2::ZERO); @@ -533,6 +537,8 @@ impl Layout { mut max_rect, min_rect, intrinsic_size: min_item_size, + max_intrinsic_width, + max_intrinsic_height, } = *region; match self.main_dir { @@ -595,6 +601,8 @@ impl Layout { max_rect, cursor, intrinsic_size: min_item_size, + max_intrinsic_width, + max_intrinsic_height, }; self.next_frame_ignore_wrap(®ion, child_size) diff --git a/crates/egui/src/placer.rs b/crates/egui/src/placer.rs index 26e2365f9..244a75584 100644 --- a/crates/egui/src/placer.rs +++ b/crates/egui/src/placer.rs @@ -200,7 +200,15 @@ impl Placer { } pub(crate) fn intrinsic_size(&self) -> Vec2 { - self.region.intrinsic_size + //self.region.intrinsic_size.min(self.max_rect().size()) + let mut intrinsic = self.region.intrinsic_size; + if let Some(max_x) = self.region.max_intrinsic_width { + intrinsic.x = intrinsic.x.min(max_x); + } + if let Some(max_y) = self.region.max_intrinsic_height { + intrinsic.y = intrinsic.y.min(max_y); + } + intrinsic } /// Move to the next row in a grid layout or wrapping layout. @@ -253,6 +261,8 @@ impl Placer { region.cursor.max.x = region.max_rect.max.x; region.sanity_check(); + + region.max_intrinsic_width = Some(width); } /// Set the maximum height of the ui. @@ -268,6 +278,8 @@ impl Placer { region.cursor.max.y = region.max_rect.max.y; region.sanity_check(); + + region.max_intrinsic_height = Some(height); } /// Set the minimum width of the ui. diff --git a/examples/hello_world_simple/src/main.rs b/examples/hello_world_simple/src/main.rs index a25881a9c..015037479 100644 --- a/examples/hello_world_simple/src/main.rs +++ b/examples/hello_world_simple/src/main.rs @@ -89,12 +89,13 @@ fn main() -> eframe::Result { MenuButton::new("Menu") .config(MenuConfig::new().close_behavior(PopupCloseBehavior::CloseOnClickOutside)) .ui(ui, |ui| { - // ui.set_max_width(180.0); + ui.set_max_width(180.0); if ui.button("Close menu").clicked() { ui.close_menu(); } ui.collapsing("Collapsing", |ui| { egui::ScrollArea::both().show(ui, |ui| { + // ui.set_width(ui.available_width()); for _ in 0..10 { ui.label( "This is a long text label containing \