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::*;
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
pub enum Align<L> {
pub enum Align<E: Engine, T: Render<E>> {
_Unused(PhantomData<E>),
/// Draw at center of container
Center(L),
Center(T),
/// Draw at center of X axis
X(L),
X(T),
/// Draw at center of Y axis
Y(L),
Y(T),
/// Draw at upper left corner of contaier
NW(L),
NW(T),
/// Draw at center of upper edge of container
N(L),
N(T),
/// Draw at right left corner of contaier
NE(L),
NE(T),
/// Draw at center of left edge of container
W(L),
W(T),
/// Draw at center of right edge of container
E(L),
E(T),
/// Draw at lower left corner of container
SW(L),
SW(T),
/// Draw at center of lower edge of container
S(L),
S(T),
/// 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 {
match self {
Self::Center(inner) => inner,
@ -56,11 +41,23 @@ impl<T> Align<T> {
Self::SW(inner) => inner,
Self::S(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() {
None
} 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::S(_) => [ox + (ow - iw) / 2.into(), 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> {
self.inner().min_size(outer_area)
}

View file

@ -645,7 +645,7 @@ pub fn arranger_content_vertical (
factor: usize
) -> impl Render<Tui> + use<'_> {
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()))
))),
Tui::bg(view.color.rgb, lay!(![

View file

@ -140,7 +140,7 @@ render!(|self: SequencerTui|{
let w = self.size.w();
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 = 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 status = SequencerStatusBar::from(self);
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"), ),
]))
},
Fill::wh(Tui::at_se({
Fill::wh(Align::se({
Tui::fg_bg(TuiTheme::orange(), TuiTheme::g(25), row!([
&self.cpu,
&self.res,

View file

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