wip3 (25e): woohoohoo

This commit is contained in:
🪞👃🪞 2024-12-09 16:34:45 +01:00
parent 3de89bf4fd
commit 36280ce9b7
40 changed files with 1607 additions and 1412 deletions

View file

@ -58,7 +58,8 @@ impl<'a, E: Engine, const N: usize> Iterator for CollectIterator<'a, E, N> {
Collect::Array(array) => {
if let Some(item) = array.get(self.0) {
self.0 += 1;
Some(item)
//Some(item)
None
} else {
None
}
@ -66,7 +67,8 @@ impl<'a, E: Engine, const N: usize> Iterator for CollectIterator<'a, E, N> {
Collect::Slice(slice) => {
if let Some(item) = slice.get(self.0) {
self.0 += 1;
Some(item)
//Some(item)
None
} else {
None
}

View file

@ -15,6 +15,39 @@ pub fn widget <E: Engine, T: Render<E>> (w: &T) -> &dyn Render<E> {
w as &dyn Render<E>
}
/// A [Render] that contains other [Render]s
pub trait Content<E: Engine>: Send + Sync {
fn content (&self) -> impl Render<E>;
}
//impl<E: Engine, C: Content<E>> Render<E> for &C {
//fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
//self.content().min_size(to)
//}
//fn render (&self, to: &mut E::Output) -> Usually<()> {
//match self.min_size(to.area().wh().into())? {
//Some(wh) => to.render_in(to.area().clip(wh).into(), &self.content()),
//None => Ok(())
//}
//}
//}
/*
/// Every struct that has [Content] is a renderable [Render].
impl<E: Engine, C: Content<E>> Render<E> for C {
fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
self.content().min_size(to)
}
fn render (&self, to: &mut E::Output) -> Usually<()> {
match self.min_size(to.area().wh().into())? {
Some(wh) => to.render_in(to.area().clip(wh).into(), &self.content()),
None => Ok(())
}
}
}
*/
/// A renderable component
pub trait Render<E: Engine>: Send + Sync {
/// Minimum size to use
@ -25,7 +58,7 @@ pub trait Render<E: Engine>: Send + Sync {
fn render (&self, to: &mut E::Output) -> Usually<()>;
}
impl<E: Engine> Render<E> for &dyn Render<E> {
impl<E: Engine, R: Render<E>> Render<E> for &R {
fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
(*self).min_size(to)
}
@ -34,12 +67,21 @@ impl<E: Engine> Render<E> for &dyn Render<E> {
}
}
//impl<E: Engine> Render<E> for &dyn Render<E> {
//fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
//(*self).min_size(to)
//}
//fn render (&self, to: &mut E::Output) -> Usually<()> {
//(*self).render(to)
//}
//}
impl<E: Engine> Render<E> for &mut dyn Render<E> {
fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
(**self).min_size(to)
fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
(*self).min_size(to)
}
fn render (&self, to: &mut E::Output) -> Usually<()> {
(**self).render(to)
(*self).render(to)
}
}
@ -88,24 +130,6 @@ impl<E: Engine, W: Render<E>> Render<E> for Option<W> {
}
}
/// A [Render] that contains other [Render]s
pub trait Content<E: Engine>: Send + Sync {
fn content (&self) -> impl Render<E>;
}
/// Every struct that has [Content] is a renderable [Render].
impl<E: Engine, W: Content<E>> Render<E> for &W {
fn min_size (&self, to: E::Size) -> Perhaps<E::Size> {
self.content().min_size(to)
}
fn render (&self, to: &mut E::Output) -> Usually<()> {
match self.min_size(to.area().wh().into())? {
Some(wh) => to.render_in(to.area().clip(wh).into(), &self.content()),
None => Ok(())
}
}
}
/// A custom [Render] defined by passing layout and render closures in place.
pub struct Widget<
E: Engine,