From fa81ae049edd774c5e0f54ef3fea78c3f03fab0f Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Tue, 11 Mar 2025 10:02:31 +0100 Subject: [PATCH] Experiment with `WidgetLayout` --- crates/egui/src/lib.rs | 1 + crates/egui/src/widget_layout.rs | 99 ++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 crates/egui/src/widget_layout.rs diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 0d8459808..3aff7bc06 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -444,6 +444,7 @@ pub mod widgets; #[cfg(feature = "callstack")] #[cfg(debug_assertions)] mod callstack; +mod widget_layout; #[cfg(feature = "accesskit")] pub use accesskit; diff --git a/crates/egui/src/widget_layout.rs b/crates/egui/src/widget_layout.rs new file mode 100644 index 000000000..59a76fa1a --- /dev/null +++ b/crates/egui/src/widget_layout.rs @@ -0,0 +1,99 @@ +use crate::{Frame, ImageSource, Response, Sense, Ui, WidgetText}; +use emath::Vec2; +use epaint::Galley; + +enum WidgetLayoutItem<'a> { + Text(WidgetText), + Image(ImageSource<'a>), + Custom(Vec2), + Grow, +} + +enum SizedWidgetLayoutItem<'a> { + Text(Galley), + Image(ImageSource<'a>, Vec2), + Custom(Vec2), + Grow, +} + +struct WidgetLayout<'a> { + items: Vec>, + gap: f32, + frame: Frame, + sense: Sense, +} + +impl<'a> WidgetLayout<'a> { + pub fn new() -> Self { + Self { + items: Vec::new(), + gap: 0.0, + frame: Frame::default(), + sense: Sense::hover(), + } + } + + pub fn add(mut self, item: impl Into>) -> Self { + self.items.push(item.into()); + self + } + + pub fn gap(mut self, gap: f32) -> Self { + self.gap = gap; + self + } + + pub fn frame(mut self, frame: Frame) -> Self { + self.frame = frame; + self + } + + pub fn sense(mut self, sense: Sense) -> Self { + self.sense = sense; + self + } + + pub fn show(self, ui: &mut Ui) -> Response { + let available_width = ui.available_width(); + + let mut desired_width = 0.0; + let mut preferred_width = 0.0; + + let mut height = 0.0; + + let mut sized_items = Vec::new(); + + let (rect, response) = ui.allocate_at_least(Vec2::new(desired_width, height), self.sense); + + response + } +} + +struct WLButton<'a> { + wl: WidgetLayout<'a>, +} + +impl<'a> WLButton<'a> { + pub fn new(text: impl Into) -> Self { + Self { + wl: WidgetLayout::new().add(text), + } + } + + pub fn ui(mut self, ui: &mut Ui) -> Response { + let response = ui.ctx().read_response(ui.next_auto_id()); + + let visuals = response.map_or(&ui.style().visuals.widgets.inactive, |response| { + ui.style().interact(&response) + }); + + self.wl.frame = self + .wl + .frame + .fill(visuals.bg_fill) + .stroke(visuals.bg_stroke) + .corner_radius(visuals.corner_radius); + + self.wl.show(ui) + } +}