use super::*; use crate::prelude::*; pub trait CoreWidget { fn pad(self, padding: impl Into) -> impl WidgetFn; fn align(self, align: Align) -> impl WidgetFn; fn center(self) -> impl WidgetFn; fn label(self, label: impl Into) -> impl WidgetIdFn; fn size(self, size: impl Into) -> impl WidgetFn; } impl, Tag> CoreWidget for W { fn pad(self, padding: impl Into) -> impl WidgetFn { |ui| Padded { padding: padding.into(), inner: self.add(ui).erase_type(), } } fn align(self, align: Align) -> impl WidgetFn { move |ui| Aligned { inner: self.add(ui).erase_type(), align, } } 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 size(self, size: impl Into) -> impl WidgetFn { move |ui| Sized { inner: self.add(ui).erase_type(), size: size.into(), } } } pub trait CoreWidgetArr { fn span(self, dir: Dir, lengths: impl IntoSpanLens) -> impl WidgetFn; fn stack(self) -> impl WidgetFn; } impl, Tag> CoreWidgetArr for Wa { fn span(self, dir: Dir, lengths: impl IntoSpanLens) -> impl WidgetFn { let lengths = lengths.into_lens(); move |ui| Span { children: self.ui(ui).arr.into_iter().zip(lengths).collect(), dir, } } fn stack(self) -> impl WidgetFn { move |ui| Stack { children: self.ui(ui).arr.to_vec(), } } } pub trait IntoSpanLens { fn into_lens(self) -> [SpanLen; LEN]; } impl> IntoSpanLens for [T; LEN] { fn into_lens(self) -> [SpanLen; LEN] { self.map(Into::into) } } impl IntoSpanLens for SpanLen { fn into_lens(self) -> [SpanLen; LEN] { [self; LEN] } }