diff options
author | lucasmerlin <lucasmeurer96@gmail.com> | 2024-09-19 11:55:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-19 11:55:09 +0200 |
commit | bfafddfdec8a71e4ce62cc34b894715bbcd6dd50 (patch) | |
tree | 6f7a0866fd730953ffe7f4d51f4c7dfb063a21be | |
parent | 2a40d16e5a19a8829b49832459a0ceb686a2fbf2 (diff) |
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>
-rw-r--r-- | crates/egui/src/context.rs | 1 | ||||
-rw-r--r-- | crates/egui/src/response.rs | 13 | ||||
-rw-r--r-- | crates/egui/src/ui.rs | 4 |
3 files changed, 17 insertions, 1 deletions
diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 562a15ba..6f1a53db 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 b358fc3b..e2747dd7 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<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, } } } diff --git a/crates/egui/src/ui.rs b/crates/egui/src/ui.rs index 2a2c790c..eb2871ef 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. |