summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlucasmerlin <lucasmeurer96@gmail.com>2024-09-19 11:55:09 +0200
committerGitHub <noreply@github.com>2024-09-19 11:55:09 +0200
commitbfafddfdec8a71e4ce62cc34b894715bbcd6dd50 (patch)
tree6f7a0866fd730953ffe7f4d51f4c7dfb063a21be
parent2a40d16e5a19a8829b49832459a0ceb686a2fbf2 (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.rs1
-rw-r--r--crates/egui/src/response.rs13
-rw-r--r--crates/egui/src/ui.rs4
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.