From e2690fa61115a39d23421ae3e9cb807773d4eafa Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Thu, 13 Nov 2025 16:59:31 -0500 Subject: [PATCH] span builder --- src/core/position/span.rs | 43 +++++++++++++++++++++++++++++++++++++-- src/core/trait_fns.rs | 19 ++++++++++------- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/core/position/span.rs b/src/core/position/span.rs index 030a203..d963948 100644 --- a/src/core/position/span.rs +++ b/src/core/position/span.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; + use crate::prelude::*; pub struct Span { @@ -15,13 +17,13 @@ impl Widget for Span { let mut axis = child_region.axis_mut(self.dir.axis); axis.top_left.set(start); let len = painter.size(child).axis(self.dir.axis); - start.abs += len.abs; - start.rel += len.rel; if len.rest > 0.0 { let offset = UiScalar::new(total.rel, total.abs); let rel_end = UiScalar::from_anchor(len.rest / total.rest); start = rel_end.within(start, (UiScalar::rel_max() + start) - offset); } + start.abs += len.abs; + start.rel += len.rel; axis.bot_right.set(start); if self.dir.sign == Sign::Neg { child_region.flip(self.dir.axis); @@ -75,3 +77,40 @@ impl Span { }) } } + +pub struct SpanBuilder, Tag> { + pub children: Wa, + pub dir: Dir, + pub gap: f32, + _pd: PhantomData, +} + +impl, Tag> FnOnce<(&mut Ui,)> + for SpanBuilder +{ + type Output = Span; + + extern "rust-call" fn call_once(self, args: (&mut Ui,)) -> Self::Output { + Span { + children: self.children.ui(args.0).arr.to_vec(), + dir: self.dir, + gap: self.gap, + } + } +} + +impl, Tag> SpanBuilder { + pub fn new(children: Wa, dir: Dir) -> Self { + Self { + children, + dir, + gap: 0.0, + _pd: PhantomData, + } + } + + pub fn gap(mut self, gap: impl UiNum) -> Self { + self.gap = gap.to_f32(); + self + } +} diff --git a/src/core/trait_fns.rs b/src/core/trait_fns.rs index 5b9ade6..3eef47d 100644 --- a/src/core/trait_fns.rs +++ b/src/core/trait_fns.rs @@ -12,6 +12,7 @@ pub trait CoreWidget { fn offset(self, amt: impl Into) -> impl WidgetFn; fn scroll(self) -> impl WidgetIdFn; fn masked(self) -> impl WidgetFn; + fn background(self, w: impl WidgetLike) -> impl WidgetFn; } impl, Tag> CoreWidget for W { @@ -87,20 +88,24 @@ impl, Tag> CoreWidget for W { inner: self.add(ui).any(), } } + + fn background(self, w: impl WidgetLike) -> impl WidgetFn { + move |ui| Stack { + children: vec![w.add(ui).any(), self.add(ui).any()], + size: StackSize::Child(1), + offset: 0, + } + } } pub trait CoreWidgetArr, Tag> { - fn span(self, dir: Dir) -> impl WidgetFn; + fn span(self, dir: Dir) -> SpanBuilder; fn stack(self) -> StackBuilder; } impl, Tag> CoreWidgetArr for Wa { - fn span(self, dir: Dir) -> impl WidgetFn { - move |ui| Span { - children: self.ui(ui).arr.to_vec(), - dir, - gap: 0.0, - } + fn span(self, dir: Dir) -> SpanBuilder { + SpanBuilder::new(self, dir) } fn stack(self) -> StackBuilder { StackBuilder::new(self)