diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 562a15ba179..6f1a53db361 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -1212,6 +1212,7 @@ impl Context { is_pointer_button_down_on: false, interact_pointer_pos: None, changed: false, + intrinsic_size: None, }; self.write(|ctx| { diff --git a/crates/egui/src/response.rs b/crates/egui/src/response.rs index b358fc3be78..e2747dd730f 100644 --- a/crates/egui/src/response.rs +++ b/crates/egui/src/response.rs @@ -121,6 +121,18 @@ pub struct Response { /// for instance if an existing slider value was clamped to the given range. #[doc(hidden)] pub changed: bool, + + /// The intrinsic / desired size of the widget. + /// + /// For a button, this will be the size of the label + the frames padding, + /// even if the button is laid out in a justified layout and the actual size will be larger. + /// + /// If this is `None`, use [`Self::rect`] instead. + /// + /// At the time of writing, this is only used by external crates + /// for improved layouting. + /// See for instance [`egui_flex`](https://github.com/lucasmerlin/hello_egui/tree/main/crates/egui_flex). + pub intrinsic_size: Option, } impl Response { @@ -1144,6 +1156,7 @@ impl Response { || other.is_pointer_button_down_on, interact_pointer_pos: self.interact_pointer_pos.or(other.interact_pointer_pos), changed: self.changed || other.changed, + intrinsic_size: None, } } } diff --git a/crates/egui/src/ui.rs b/crates/egui/src/ui.rs index 2a2c790c608..eb2871efe66 100644 --- a/crates/egui/src/ui.rs +++ b/crates/egui/src/ui.rs @@ -1050,7 +1050,9 @@ impl Ui { /// ``` pub fn allocate_response(&mut self, desired_size: Vec2, sense: Sense) -> Response { let (id, rect) = self.allocate_space(desired_size); - self.interact(rect, id, sense) + let mut response = self.interact(rect, id, sense); + response.intrinsic_size = Some(desired_size); + response } /// Returns a [`Rect`] with exactly what you asked for.