use super::*; use crate::layout::{ Dir, UiPos, UiRegion, Vec2, WidgetArrLike, WidgetFnRet, WidgetIdFnRet, WidgetLike, }; pub trait CoreWidget { fn pad(self, padding: impl Into) -> WidgetFnRet!(Regioned); fn center(self, size: impl Into) -> WidgetFnRet!(Regioned); fn region(self, region: UiRegion) -> WidgetFnRet!(Regioned); fn label(self, label: impl Into) -> WidgetIdFnRet!(W); } impl, Tag> CoreWidget for W { fn pad(self, padding: impl Into) -> WidgetFnRet!(Regioned) { |ui| Regioned { region: padding.into().region(), inner: self.add(ui).erase_type(), } } fn center(self, size: impl Into) -> WidgetFnRet!(Regioned) { |ui| Regioned { region: UiPos::center().expand(size.into()), inner: self.add(ui).erase_type(), } } fn region(self, region: UiRegion) -> WidgetFnRet!(Regioned) { move |ui| Regioned { region, inner: self.add(ui).erase_type(), } } fn label(self, label: impl Into) -> WidgetIdFnRet!(W::Widget) { |ui| { let id = self.add(ui); ui.set_label(&id, label.into()); id } } } pub trait CoreWidgetArr { fn span(self, dir: Dir, lengths: [impl Into; LEN]) -> WidgetFnRet!(Span); fn stack(self) -> WidgetFnRet!(Stack); } impl, Tag> CoreWidgetArr for Wa { fn span(self, dir: Dir, lengths: [impl Into; LEN]) -> WidgetFnRet!(Span) { let lengths = lengths.map(Into::into); move |ui| Span { dir, children: self.ui(ui).arr.into_iter().zip(lengths).collect(), } } fn stack(self) -> WidgetFnRet!(Stack) { move |ui| Stack { children: self.ui(ui).arr.to_vec(), } } }