Tui::at_ -> Align::_

This commit is contained in:
🪞👃🪞 2024-12-17 19:36:43 +01:00
parent e127924227
commit 914b569839
4 changed files with 36 additions and 38 deletions

View file

@ -1,48 +1,33 @@
use crate::*; use crate::*;
impl<E: Engine> LayoutAlign<E> for E {}
pub trait LayoutAlign<E: Engine> {
fn center_x <W: Render<E>> (w: W) -> Align<W> { Align::X(w) }
fn center_y <W: Render<E>> (w: W) -> Align<W> { Align::Y(w) }
fn center <W: Render<E>> (w: W) -> Align<W> { Align::Center(w) }
fn at_n <W: Render<E>> (w: W) -> Align<W> { Align::N(w) }
fn at_s <W: Render<E>> (w: W) -> Align<W> { Align::S(w) }
fn at_e <W: Render<E>> (w: W) -> Align<W> { Align::E(w) }
fn at_w <W: Render<E>> (w: W) -> Align<W> { Align::W(w) }
fn at_nw <W: Render<E>> (w: W) -> Align<W> { Align::NW(w) }
fn at_sw <W: Render<E>> (w: W) -> Align<W> { Align::SW(w) }
fn at_ne <W: Render<E>> (w: W) -> Align<W> { Align::NE(w) }
fn at_se <W: Render<E>> (w: W) -> Align<W> { Align::SE(w) }
}
/// Override X and Y coordinates, aligning to corner, side, or center of area /// Override X and Y coordinates, aligning to corner, side, or center of area
pub enum Align<L> { pub enum Align<E: Engine, T: Render<E>> {
_Unused(PhantomData<E>),
/// Draw at center of container /// Draw at center of container
Center(L), Center(T),
/// Draw at center of X axis /// Draw at center of X axis
X(L), X(T),
/// Draw at center of Y axis /// Draw at center of Y axis
Y(L), Y(T),
/// Draw at upper left corner of contaier /// Draw at upper left corner of contaier
NW(L), NW(T),
/// Draw at center of upper edge of container /// Draw at center of upper edge of container
N(L), N(T),
/// Draw at right left corner of contaier /// Draw at right left corner of contaier
NE(L), NE(T),
/// Draw at center of left edge of container /// Draw at center of left edge of container
W(L), W(T),
/// Draw at center of right edge of container /// Draw at center of right edge of container
E(L), E(T),
/// Draw at lower left corner of container /// Draw at lower left corner of container
SW(L), SW(T),
/// Draw at center of lower edge of container /// Draw at center of lower edge of container
S(L), S(T),
/// Draw at lower right edge of container /// Draw at lower right edge of container
SE(L) SE(T)
} }
impl<T> Align<T> { impl<E: Engine, T: Render<E>> Align<E, T> {
pub fn inner (&self) -> &T { pub fn inner (&self) -> &T {
match self { match self {
Self::Center(inner) => inner, Self::Center(inner) => inner,
@ -56,11 +41,23 @@ impl<T> Align<T> {
Self::SW(inner) => inner, Self::SW(inner) => inner,
Self::S(inner) => inner, Self::S(inner) => inner,
Self::SE(inner) => inner, Self::SE(inner) => inner,
_ => unreachable!(),
} }
} }
pub fn c (w: T) -> Self { Self::Center(w) }
pub fn x (w: T) -> Self { Self::X(w) }
pub fn y (w: T) -> Self { Self::Y(w) }
pub fn n (w: T) -> Self { Self::N(w) }
pub fn s (w: T) -> Self { Self::S(w) }
pub fn e (w: T) -> Self { Self::E(w) }
pub fn w (w: T) -> Self { Self::W(w) }
pub fn nw (w: T) -> Self { Self::NW(w) }
pub fn sw (w: T) -> Self { Self::SW(w) }
pub fn ne (w: T) -> Self { Self::NE(w) }
pub fn se (w: T) -> Self { Self::SE(w) }
} }
fn align<T, N: Coordinate, R: Area<N> + From<[N;4]>> (align: &Align<T>, outer: R, inner: R) -> Option<R> { fn align<E: Engine, T: Render<E>, N: Coordinate, R: Area<N> + From<[N;4]>> (align: &Align<E, T>, outer: R, inner: R) -> Option<R> {
if outer.w() < inner.w() || outer.h() < inner.h() { if outer.w() < inner.w() || outer.h() < inner.h() {
None None
} else { } else {
@ -78,11 +75,12 @@ fn align<T, N: Coordinate, R: Area<N> + From<[N;4]>> (align: &Align<T>, outer: R
Align::SW(_) => [ox, oy + oh - ih, iw, ih,].into(), Align::SW(_) => [ox, oy + oh - ih, iw, ih,].into(),
Align::S(_) => [ox + (ow - iw) / 2.into(), oy + oh - ih, iw, ih,].into(), Align::S(_) => [ox + (ow - iw) / 2.into(), oy + oh - ih, iw, ih,].into(),
Align::SE(_) => [ox + ow - iw, oy + oh - ih, iw, ih,].into(), Align::SE(_) => [ox + ow - iw, oy + oh - ih, iw, ih,].into(),
_ => unreachable!()
}) })
} }
} }
impl<E: Engine, T: Render<E>> Render<E> for Align<T> { impl<E: Engine, T: Render<E>> Render<E> for Align<E, T> {
fn min_size (&self, outer_area: E::Size) -> Perhaps<E::Size> { fn min_size (&self, outer_area: E::Size) -> Perhaps<E::Size> {
self.inner().min_size(outer_area) self.inner().min_size(outer_area)
} }

View file

@ -645,7 +645,7 @@ pub fn arranger_content_vertical (
factor: usize factor: usize
) -> impl Render<Tui> + use<'_> { ) -> impl Render<Tui> + use<'_> {
lay!([ lay!([
Tui::at_se(Fill::wh(Tui::pull_x(1, Tui::fg(TuiTheme::title_fg(view.arranger_focused()), Align::se(Fill::wh(Tui::pull_x(1, Tui::fg(TuiTheme::title_fg(view.arranger_focused()),
format!("{}x{}", view.size.w(), view.size.h())) format!("{}x{}", view.size.w(), view.size.h()))
))), ))),
Tui::bg(view.color.rgb, lay!(![ Tui::bg(view.color.rgb, lay!(![

View file

@ -140,7 +140,7 @@ render!(|self: SequencerTui|{
let w = self.size.w(); let w = self.size.w();
let phrase_w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 }; let phrase_w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 };
let pool_w = if self.show_pool { phrase_w } else { 0 }; let pool_w = if self.show_pool { phrase_w } else { 0 };
let pool = Fill::h(Tui::at_e(PhraseListView(&self.phrases))); let pool = Fill::h(Align::e(PhraseListView(&self.phrases)));
let with_pool = move|x|Tui::split_w(false, pool_w, pool, x); let with_pool = move|x|Tui::split_w(false, pool_w, pool, x);
let status = SequencerStatusBar::from(self); let status = SequencerStatusBar::from(self);
let with_status = |x|Tui::split_n(false, if self.status { 2 } else { 0 }, status, x); let with_status = |x|Tui::split_n(false, if self.status { 2 } else { 0 }, status, x);
@ -244,7 +244,7 @@ render!(|self: SequencerStatusBar|Fixed::h(2, lay!([
double(("q", "enqueue"), ("e", "edit"), ), double(("q", "enqueue"), ("e", "edit"), ),
])) ]))
}, },
Fill::wh(Tui::at_se({ Fill::wh(Align::se({
Tui::fg_bg(TuiTheme::orange(), TuiTheme::g(25), row!([ Tui::fg_bg(TuiTheme::orange(), TuiTheme::g(25), row!([
&self.cpu, &self.cpu,
&self.res, &self.res,

View file

@ -229,8 +229,8 @@ render!(|self: PhraseListView<'a>|{
} }
add(&Tui::bg(color.base.rgb, Fill::w(col!([ add(&Tui::bg(color.base.rgb, Fill::w(col!([
Fill::w(lay!(|add|{ Fill::w(lay!(|add|{
add(&Fill::w(Tui::at_w(format!(" {i}"))))?; add(&Fill::w(Align::w(format!(" {i}"))))?;
add(&Fill::w(Tui::at_e(Tui::pull_x(1, length.clone())))) add(&Fill::w(Align::e(Tui::pull_x(1, length.clone()))))
})), })),
Tui::bold(true, { Tui::bold(true, {
let mut row2 = format!(" {name}"); let mut row2 = format!(" {name}");
@ -249,8 +249,8 @@ render!(|self: PhraseListView<'a>|{
}))?; }))?;
}) })
}))))?; }))))?;
add(&Fill::w(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, upper_left.to_string())))))?; add(&Fill::w(Align::nw(Tui::push_x(1, Tui::fg(title_color, upper_left.to_string())))))?;
add(&Fill::w(Tui::at_ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))))?; add(&Fill::w(Align::ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))))?;
add(&self.0.size) add(&self.0.size)
})) }))
}); });