From fd2e8f83f603beae0a85952d11c0645548195ac6 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 30 Sep 2024 00:15:39 +0300 Subject: [PATCH] add iteration versions of row and col macros --- crates/tek_core/src/space.rs | 16 ++++- crates/tek_core/src/tui.rs | 3 +- crates/tek_sequencer/src/sequencer.rs | 88 +++++++++++++-------------- 3 files changed, 57 insertions(+), 50 deletions(-) diff --git a/crates/tek_core/src/space.rs b/crates/tek_core/src/space.rs index bce8d9bf..5163bca3 100644 --- a/crates/tek_core/src/space.rs +++ b/crates/tek_core/src/space.rs @@ -833,10 +833,22 @@ where ($($expr:expr),* $(,)?) => { Layers::new(move|add|{ $(add(&$expr)?;)* Ok(()) }) } } #[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 { - ($($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 diff --git a/crates/tek_core/src/tui.rs b/crates/tek_core/src/tui.rs index a0030f61..2690aad4 100644 --- a/crates/tek_core/src/tui.rs +++ b/crates/tek_core/src/tui.rs @@ -466,8 +466,9 @@ impl> Content for Bordered { fn content (&self) -> impl Widget { let style = self.0; Layers::new(move|add|{ + add(&Inset::XY(1, 1, &self.1 as &dyn Widget))?; add(&Border(style))?; - add(&Inset::XY(1, 1, &self.1 as &dyn Widget)) + Ok(()) }).fill_xy() } } diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index cfdbf2e4..63bf6af0 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -491,54 +491,50 @@ impl<'a> Content for VerticalArranger<'a, Tui> { let cols = cols.as_ref(); add(&VerticalArrangerGrid(offset, &rows, &cols))?; add(&VerticalArrangerCursor(state.focused, state.selected, offset, &cols, &rows))?; - add(&Stack::down(|add|{ - add(&Stack::right(move |add|{ - for (track, (w, _)) in tracks.iter().zip(cols) { - add(&Layers::new(|add|{ - add(&Background(COLOR_BG1))?; - add(&track.name.read().unwrap().as_str()) - }).min_xy(*w as u16, 2))?; - } - Ok(()) - }).push_x(offset))?; - add(&Stack::down(move |add| { - for (scene, (pulses, _)) in scenes.iter().zip(rows) { - let height = 1.max((pulses / 96) as u16); - let playing = scene.is_playing(tracks); - add(&Stack::right(move |add| { - add(&Stack::right(|add|{ - add(&if playing { "▶ " } else { " " })?; - add(&scene.name.read().unwrap().as_str()) - }).fixed_xy(offset.saturating_sub(1), height))?; - for (track, (w, _x)) in cols.iter().enumerate() { - add(&Layers::new(move |add|{ - let mut color = COLOR_BG0; - if let (Some(track), Some(Some(clip))) = ( - tracks.get(track), - scene.clips.get(track), - ) { - if let Some(phrase) = track.phrases.get(*clip) { - add(&format!( - "{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))?; + let track_titles = row!((track, (w, _)) in tracks.iter().zip(cols) => { + (&track.name.read().unwrap().as_str() as &dyn Widget) + .bg(COLOR_BG1).min_xy(*w as u16, 2) + }.push_x(offset)); + let track_clips = col!((scene, (pulses, _)) in scenes.iter().zip(rows) => { + let height = 1.max((pulses / 96) as u16); + let playing = scene.is_playing(tracks); + Stack::right(move |add| { + add(&Stack::right(|add|{ + add(&if playing { "▶ " } else { " " })?; + add(&scene.name.read().unwrap().as_str()) + }).fixed_xy(offset.saturating_sub(1), height))?; + for (track, (w, _x)) in cols.iter().enumerate() { + add(&Layers::new(move |add|{ + let mut color = COLOR_BG0; + if let (Some(track), Some(Some(clip))) = ( + tracks.get(track), + scene.clips.get(track), + ) { + if let Some(phrase) = track.phrases.get(*clip) { + add(&format!( + "{clip:02} {}", + phrase.read().unwrap().name.read().unwrap() + ).as_str().push_x(1))?; + color = if track.sequence == Some(*clip) { + COLOR_PLAYING + } else { + COLOR_BG1 + }; + } } - Ok(()) - }).fixed_y(height))?; + add(&Background(color)) + }).fixed_xy(*w as u16, height))?; } 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 { }), ); - row!(toolbar, content) - .fill_x() - //.inset_x(1) + row!(toolbar, content).fill_x() .bg(Color::Rgb(40,50,30)) .border(Lozenge(Style::default() .bg(Color::Rgb(40,50,30))