Skip to content

Commit

Permalink
Add Response::intrinsic_size to enable better layout in 3rd party c…
Browse files Browse the repository at this point in the history
…rates (#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
#4378 (comment)
* [X] I have followed the instructions in the PR template

---------

Co-authored-by: Emil Ernerfeldt <[email protected]>
  • Loading branch information
lucasmerlin and emilk authored Sep 19, 2024
1 parent 2a40d16 commit bfafddf
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions crates/egui/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,7 @@ impl Context {
is_pointer_button_down_on: false,
interact_pointer_pos: None,
changed: false,
intrinsic_size: None,
};

self.write(|ctx| {
Expand Down
13 changes: 13 additions & 0 deletions crates/egui/src/response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion crates/egui/src/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit bfafddf

Please sign in to comment.