diff --git a/core/src/lib.rs b/core/src/lib.rs index f60415a..21882d9 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -2,10 +2,8 @@ #![feature(const_ops)] #![feature(const_trait_impl)] #![feature(const_convert)] -#![feature(map_try_insert)] #![feature(unboxed_closures)] #![feature(fn_traits)] -#![feature(const_cmp)] #![feature(const_destruct)] #![feature(portable_simd)] #![feature(associated_type_defaults)] diff --git a/core/src/widget/like.rs b/core/src/widget/like.rs index 45512ae..3c70891 100644 --- a/core/src/widget/like.rs +++ b/core/src/widget/like.rs @@ -34,7 +34,7 @@ pub trait HasRoot { pub trait WidgetArrLike { #[track_caller] - fn add(self, state: &mut Rsc) -> WidgetArr; + fn add(self, rsc: &mut Rsc) -> WidgetArr; } impl WidgetArrLike for WidgetArr { @@ -58,6 +58,13 @@ macro_rules! impl_widget_arr { ) } } + impl,$Tag,)*> IntoWidgetVec for ($($W,)*) { + fn into_vec(self, rsc: &mut Rsc) -> Vec { + #[allow(non_snake_case)] + let ($($W,)*) = self; + vec![$($W.add(rsc).upgrade(rsc),)*] + } + } }; } diff --git a/core/src/widget/mod.rs b/core/src/widget/mod.rs index a0f084c..e2eed8d 100644 --- a/core/src/widget/mod.rs +++ b/core/src/widget/mod.rs @@ -1,4 +1,4 @@ -use crate::{Axis, AxisT, Len, Painter, SizeCtx}; +use crate::{Axis, AxisT, Len, Painter, SizeCtx, UiRsc}; use std::any::Any; mod data; @@ -85,3 +85,16 @@ impl Option> WidgetOption f self(state) } } + +pub trait IntoWidgetVec { + fn into_vec(self, rsc: &mut Rsc) -> Vec; +} + +impl IntoWidgetVec for I +where + I::Item: WidgetLike, +{ + fn into_vec(self, rsc: &mut Rsc) -> Vec { + self.into_iter().map(|w| w.add_strong(rsc).any()).collect() + } +} diff --git a/core/src/widget/tag.rs b/core/src/widget/tag.rs index 1356dac..e4aa6a1 100644 --- a/core/src/widget/tag.rs +++ b/core/src/widget/tag.rs @@ -62,3 +62,4 @@ impl WidgetLike for V { } pub struct ArrTag; +pub struct IterTag; diff --git a/src/widget/position/span.rs b/src/widget/position/span.rs index ad4f932..49937a6 100644 --- a/src/widget/position/span.rs +++ b/src/widget/position/span.rs @@ -152,32 +152,32 @@ impl Span { } } -pub struct SpanBuilder, Tag> { - pub children: Wa, +pub struct SpanBuilder { + pub children: Children, pub dir: Dir, pub gap: f32, - _pd: PhantomData<(State, Tag)>, + _pd: PhantomData<(Rsc, Tag, GTag)>, } -impl, Tag> WidgetFnTrait - for SpanBuilder +impl, Rsc, Tag, GTag> WidgetFnTrait + for SpanBuilder { 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, Tag> - SpanBuilder +impl, Rsc, Tag, GTag> + SpanBuilder { - pub fn new(children: Wa, dir: Dir) -> Self { + pub fn new(children: Children, dir: Dir) -> Self { Self { children, dir, diff --git a/src/widget/position/stack.rs b/src/widget/position/stack.rs index fb4a591..8820adb 100644 --- a/src/widget/position/stack.rs +++ b/src/widget/position/stack.rs @@ -42,30 +42,28 @@ pub enum StackSize { Child(usize), } -pub struct StackBuilder, Tag> { - pub children: Wa, +pub struct StackBuilder { + pub children: Children, pub size: StackSize, - _pd: PhantomData<(State, Tag)>, + _pd: PhantomData<(Rsc, Tag, GTag)>, } -impl, Tag> WidgetFnTrait - for StackBuilder +impl, Rsc, Tag, GTag> WidgetFnTrait + for StackBuilder { 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, Tag> - StackBuilder -{ - pub fn new(children: Wa) -> Self { +impl, Rsc, Tag, GTag> StackBuilder { + pub fn new(children: Children) -> Self { Self { children, size: StackSize::default(), diff --git a/src/widget/trait_fns.rs b/src/widget/trait_fns.rs index effebc8..d034568 100644 --- a/src/widget/trait_fns.rs +++ b/src/widget/trait_fns.rs @@ -131,18 +131,61 @@ widget_trait! { } } -pub trait CoreWidgetArr, Tag> { - fn span(self, dir: Dir) -> SpanBuilder; - fn stack(self) -> StackBuilder; +pub trait CoreWidgetArr { + fn span(self, dir: Dir) -> SpanBuilder; + fn stack(self) -> StackBuilder; } -impl, Tag> - CoreWidgetArr for Wa +impl, Rsc, Tag, GTag> + CoreWidgetArr for Children { - fn span(self, dir: Dir) -> SpanBuilder { + fn span(self, dir: Dir) -> SpanBuilder { SpanBuilder::new(self, dir) } - fn stack(self) -> StackBuilder { + fn stack(self) -> StackBuilder { StackBuilder::new(self) } } + +pub trait RscFnMap { + type Input; + fn rsc_map( + self, + f: impl Fn(Self::Input, &mut Rsc) -> O + Clone, + ) -> impl Iterator O>; +} + +impl RscFnMap for I { + type Input = I::Item; + fn rsc_map( + self, + f: impl Fn(Self::Input, &mut Rsc) -> O + Clone, + ) -> impl Iterator O> { + self.into_iter().map(move |i| { + let f = f.clone(); + move |rsc: &mut Rsc| f(i, rsc) + }) + } +} + +pub trait WidgetFnMap { + fn widget_map, Tag>( + self, + f: impl Fn(WeakWidget) -> O + Clone, + ) -> impl Iterator WeakWidget>; +} + +impl WidgetFnMap for I +where + I::Item: WidgetIdFn, +{ + fn widget_map, Tag>( + self, + f: impl Fn(WeakWidget) -> O + Clone, + ) -> impl Iterator WeakWidget> { + self.into_iter().map(move |f2| { + let f = f.clone(); + move |rsc: &mut Rsc| f(f2(rsc)).add(rsc) as WeakWidget + }) + } +}