use super::*; use crate::prelude::*; // these methods should "not require any context" (require unit) because they're in core event_ctx!(()); pub trait CoreWidget { fn pad(self, padding: impl Into) -> impl WidgetFn; fn align(self, align: impl Into) -> impl WidgetFn; fn center(self) -> impl WidgetFn; fn label(self, label: impl Into) -> impl WidgetIdFn; fn sized(self, size: impl Into) -> impl WidgetFn; fn width(self, len: impl Into) -> impl WidgetFn; fn height(self, len: impl Into) -> impl WidgetFn; fn max_width(self, width: impl Into) -> impl WidgetFn; fn max_height(self, height: impl Into) -> impl WidgetFn; 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; fn foreground(self, w: impl WidgetLike) -> impl WidgetFn; fn layer_offset(self, offset: usize) -> impl WidgetFn; fn to_any(self) -> impl WidgetRet; } impl, Tag> CoreWidget for W { fn pad(self, padding: impl Into) -> impl WidgetFn { |ui| Pad { padding: padding.into(), inner: self.add(ui).any(), } } fn align(self, align: impl Into) -> impl WidgetFn { move |ui| Aligned { inner: self.add(ui).any(), align: align.into(), } } fn center(self) -> impl WidgetFn { self.align(Align::CENTER) } fn label(self, label: impl Into) -> impl WidgetIdFn { |ui| { let id = self.add(ui); ui.set_label(&id, label.into()); id } } fn sized(self, size: impl Into) -> impl WidgetFn { let size = size.into(); move |ui| Sized { inner: self.add(ui).any(), x: Some(size.x), y: Some(size.y), } } fn max_width(self, len: impl Into) -> impl WidgetFn { let len = len.into(); move |ui| MaxSize { inner: self.add(ui).any(), x: Some(len), y: None, } } fn max_height(self, len: impl Into) -> impl WidgetFn { let len = len.into(); move |ui| MaxSize { inner: self.add(ui).any(), x: None, y: Some(len), } } fn width(self, len: impl Into) -> impl WidgetFn { let len = len.into(); move |ui| Sized { inner: self.add(ui).any(), x: Some(len), y: None, } } fn height(self, len: impl Into) -> impl WidgetFn { let len = len.into(); move |ui| Sized { inner: self.add(ui).any(), x: None, y: Some(len), } } fn offset(self, amt: impl Into) -> impl WidgetFn { move |ui| Offset { inner: self.add(ui).any(), amt: amt.into(), } } fn scroll(self) -> impl WidgetIdFn { move |ui| { Scroll::new(self.add(ui).any(), Axis::Y) .on(CursorSense::Scroll, |ctx| { let s = &mut ctx.ui[ctx.id]; s.scroll(ctx.data.scroll_delta.y * 50.0); }) .add(ui) } } fn masked(self) -> impl WidgetFn { move |ui| Masked { 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), } } fn foreground(self, w: impl WidgetLike) -> impl WidgetFn { move |ui| Stack { children: vec![self.add(ui).any(), w.add(ui).any()], size: StackSize::Child(0), } } fn layer_offset(self, offset: usize) -> impl WidgetFn { move |ui| LayerOffset { inner: self.add(ui).any(), offset, } } fn to_any(self) -> impl WidgetRet { |ui| self.add(ui).any() } } pub trait CoreWidgetArr, Tag> { fn span(self, dir: Dir) -> SpanBuilder; fn stack(self) -> StackBuilder; } impl, Tag> CoreWidgetArr for Wa { fn span(self, dir: Dir) -> SpanBuilder { SpanBuilder::new(self, dir) } fn stack(self) -> StackBuilder { StackBuilder::new(self) } }