use crate::*; pub trait Layout: Draw + Sized { fn full_w (self) -> impl Draw { Full::W(self) } fn full_h (self) -> impl Draw { Full::H(self) } fn full_wh (self) -> impl Draw { Full::WH(self) } fn exact_w >> (self, x: N) -> impl Draw { Exact::W(self, x.into()) } fn exact_h >> (self, y: N) -> impl Draw { Exact::H(self, y.into()) } fn exact_wh >> (self, x: N, y: N) -> impl Draw { Exact::WH(self, x.into(), y.into()) } fn min_w >> (self, x: N) -> impl Draw { Min::W(self, x.into()) } fn min_h >> (self, y: N) -> impl Draw { Min::H(self, y.into()) } fn min_wh >> (self, x: N, y: N) -> impl Draw { Min::WH(self, x.into(), y.into()) } fn max_w >> (self, x: N) -> impl Draw { Max::W(self, x.into()) } fn max_h >> (self, y: N) -> impl Draw { Max::H(self, y.into()) } fn max_wh >> (self, x: N, y: N) -> impl Draw { Max::WH(self, x.into(), y.into()) } fn pad_w >> (self, x: N) -> impl Draw { Pad::W(self, x.into()) } fn pad_h >> (self, y: N) -> impl Draw { Pad::H(self, y.into()) } fn pad_wh >> (self, x: N, y: N) -> impl Draw { Pad::WH(self, x.into(), y.into()) } fn pull_x >> (self, x: N) -> impl Draw { Pull::X(self, x.into()) } fn pull_y >> (self, y: N) -> impl Draw { Pull::X(self, y.into()) } fn pull_xy >> (self, x: N, y: N) -> impl Draw { Pull::XY(self, x.into(), y.into()) } fn push_x >> (self, x: N) -> impl Draw { Push::X(self, x.into()) } fn push_y >> (self, y: N) -> impl Draw { Push::X(self, y.into()) } fn push_xy >> (self, x: N, y: N) -> impl Draw { Push::XY(self, x.into(), y.into()) } fn align (self, azimuth: impl Into>) -> impl Draw { Align(azimuth.into(), self) } fn align_c (self) -> impl Draw { Align(Some(Azimuth::C), self) } fn align_x (self) -> impl Draw { Align(Some(Azimuth::X), self) } fn align_y (self) -> impl Draw { Align(Some(Azimuth::Y), self) } fn align_n (self) -> impl Draw { Align(Some(Azimuth::N), self) } fn align_s (self) -> impl Draw { Align(Some(Azimuth::S), self) } fn align_e (self) -> impl Draw { Align(Some(Azimuth::E), self) } fn align_w (self) -> impl Draw { Align(Some(Azimuth::W), self) } fn align_ne (self) -> impl Draw { Align(Some(Azimuth::NE), self) } fn align_se (self) -> impl Draw { Align(Some(Azimuth::SE), self) } fn align_nw (self) -> impl Draw { Align(Some(Azimuth::NW), self) } fn align_sw (self) -> impl Draw { Align(Some(Azimuth::SW), self) } fn origin (self, azimuth: impl Into>) -> impl Draw { Origin(azimuth.into(), self) } fn origin_c (self) -> impl Draw { Origin(Some(Azimuth::C), self) } fn origin_x (self) -> impl Draw { Origin(Some(Azimuth::X), self) } fn origin_y (self) -> impl Draw { Origin(Some(Azimuth::Y), self) } fn origin_n (self) -> impl Draw { Origin(Some(Azimuth::N), self) } fn origin_s (self) -> impl Draw { Origin(Some(Azimuth::S), self) } fn origin_e (self) -> impl Draw { Origin(Some(Azimuth::E), self) } fn origin_w (self) -> impl Draw { Origin(Some(Azimuth::W), self) } fn origin_ne (self) -> impl Draw { Origin(Some(Azimuth::NE), self) } fn origin_se (self) -> impl Draw { Origin(Some(Azimuth::SE), self) } fn origin_nw (self) -> impl Draw { Origin(Some(Azimuth::NW), self) } fn origin_sw (self) -> impl Draw { Origin(Some(Azimuth::SW), self) } } impl> Layout for T {} /// Use whole drawing area along one or both axes. /// /// ``` /// use tengri::Layout; /// let _ = "".full_w(); /// let _ = "".full_h(); /// let _ = "".full_wh(); /// ``` pub enum Full> { __(PhantomData), W(I), H(I), WH(I), } impl_draw!(,>|self: Full, _to: T|{ todo!() }); /// Move content in the positive direction of one or both axes. /// /// ``` /// use tengri::Layout; /// let _ = "".push_x(1); /// let _ = "".push_y(1); /// let _ = "".push_xy(1, 1); /// ``` pub enum Push, X: Into>> { __(PhantomData), X(I, X), Y(I, X), XY(I, X, X), } impl_draw!(, X: Into>,>|self: Push, _to: T|{ todo!() }); /// Move content in the negative direction of one or both axes. /// /// ``` /// use tengri::Layout; /// let _ = "".pull_x(1); /// let _ = "".pull_y(1); /// let _ = "".pull_xy(1, 1); /// ``` pub enum Pull, X: Into>> { __(PhantomData), X(I, X), Y(I, X), XY(I, X, X), } impl_draw!(, X: Into>,>|self: Pull, _to: T|{ todo!() }); /// Only draw content if area is above a certain size. /// /// ``` /// use tengri::Layout; /// let _ = "".min_w(1); /// let _ = "".min_h(1); /// let _ = "".min_wh(1, 1); /// ``` pub enum Min, X: Into>> { __(PhantomData), W(I, X), H(I, X), WH(I, X, X), } impl_draw!(, X: Into>,>|self: Min, _to: T|{ todo!() }); /// Set maximum size of of drawing area. /// /// ``` /// use tengri::Layout; /// let _ = "".max_w(1); /// let _ = "".max_h(1); /// let _ = "".max_wh(1, 1); /// ``` pub enum Max, X: Into>> { __(PhantomData), W(I, X), H(I, X), WH(I, X, X), } impl_draw!(, X: Into>,>|self: Max, _to: T|{ todo!() }); /// Set size of of drawing area. /// /// ``` /// use tengri::Layout; /// let _ = "".exact_w(1); /// let _ = "".exact_h(1); /// let _ = "".exact_wh(1, 1); /// ``` pub enum Exact, X: Into>> { __(PhantomData), W(I, X), H(I, X), WH(I, X, X), } impl_draw!(, X: Into>,>|self: Exact, _to: T|{ todo!() }); /// Define inner drawing area. /// /// ``` /// use tengri::Layout; /// let _ = "".pad_w(1); /// let _ = "".pad_h(1); /// let _ = "".pad_wh(1, 1); /// ``` pub enum Pad, X: Into>> { __(PhantomData), W(I, X), H(I, X), WH(I, X, X), } impl_draw!(, X: Into>,>|self: Pad, _to: T|{ todo!() }); pub struct Align(Option, T); impl_draw!(,>|self: Align, _to: S|{ todo!() }); /// Where is [0, 0] located? /// /// ``` /// use tengri::*; /// use Azimuth::*; /// let _ = "".align(NW); /// ``` #[cfg_attr(test, derive(Arbitrary))] #[derive(Debug, Copy, Clone, Default)] pub enum Azimuth { #[default] C, X, Y, NW, N, NE, E, SE, S, SW, W } /// ``` /// use tengri::*; /// let _ = area(None, "unareaed"); /// let _ = area(XYWH(1, 2, 3, 4), "southeast"); /// let _ = area(Some(XYWH(1, 2, 3, 4)), "southeast"); /// ``` pub fn area , U: Into>>> ( origin: U, it: T ) -> Area { Area(origin.into(), it) } pub struct Area>(Option>, T); impl_draw!(,>|self: Area, _to: S|{ todo!() }); pub struct Origin(Option, T); impl_draw!(,>|self: Origin, _to: S|{ todo!() }); /// Something that has `[0, 0]` at a particular point. pub trait HasOrigin { fn origin (&self) -> Azimuth; } impl> HasOrigin for T { fn origin (&self) -> Azimuth { *self.as_ref() } }