diff --git a/crates/tek_core/src/audio.rs b/crates/tek_core/src/audio.rs index a3d23759..2a86027e 100644 --- a/crates/tek_core/src/audio.rs +++ b/crates/tek_core/src/audio.rs @@ -16,13 +16,13 @@ pub trait Device: Component + Process { } /// All things that implement the required traits can be treated as `Device`. -impl Device for D where D: Component + Process {} +impl + Process> Device for W {} -impl<'a, E: Engine> Render for Box + 'a> { - fn render (&self, to: &mut E) -> Perhaps { - (**self).render(to) - } -} +//impl<'a, E: Engine> Render for Box + 'a> { + //fn render (&self, to: &mut E) -> Perhaps { + //(**self).render(to) + //} +//} /// Wraps [Client] or [DynamicAsyncClient] in place. pub enum JackClient { diff --git a/crates/tek_core/src/audio/device.rs b/crates/tek_core/src/audio/device.rs index c05da5f9..ffe292a4 100644 --- a/crates/tek_core/src/audio/device.rs +++ b/crates/tek_core/src/audio/device.rs @@ -16,7 +16,7 @@ impl std::fmt::Debug for JackDevice { f.debug_struct("JackDevice").field("ports", &self.ports).finish() } } -impl Render for JackDevice { +impl Widget for JackDevice { fn render (&self, to: &mut E) -> Perhaps { self.state.read().unwrap().render(to) } diff --git a/crates/tek_core/src/engine.rs b/crates/tek_core/src/engine.rs index ec13a12b..d5fb7bff 100644 --- a/crates/tek_core/src/engine.rs +++ b/crates/tek_core/src/engine.rs @@ -35,5 +35,5 @@ submod! { handle keymap layout - render + //render } diff --git a/crates/tek_core/src/engine/collect.rs b/crates/tek_core/src/engine/collect.rs index 51054e85..45b57d2b 100644 --- a/crates/tek_core/src/engine/collect.rs +++ b/crates/tek_core/src/engine/collect.rs @@ -1,25 +1,24 @@ use crate::*; pub enum Collected<'a, E: Engine> { - Box(Box + 'a>), - Ref(&'a (dyn Layout + 'a)), + Box(Box + 'a>), + Ref(&'a (dyn Widget + 'a)), } -impl<'a, E: Engine> Render for Collected<'a, E> { - fn render (&self, to: &mut E) -> Perhaps { - match self { - Self::Box(inner) => (*inner).render(to), - Self::Ref(inner) => (*inner).render(to), - } - } -} -impl<'a, E: Engine> Layout for Collected<'a, E> { +impl<'a, E: Engine> Widget for Collected<'a, E> { + type Engine = E; fn layout (&self, area: E::Area) -> Perhaps { match self { Self::Box(inner) => (*inner).layout(area), Self::Ref(inner) => (*inner).layout(area), } } + fn render (&self, to: &mut E) -> Perhaps { + match self { + Self::Box(inner) => (*inner).render(to), + Self::Ref(inner) => (*inner).render(to), + } + } } pub struct Collection<'a, E: Engine>( @@ -33,9 +32,9 @@ impl<'a, E: Engine> Collection<'a, E> { } pub trait Collect<'a, E: Engine> { - fn add_box (self, item: Box + 'a>) -> Self; - fn add_ref (self, item: &'a dyn Layout) -> Self; - fn add + Sized + 'a> (self, item: R) -> Self + fn add_box (self, item: Box + 'a>) -> Self; + fn add_ref (self, item: &'a dyn Widget) -> Self; + fn add + Sized + 'a> (self, item: R) -> Self where Self: Sized { self.add_box(Box::new(item)) @@ -43,17 +42,17 @@ pub trait Collect<'a, E: Engine> { } impl<'a, E: Engine> Collect<'a, E> for Collection<'a, E> { - fn add_box (mut self, item: Box + 'a>) -> Self { + fn add_box (mut self, item: Box + 'a>) -> Self { self.0.push(Collected::Box(item)); self } - fn add_ref (mut self, item: &'a dyn Layout) -> Self { + fn add_ref (mut self, item: &'a dyn Widget) -> Self { self.0.push(Collected::Ref(item)); self } } -pub struct Layers<'a, E: Engine>(pub &'a [&'a dyn Layout]); +pub struct Layers<'a, E: Engine>(pub &'a [&'a dyn Widget]); // this actually works, except for the type inference //pub struct Layers<'a, E: Engine + 'a, I: std::iter::IntoIterator>>( @@ -69,11 +68,11 @@ impl<'a, E: Engine> Layered<'a, E> { } impl<'a, E: Engine> Collect<'a, E> for Layered<'a, E> { - fn add_box (mut self, item: Box + 'a>) -> Self { + fn add_box (mut self, item: Box + 'a>) -> Self { self.0 = self.0.add_box(item); self } - fn add_ref (mut self, item: &'a dyn Layout) -> Self { + fn add_ref (mut self, item: &'a dyn Widget) -> Self { self.0 = self.0.add_ref(item); self } @@ -118,11 +117,11 @@ impl<'a, E: Engine> Split<'a, E> { } impl<'a, E: Engine> Collect<'a, E> for Split<'a, E> { - fn add_box (mut self, item: Box + 'a>) -> Self { + fn add_box (mut self, item: Box + 'a>) -> Self { self.items = self.items.add_box(item); self } - fn add_ref (mut self, item: &'a dyn Layout) -> Self { + fn add_ref (mut self, item: &'a dyn Widget) -> Self { self.items = self.items.add_ref(item); self } diff --git a/crates/tek_core/src/engine/component.rs b/crates/tek_core/src/engine/component.rs index 1c11f98d..ceb1ed5f 100644 --- a/crates/tek_core/src/engine/component.rs +++ b/crates/tek_core/src/engine/component.rs @@ -1,10 +1,10 @@ use crate::*; /// A UI component. -pub trait Component: Render + Handle + Layout {} +pub trait Component: Widget + Handle {} /// Everything that implements [Render] and [Handle] is a [Component]. -impl + Handle + Layout> Component for C {} +impl + Handle> Component for C {} /// Marker trait for [Component]s that can [Exit] pub trait ExitableComponent: Exit + Component where E: Engine { diff --git a/crates/tek_core/src/engine/focus.rs b/crates/tek_core/src/engine/focus.rs index b9d42ada..3e680126 100644 --- a/crates/tek_core/src/engine/focus.rs +++ b/crates/tek_core/src/engine/focus.rs @@ -1,7 +1,7 @@ use crate::*; /// A component that may contain [Focusable] components. -pub trait Focus : Render + Handle { +pub trait Focus : Widget + Handle { fn focus (&self) -> usize; fn focus_mut (&mut self) -> &mut usize; fn focusable (&self) -> [&dyn Focusable;N]; @@ -33,13 +33,13 @@ pub trait Focus : Render + Handle { } /// A component that may be focused. -pub trait Focusable: Render + Handle { +pub trait Focusable: Widget + Handle { fn is_focused (&self) -> bool; fn set_focused (&mut self, focused: bool); } impl, E: Engine> Focusable for Option - where Option: Render + where Option: Widget { fn is_focused (&self) -> bool { match self { diff --git a/crates/tek_core/src/engine/layout.rs b/crates/tek_core/src/engine/layout.rs index e28bfe46..a89a8a43 100644 --- a/crates/tek_core/src/engine/layout.rs +++ b/crates/tek_core/src/engine/layout.rs @@ -2,46 +2,46 @@ use crate::*; // TODO: Convert to component // pub enum Align { Center, NW, N, NE, E, SE, S, SW, W, } -pub fn center_box (area: [u16;4], w: u16, h: u16) -> [u16;4] { - let width = w.min(area.w() * 3 / 5); - let height = h.min(area.w() * 3 / 5); - let x = area.x() + (area.w() - width) / 2; - let y = area.y() + (area.h() - height) / 2; - [x, y, width, height] -} +//pub fn center_box (area: [u16;4], w: u16, h: u16) -> [u16;4] { + //let width = w.min(area.w() * 3 / 5); + //let height = h.min(area.w() * 3 / 5); + //let x = area.x() + (area.w() - width) / 2; + //let y = area.y() + (area.h() - height) / 2; + //[x, y, width, height] +//} -/// Trait for structs that compute drawing area before rendering -pub trait Layout: Render { - fn layout (&self, area: E::Area) -> Perhaps; -} -impl<'a, E: Engine> Layout for Box + 'a> { - fn layout (&self, area: E::Area) -> Perhaps { - (**self).layout(area) - } -} -impl<'a, E: Engine> Layout for Box + 'a> { - fn layout (&self, area: E::Area) -> Perhaps { - (**self).layout(area) - } -} -impl> Layout for &T { - fn layout (&self, area: E::Area) -> Perhaps { - (*self).layout(area) - } -} -impl> Layout for &mut T { - fn layout (&self, area: E::Area) -> Perhaps { - (**self).layout(area) - } -} -impl> Layout for Option { - fn layout (&self, area: E::Area) -> Perhaps { - match self { - Some(layout) => layout.layout(area), - None => Ok(None) - } - } -} +///// Trait for structs that compute drawing area before rendering +//pub trait Layout: Render { + //fn layout (&self, area: E::Area) -> Perhaps; +//} +//impl<'a, E: Engine> Layout for Box + 'a> { + //fn layout (&self, area: E::Area) -> Perhaps { + //(**self).layout(area) + //} +//} +//impl<'a, E: Engine> Layout for Box + 'a> { + //fn layout (&self, area: E::Area) -> Perhaps { + //(**self).layout(area) + //} +//} +//impl> Layout for &T { + //fn layout (&self, area: E::Area) -> Perhaps { + //(*self).layout(area) + //} +//} +//impl> Layout for &mut T { + //fn layout (&self, area: E::Area) -> Perhaps { + //(**self).layout(area) + //} +//} +//impl> Layout for Option { + //fn layout (&self, area: E::Area) -> Perhaps { + //match self { + //Some(layout) => layout.layout(area), + //None => Ok(None) + //} + //} +//} /// Override X and Y coordinates, aligning to corner, side, or center of area pub enum Align { Center(L), NW(L), N(L), NE(L), W(L), E(L), SW(L), S(L), SE(L) } diff --git a/crates/tek_core/src/engine/render.rs b/crates/tek_core/src/engine/render.rs index 29c330de..648fffe1 100644 --- a/crates/tek_core/src/engine/render.rs +++ b/crates/tek_core/src/engine/render.rs @@ -1,77 +1,77 @@ use crate::*; -/// Render to output. -pub trait Render: Send + Sync { - fn render (&self, to: &mut E) -> Perhaps; -} +///// Render to output. +//pub trait Render: Send + Sync { + //fn render (&self, to: &mut E) -> Perhaps; +//} -impl Render for () { - fn render (&self, to: &mut E) -> Perhaps { - Ok(None) - } -} +//impl Render for () { + //fn render (&self, to: &mut E) -> Perhaps { + //Ok(None) + //} +//} -/// Options can be rendered optionally. -impl Render for Option where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - match self { - Some(component) => component.render(to), - None => Ok(None) - } - } -} +///// Options can be rendered optionally. +//impl Render for Option where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //match self { + //Some(component) => component.render(to), + //None => Ok(None) + //} + //} +//} -/// Boxed references can be rendered. -impl<'a, E: Engine> Render for Box + 'a> { - fn render (&self, to: &mut E) -> Perhaps { - (**self).render(to) - } -} -impl<'a, E: Engine> Render for Box + 'a> { - fn render (&self, to: &mut E) -> Perhaps { - (**self).render(to) - } -} -impl<'a, E: Engine> Render for Box + 'a> { - fn render (&self, to: &mut E) -> Perhaps { - (**self).render(to) - } -} +///// Boxed references can be rendered. +//impl<'a, E: Engine> Render for Box + 'a> { + //fn render (&self, to: &mut E) -> Perhaps { + //(**self).render(to) + //} +//} +//impl<'a, E: Engine> Render for Box + 'a> { + //fn render (&self, to: &mut E) -> Perhaps { + //(**self).render(to) + //} +//} +//impl<'a, E: Engine> Render for Box + 'a> { + //fn render (&self, to: &mut E) -> Perhaps { + //(**self).render(to) + //} +//} -/// Immutable references can be rendered. -impl Render for &R where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - (*self).render(to) - } -} +///// Immutable references can be rendered. +//impl Render for &R where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //(*self).render(to) + //} +//} -/// Mutable references can be rendered. -impl Render for &mut R where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - (**self).render(to) - } -} +///// Mutable references can be rendered. +//impl Render for &mut R where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //(**self).render(to) + //} +//} -/// Counted references can be rendered. -impl Render for Arc where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - self.as_ref().render(to) - } -} +///// Counted references can be rendered. +//impl Render for Arc where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //self.as_ref().render(to) + //} +//} -/// References behind a [Mutex] can be rendered. -impl Render for Mutex where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - self.lock().unwrap().render(to) - } -} +///// References behind a [Mutex] can be rendered. +//impl Render for Mutex where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //self.lock().unwrap().render(to) + //} +//} -/// References behind a [RwLock] can be rendered. -impl Render for RwLock where R: Render { - fn render (&self, to: &mut E) -> Perhaps { - self.read().unwrap().render(to) - } -} +///// References behind a [RwLock] can be rendered. +//impl Render for RwLock where R: Render { + //fn render (&self, to: &mut E) -> Perhaps { + //self.read().unwrap().render(to) + //} +//} // FIXME: components are now 2 thunks (layout and render). // maybe this resolves the conflict describe below? diff --git a/crates/tek_core/src/tui/tui_border.rs b/crates/tek_core/src/tui/tui_border.rs index ce99c926..261c604a 100644 --- a/crates/tek_core/src/tui/tui_border.rs +++ b/crates/tek_core/src/tui/tui_border.rs @@ -98,12 +98,11 @@ macro_rules! border { const SE: &'static str = $se; $($x)* } - impl Layout for $T { + impl Widget for $T { + type Engine = Tui; fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { Ok(Some(area)) } - } - impl Render for $T { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { self.draw(to) } diff --git a/crates/tek_core/src/tui/tui_colors.rs b/crates/tek_core/src/tui/tui_colors.rs index cd3a2454..a73185d5 100644 --- a/crates/tek_core/src/tui/tui_colors.rs +++ b/crates/tek_core/src/tui/tui_colors.rs @@ -1,14 +1,12 @@ use crate::*; -impl Layout for &str { +impl Widget for &str { + type Engine = Tui; fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { let [x, y, ..] = area; // TODO: line breaks Ok(Some([x, y, self.len() as u16, 1])) } -} - -impl Render for &str { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { let area = self.layout(to.area())?.unwrap(); to.blit(&self, area.x(), area.y(), None)?; @@ -16,15 +14,13 @@ impl Render for &str { } } -pub struct Styled>(pub Option