mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
add iteration versions of row and col macros
This commit is contained in:
parent
ad39376659
commit
fd2e8f83f6
3 changed files with 57 additions and 50 deletions
|
|
@ -833,10 +833,22 @@ where
|
||||||
($($expr:expr),* $(,)?) => { Layers::new(move|add|{ $(add(&$expr)?;)* Ok(()) }) }
|
($($expr:expr),* $(,)?) => { Layers::new(move|add|{ $(add(&$expr)?;)* Ok(()) }) }
|
||||||
}
|
}
|
||||||
#[macro_export] macro_rules! col {
|
#[macro_export] macro_rules! col {
|
||||||
($($expr:expr),* $(,)?) => { Stack::down(move|add|{ $(add(&$expr)?;)* Ok(()) }) }
|
($($expr:expr),* $(,)?) => { Stack::down(move|add|{ $(add(&$expr)?;)* Ok(()) }) };
|
||||||
|
($pat:pat in $collection:expr => $item:expr) => {
|
||||||
|
Stack::down(move |add|{
|
||||||
|
for $pat in $collection { add(&$item)?; }
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[macro_export] macro_rules! row {
|
#[macro_export] macro_rules! row {
|
||||||
($($expr:expr),* $(,)?) => { Stack::right(move|add|{ $(add(&$expr)?;)* Ok(()) }) }
|
($($expr:expr),* $(,)?) => { Stack::right(move|add|{ $(add(&$expr)?;)* Ok(()) }) };
|
||||||
|
($pat:pat in $collection:expr => $item:expr) => {
|
||||||
|
Stack::right(move |add|{
|
||||||
|
for $pat in $collection { add(&$item)?; }
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A binary split with fixed proportion
|
/// A binary split with fixed proportion
|
||||||
|
|
|
||||||
|
|
@ -466,8 +466,9 @@ impl<S: BorderStyle, W: Widget<Engine = Tui>> Content for Bordered<S, W> {
|
||||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||||
let style = self.0;
|
let style = self.0;
|
||||||
Layers::new(move|add|{
|
Layers::new(move|add|{
|
||||||
|
add(&Inset::XY(1, 1, &self.1 as &dyn Widget<Engine = Tui>))?;
|
||||||
add(&Border(style))?;
|
add(&Border(style))?;
|
||||||
add(&Inset::XY(1, 1, &self.1 as &dyn Widget<Engine = Tui>))
|
Ok(())
|
||||||
}).fill_xy()
|
}).fill_xy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -491,54 +491,50 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
||||||
let cols = cols.as_ref();
|
let cols = cols.as_ref();
|
||||||
add(&VerticalArrangerGrid(offset, &rows, &cols))?;
|
add(&VerticalArrangerGrid(offset, &rows, &cols))?;
|
||||||
add(&VerticalArrangerCursor(state.focused, state.selected, offset, &cols, &rows))?;
|
add(&VerticalArrangerCursor(state.focused, state.selected, offset, &cols, &rows))?;
|
||||||
add(&Stack::down(|add|{
|
let track_titles = row!((track, (w, _)) in tracks.iter().zip(cols) => {
|
||||||
add(&Stack::right(move |add|{
|
(&track.name.read().unwrap().as_str() as &dyn Widget<Engine = Tui>)
|
||||||
for (track, (w, _)) in tracks.iter().zip(cols) {
|
.bg(COLOR_BG1).min_xy(*w as u16, 2)
|
||||||
add(&Layers::new(|add|{
|
}.push_x(offset));
|
||||||
add(&Background(COLOR_BG1))?;
|
let track_clips = col!((scene, (pulses, _)) in scenes.iter().zip(rows) => {
|
||||||
add(&track.name.read().unwrap().as_str())
|
let height = 1.max((pulses / 96) as u16);
|
||||||
}).min_xy(*w as u16, 2))?;
|
let playing = scene.is_playing(tracks);
|
||||||
}
|
Stack::right(move |add| {
|
||||||
Ok(())
|
add(&Stack::right(|add|{
|
||||||
}).push_x(offset))?;
|
add(&if playing { "▶ " } else { " " })?;
|
||||||
add(&Stack::down(move |add| {
|
add(&scene.name.read().unwrap().as_str())
|
||||||
for (scene, (pulses, _)) in scenes.iter().zip(rows) {
|
}).fixed_xy(offset.saturating_sub(1), height))?;
|
||||||
let height = 1.max((pulses / 96) as u16);
|
for (track, (w, _x)) in cols.iter().enumerate() {
|
||||||
let playing = scene.is_playing(tracks);
|
add(&Layers::new(move |add|{
|
||||||
add(&Stack::right(move |add| {
|
let mut color = COLOR_BG0;
|
||||||
add(&Stack::right(|add|{
|
if let (Some(track), Some(Some(clip))) = (
|
||||||
add(&if playing { "▶ " } else { " " })?;
|
tracks.get(track),
|
||||||
add(&scene.name.read().unwrap().as_str())
|
scene.clips.get(track),
|
||||||
}).fixed_xy(offset.saturating_sub(1), height))?;
|
) {
|
||||||
for (track, (w, _x)) in cols.iter().enumerate() {
|
if let Some(phrase) = track.phrases.get(*clip) {
|
||||||
add(&Layers::new(move |add|{
|
add(&format!(
|
||||||
let mut color = COLOR_BG0;
|
"{clip:02} {}",
|
||||||
if let (Some(track), Some(Some(clip))) = (
|
phrase.read().unwrap().name.read().unwrap()
|
||||||
tracks.get(track),
|
).as_str().push_x(1))?;
|
||||||
scene.clips.get(track),
|
color = if track.sequence == Some(*clip) {
|
||||||
) {
|
COLOR_PLAYING
|
||||||
if let Some(phrase) = track.phrases.get(*clip) {
|
} else {
|
||||||
add(&format!(
|
COLOR_BG1
|
||||||
"{clip:02} {}",
|
};
|
||||||
phrase.read().unwrap().name.read().unwrap()
|
}
|
||||||
).as_str().push_x(1))?;
|
|
||||||
color = if track.sequence == Some(*clip) {
|
|
||||||
COLOR_PLAYING
|
|
||||||
} else {
|
|
||||||
COLOR_BG1
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
add(&Background(color))
|
|
||||||
}).fixed_xy(*w as u16, height))?;
|
|
||||||
}
|
}
|
||||||
Ok(())
|
add(&Background(color))
|
||||||
}).fixed_y(height))?;
|
}).fixed_xy(*w as u16, height))?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}))
|
}).fixed_y(height)
|
||||||
}))
|
});
|
||||||
|
add(&col!(track_titles, track_clips))?;
|
||||||
|
Ok(())
|
||||||
})
|
})
|
||||||
|
.bg(Color::Rgb(35,40,25))
|
||||||
|
.border(Lozenge(Style::default()
|
||||||
|
.bg(Color::Rgb(40,50,30))
|
||||||
|
.fg(Color::Rgb(70,80,50))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1428,9 +1424,7 @@ impl Content for Sequencer<Tui> {
|
||||||
}),
|
}),
|
||||||
|
|
||||||
);
|
);
|
||||||
row!(toolbar, content)
|
row!(toolbar, content).fill_x()
|
||||||
.fill_x()
|
|
||||||
//.inset_x(1)
|
|
||||||
.bg(Color::Rgb(40,50,30))
|
.bg(Color::Rgb(40,50,30))
|
||||||
.border(Lozenge(Style::default()
|
.border(Lozenge(Style::default()
|
||||||
.bg(Color::Rgb(40,50,30))
|
.bg(Color::Rgb(40,50,30))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue