some potentially nice trait stuff
This commit is contained in:
1 parent
1102dc7338
commit
c118bb446b
7 files changed
+90
-30
No files matched your search
@@ -152,32 +152,32 @@ impl Span {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SpanBuilder<State, const LEN: usize, Wa: WidgetArrLike<State, LEN, Tag>, Tag> {
|
||||
pub children: Wa,
|
||||
pub struct SpanBuilder<Children, Rsc, Tag, GTag> {
|
||||
pub children: Children,
|
||||
pub dir: Dir,
|
||||
pub gap: f32,
|
||||
_pd: PhantomData<(State, Tag)>,
|
||||
_pd: PhantomData<(Rsc, Tag, GTag)>,
|
||||
}
|
||||
|
||||
impl<Rsc, const LEN: usize, Wa: WidgetArrLike<Rsc, LEN, Tag>, Tag> WidgetFnTrait<Rsc>
|
||||
for SpanBuilder<Rsc, LEN, Wa, Tag>
|
||||
impl<Children: IntoWidgetVec<Rsc, Tag, GTag>, Rsc, Tag, GTag> WidgetFnTrait<Rsc>
|
||||
for SpanBuilder<Children, Rsc, Tag, GTag>
|
||||
{
|
||||
type Widget = Span;
|
||||
|
||||
#[track_caller]
|
||||
fn run(self, rsc: &mut Rsc) -> Self::Widget {
|
||||
Span {
|
||||
children: self.children.add(rsc).arr.into_iter().collect(),
|
||||
children: self.children.into_vec(rsc),
|
||||
dir: self.dir,
|
||||
gap: self.gap,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<State, const LEN: usize, Wa: WidgetArrLike<State, LEN, Tag>, Tag>
|
||||
SpanBuilder<State, LEN, Wa, Tag>
|
||||
impl<Children: IntoWidgetVec<Rsc, Tag, GTag>, Rsc, Tag, GTag>
|
||||
SpanBuilder<Children, Rsc, Tag, GTag>
|
||||
{
|
||||
pub fn new(children: Wa, dir: Dir) -> Self {
|
||||
pub fn new(children: Children, dir: Dir) -> Self {
|
||||
Self {
|
||||
children,
|
||||
dir,
|
||||
|
||||
@@ -42,30 +42,28 @@ pub enum StackSize {
|
||||
Child(usize),
|
||||
}
|
||||
|
||||
pub struct StackBuilder<State, const LEN: usize, Wa: WidgetArrLike<State, LEN, Tag>, Tag> {
|
||||
pub children: Wa,
|
||||
pub struct StackBuilder<Children, Rsc, Tag, GTag> {
|
||||
pub children: Children,
|
||||
pub size: StackSize,
|
||||
_pd: PhantomData<(State, Tag)>,
|
||||
_pd: PhantomData<(Rsc, Tag, GTag)>,
|
||||
}
|
||||
|
||||
impl<Rsc, const LEN: usize, Wa: WidgetArrLike<Rsc, LEN, Tag>, Tag> WidgetFnTrait<Rsc>
|
||||
for StackBuilder<Rsc, LEN, Wa, Tag>
|
||||
impl<Children: IntoWidgetVec<Rsc, Tag, GTag>, Rsc, Tag, GTag> WidgetFnTrait<Rsc>
|
||||
for StackBuilder<Children, Rsc, Tag, GTag>
|
||||
{
|
||||
type Widget = Stack;
|
||||
|
||||
#[track_caller]
|
||||
fn run(self, rsc: &mut Rsc) -> Self::Widget {
|
||||
Stack {
|
||||
children: self.children.add(rsc).arr.into_iter().collect(),
|
||||
children: self.children.into_vec(rsc),
|
||||
size: self.size,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<State, const LEN: usize, Wa: WidgetArrLike<State, LEN, Tag>, Tag>
|
||||
StackBuilder<State, LEN, Wa, Tag>
|
||||
{
|
||||
pub fn new(children: Wa) -> Self {
|
||||
impl<Children: IntoWidgetVec<Rsc, Tag, GTag>, Rsc, Tag, GTag> StackBuilder<Children, Rsc, Tag, GTag> {
|
||||
pub fn new(children: Children) -> Self {
|
||||
Self {
|
||||
children,
|
||||
size: StackSize::default(),
|
||||
|
||||
+50
-7
@@ -131,18 +131,61 @@ widget_trait! {
|
||||
}
|
||||
}
|
||||
|
||||
pub trait CoreWidgetArr<Rsc, const LEN: usize, Wa: WidgetArrLike<Rsc, LEN, Tag>, Tag> {
|
||||
fn span(self, dir: Dir) -> SpanBuilder<Rsc, LEN, Wa, Tag>;
|
||||
fn stack(self) -> StackBuilder<Rsc, LEN, Wa, Tag>;
|
||||
pub trait CoreWidgetArr<Children, Rsc, Tag, GTag> {
|
||||
fn span(self, dir: Dir) -> SpanBuilder<Children, Rsc, Tag, GTag>;
|
||||
fn stack(self) -> StackBuilder<Children, Rsc, Tag, GTag>;
|
||||
}
|
||||
|
||||
impl<State, const LEN: usize, Wa: WidgetArrLike<State, LEN, Tag>, Tag>
|
||||
CoreWidgetArr<State, LEN, Wa, Tag> for Wa
|
||||
impl<Children: IntoWidgetVec<Rsc, Tag, GTag>, Rsc, Tag, GTag>
|
||||
CoreWidgetArr<Children, Rsc, Tag, GTag> for Children
|
||||
{
|
||||
fn span(self, dir: Dir) -> SpanBuilder<State, LEN, Wa, Tag> {
|
||||
fn span(self, dir: Dir) -> SpanBuilder<Children, Rsc, Tag, GTag> {
|
||||
SpanBuilder::new(self, dir)
|
||||
}
|
||||
fn stack(self) -> StackBuilder<State, LEN, Wa, Tag> {
|
||||
fn stack(self) -> StackBuilder<Children, Rsc, Tag, GTag> {
|
||||
StackBuilder::new(self)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait RscFnMap<Rsc> {
|
||||
type Input;
|
||||
fn rsc_map<O>(
|
||||
self,
|
||||
f: impl Fn(Self::Input, &mut Rsc) -> O + Clone,
|
||||
) -> impl Iterator<Item = impl FnOnce(&mut Rsc) -> O>;
|
||||
}
|
||||
|
||||
impl<I: IntoIterator, Rsc> RscFnMap<Rsc> for I {
|
||||
type Input = I::Item;
|
||||
fn rsc_map<O>(
|
||||
self,
|
||||
f: impl Fn(Self::Input, &mut Rsc) -> O + Clone,
|
||||
) -> impl Iterator<Item = impl FnOnce(&mut Rsc) -> O> {
|
||||
self.into_iter().map(move |i| {
|
||||
let f = f.clone();
|
||||
move |rsc: &mut Rsc| f(i, rsc)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub trait WidgetFnMap<Rsc: UiRsc> {
|
||||
fn widget_map<O: WidgetLike<Rsc, Tag>, Tag>(
|
||||
self,
|
||||
f: impl Fn(WeakWidget) -> O + Clone,
|
||||
) -> impl Iterator<Item = impl FnOnce(&mut Rsc) -> WeakWidget>;
|
||||
}
|
||||
|
||||
impl<I: IntoIterator, Rsc: UiRsc> WidgetFnMap<Rsc> for I
|
||||
where
|
||||
I::Item: WidgetIdFn<Rsc>,
|
||||
{
|
||||
fn widget_map<O: WidgetLike<Rsc, Tag>, Tag>(
|
||||
self,
|
||||
f: impl Fn(WeakWidget) -> O + Clone,
|
||||
) -> impl Iterator<Item = impl FnOnce(&mut Rsc) -> WeakWidget> {
|
||||
self.into_iter().map(move |f2| {
|
||||
let f = f.clone();
|
||||
move |rsc: &mut Rsc| f(f2(rsc)).add(rsc) as WeakWidget
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user