Add `Response::intrinsic_size` to enable better layout in 3rd party crates (#5082)

This adds a `intrinsic_size` field to the Response struct which allows
me to grow a egui button frame while still being able to know it's
intrinsic size in
[egui_flex](https://github.com/lucasmerlin/hello_egui/tree/main/crates/egui_flex)

* Related to
https://github.com/emilk/egui/issues/4378#issuecomment-2333800938
* [X] I have followed the instructions in the PR template

---------

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
This commit is contained in:
lucasmerlin 2024-09-19 11:55:09 +02:00 committed by GitHub
parent 2a40d16e5a
commit bfafddfdec
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 17 additions and 1 deletions

View File

@ -1212,6 +1212,7 @@ impl Context {
is_pointer_button_down_on: false,
interact_pointer_pos: None,
changed: false,
intrinsic_size: None,
};
self.write(|ctx| {

View File

@ -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<Vec2>,
}
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,
}
}
}

View File

@ -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.