more Draw and Layout generic impls
Some checks failed
/ build (push) Has been cancelled

- okay, that seems to have fixed the FieldH/FieldV issue?
- thought that'd never happen
- still not happy with how Layout override is working
This commit is contained in:
🪞👃🪞 2025-09-29 05:50:14 +03:00
parent 731f4a971e
commit 8c54510f63
9 changed files with 179 additions and 118 deletions

View file

@ -11,15 +11,27 @@ mod layout_stack; //pub use self::layout_stack::*;
/// Drawable area of display.
pub trait Layout<O: Out> {
fn x (&self, to: O::Area) -> O::Unit { to.x() }
fn y (&self, to: O::Area) -> O::Unit { to.y() }
fn min_w (&self, to: O::Area) -> O::Unit { 0.into() }
fn max_w (&self, to: O::Area) -> O::Unit { to.w() }
fn x (&self, to: O::Area) -> O::Unit {
to.x()
}
fn y (&self, to: O::Area) -> O::Unit {
to.y()
}
fn min_w (&self, _to: O::Area) -> O::Unit {
0.into()
}
fn max_w (&self, to: O::Area) -> O::Unit {
to.w()
}
fn w (&self, to: O::Area) -> O::Unit {
to.w().max(self.min_w(to)).min(self.max_w(to))
}
fn min_h (&self, to: O::Area) -> O::Unit { 0.into() }
fn max_h (&self, to: O::Area) -> O::Unit { to.h() }
fn min_h (&self, _to: O::Area) -> O::Unit {
0.into()
}
fn max_h (&self, to: O::Area) -> O::Unit {
to.h()
}
fn h (&self, to: O::Area) -> O::Unit {
to.h().max(self.min_h(to)).min(self.max_h(to))
}
@ -64,6 +76,18 @@ impl<O: Out, L: Layout<O>> Layout<O> for &mut L {
fn layout (&self, a: O::Area) -> O::Area { (**self).layout(a) }
}
impl<O: Out, L: Layout<O>> Layout<O> for Arc<L> {
fn x (&self, a: O::Area) -> O::Unit { (**self).x(a) }
fn y (&self, a: O::Area) -> O::Unit { (**self).y(a) }
fn w (&self, a: O::Area) -> O::Unit { (**self).w(a) }
fn min_w (&self, a: O::Area) -> O::Unit { (**self).min_w(a) }
fn max_w (&self, a: O::Area) -> O::Unit { (**self).max_w(a) }
fn h (&self, a: O::Area) -> O::Unit { (**self).h(a) }
fn min_h (&self, a: O::Area) -> O::Unit { (**self).min_h(a) }
fn max_h (&self, a: O::Area) -> O::Unit { (**self).max_h(a) }
fn layout (&self, a: O::Area) -> O::Area { (**self).layout(a) }
}
impl<O: Out> Layout<O> for Box<dyn Layout<O>> {
fn x (&self, a: O::Area) -> O::Unit { (**self).x(a) }
fn y (&self, a: O::Area) -> O::Unit { (**self).y(a) }
@ -76,6 +100,18 @@ impl<O: Out> Layout<O> for Box<dyn Layout<O>> {
fn layout (&self, a: O::Area) -> O::Area { (**self).layout(a) }
}
impl<O: Out, L: Layout<O>> Layout<O> for RwLock<L> {
fn x (&self, a: O::Area) -> O::Unit { self.read().unwrap().x(a) }
fn y (&self, a: O::Area) -> O::Unit { self.read().unwrap().y(a) }
fn w (&self, a: O::Area) -> O::Unit { self.read().unwrap().w(a) }
fn min_w (&self, a: O::Area) -> O::Unit { self.read().unwrap().min_w(a) }
fn max_w (&self, a: O::Area) -> O::Unit { self.read().unwrap().max_w(a) }
fn h (&self, a: O::Area) -> O::Unit { self.read().unwrap().h(a) }
fn min_h (&self, a: O::Area) -> O::Unit { self.read().unwrap().min_h(a) }
fn max_h (&self, a: O::Area) -> O::Unit { self.read().unwrap().max_h(a) }
fn layout (&self, a: O::Area) -> O::Area { self.read().unwrap().layout(a) }
}
impl<O: Out, L: Layout<O>> Layout<O> for Option<L> {
fn x (&self, to: O::Area) -> O::Unit {
self.as_ref().map(|c|c.x(to)).unwrap_or(to.x())
@ -106,3 +142,20 @@ impl<O: Out, L: Layout<O>> Layout<O> for Option<L> {
.unwrap_or([to.x(), to.y(), 0.into(), 0.into()].into())
}
}
pub struct Bounded<O: Out, D>(pub O::Area, pub D);
impl<O: Out, D: Content<O>> HasContent<O> for Bounded<O, D> {
fn content (&self) -> impl Content<O> {
&self.1
}
}
impl<O: Out, T: Draw<O>> Draw<O> for Bounded<O, T> {
fn draw (&self, to: &mut O) {
let area = to.area();
*to.area_mut() = self.0;
self.1.draw(to);
*to.area_mut() = area;
}
}