diff --git a/cli/tek.rs b/cli/tek.rs index 3458e4b8..2dd01a0d 100644 --- a/cli/tek.rs +++ b/cli/tek.rs @@ -48,11 +48,11 @@ pub enum TekMode { /// Multi-track MIDI sequencer. Arranger { /// Number of scenes - #[arg(short = 'y', long, default_value_t = 12)] scenes: usize, + #[arg(short = 'y', long, default_value_t = 1)] scenes: usize, /// Number of tracks - #[arg(short = 'x', long, default_value_t = 8)] tracks: usize, + #[arg(short = 'x', long, default_value_t = 1)] tracks: usize, /// Width of tracks - #[arg(short = 'w', long, default_value_t = 8)] track_width: usize, + #[arg(short = 'w', long, default_value_t = 8)] track_width: usize, }, /// TODO: A MIDI-controlled audio mixer Mixer, diff --git a/tek/src/arranger.rs b/tek/src/arranger.rs index d3ea33db..ecb8bafe 100644 --- a/tek/src/arranger.rs +++ b/tek/src/arranger.rs @@ -110,15 +110,14 @@ impl Arranger { pub(crate) const HEADER_H: u16 = 0; // 5 pub(crate) const SCENES_W_OFFSET: u16 = 0; render!(TuiOut: (self: Arranger) => { - let scenes_w = 16; + let scenes_w = self.sidebar_w(); let tracks_w = self.tracks_with_widths().last().unwrap().3 as u16; - let row = move|h, header, cells|Fixed::y(h, Bsp::e( - Fixed::x(scenes_w, header), - Fill::x(Align::c(Fixed::xy(tracks_w, h, cells))) - )); - let big = move|h, header, cells|Fixed::y(h, Bsp::e( - Fill::y(Align::c(Fixed::x(scenes_w, header))), - Fill::x(Align::c(Fixed::xy(tracks_w, h, cells))) + let row_head = |h, head|Fixed::x(scenes_w, head); + let row_cells = |h, cells|Fill::x(Align::c(Fixed::xy(tracks_w, h, cells))); + let row = move|h, head, cells|Fixed::y(h, Bsp::e(row_head(h, head), row_cells(h, cells))); + let big = move|h, head, cells|Fill::y(Bsp::e( + Tui::bg(Color::Reset, row_head(h, head)), + Tui::bg(Color::Reset, row_cells(h, cells)) )); //let row = move|h, header, cells|Align::w(Bsp::e( //Align::w(Fixed::xy(scenes_w, h, header)), @@ -132,9 +131,9 @@ render!(TuiOut: (self: Arranger) => { let playing = |x|Bsp::s(row(2, self.elapsed_row_header(), self.elapsed_row_cells()), Fill::y(x)); let next = |x|Bsp::s(row(2, self.next_row_header(), self.next_row_cells()), Fill::y(x)); let tracks = |x|Bsp::s(row(3, self.track_row_header(), self.track_row_cells()), Fill::y(Align::c(x))); - let scenes = |x|Bsp::s(big(h.saturating_sub(13), self.scene_row_headers(), Tui::bg(Color::Green, self.scene_row_cells())), x); + let scenes = |x|Bsp::s(big(h.saturating_sub(13), self.scene_row_headers(), self.scene_row_cells()), x); let inputs = |x|Bsp::n(row(2, self.input_row_header(), self.input_row_cells()), Fill::y(x)); - self.size.of(toolbar(pool(Fill::xy(Align::c(editing(inputs(outputs(playing(next(tracks(scenes(Fill::xy(""))))))))))))) + self.size.of(toolbar(Fill::xy(Align::c(editing(pool(inputs(outputs(playing(next(tracks(scenes(Fill::xy(""))))))))))))) //let enclosed = |x|Outer(Style::default().fg(Color::Rgb(72,72,72))).enclose(x); //.max(SCENES_W_OFFSET + ArrangerScene::longest_name(&self.scenes) as u16); //Bsp::s(arrrrrr, enclosed(&self.editor)) @@ -173,7 +172,7 @@ impl Arranger { { let mut x = 0; tracks.iter().enumerate().map(move |(index, track)|{ - let width = if Some(index) == active { 40 } else { track.width }; + let width = if Some(index) == active { 40 } else { track.width.max(8) }; let data = (index, track, x, x + width); x += width; data @@ -265,7 +264,7 @@ impl Arranger { ArrangerSelection::Scene(s) => Some(s), _ => None }; - Tui::bg(Color::Reset, Fill::y(Map::new( + Fill::y(Align::y(Map::new( ||self.scenes_with_heights(2), move|(_, scene, y1, y2), i| { let h = (y2 - y1) as u16; @@ -301,7 +300,7 @@ impl Arranger { }; let tracks = move||self.tracks_with_widths(); let scenes = ||self.scenes_with_heights(2); - (move||Align::x(Map::new(tracks, move|(_, track, x1, x2), t| { + (move||Fill::y(Align::c(Map::new(tracks, move|(_, track, x1, x2), t| { let w = (x2 - x1) as u16; let color: ItemPalette = track.color().dark.into(); let last_color = Arc::new(RwLock::new(ItemPalette::from(Color::Rgb(0, 0, 0)))); @@ -346,9 +345,9 @@ impl Arranger { map_east( x1 as u16, w, - Fixed::x(w, Tui::bg(Color::Reset, Fill::y(cells)).boxed()) + Fixed::x(w, Tui::bg(Color::Reset, Align::y(cells)).boxed()) ) - })).boxed()).into() + }))).boxed()).into() } fn track_column_separators <'a> (&'a self) -> impl Content + 'a { @@ -442,12 +441,15 @@ impl Arranger { fn toolbar_view (&self) -> impl Content + use<'_> { Fill::x(Fixed::y(2, Align::x(TransportView::new(true, &self.clock)))) } - fn pool_view (&self) -> impl Content + use<'_> { + fn sidebar_w (&self) -> u16 { let w = self.size.w(); - let clip_w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 }; - let pool_w = if self.pool.visible { clip_w } else { 0 }; + let w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 }; + let w = if self.pool.visible { w } else { 0 }; + w + } + fn pool_view (&self) -> impl Content + use<'_> { let pool = Pull::y(1, Fill::y(Align::e(PoolView(self.pool.visible, &self.pool)))); - Fixed::x(pool_w, Align::e(Fill::y(PoolView(self.compact, &self.pool)))) + Fixed::x(self.sidebar_w(), Align::e(Fill::y(PoolView(self.compact, &self.pool)))) } pub fn track_widths (tracks: &[ArrangerTrack]) -> Vec<(usize, usize)> { @@ -579,13 +581,13 @@ fn phat_sel_3 > ( ) -> impl Content { let border = Style::default().fg(Color::Rgb(255,255,255)).bg(middle); Either(selected, - Tui::bg(middle, Outer(border).enclose( Align::w(Bsp::s("", Bsp::s(field_1, ""))))), - Bsp::s( - Fixed::y(1, top.map(|top|phat_lo(middle, top))), - Bsp::n(phat_hi(middle, bottom), - Fixed::y(1, Fill::x(Tui::bg(middle, field_2))), + Tui::bg(middle, Outer(border).enclose(Align::w(Bsp::s("", Bsp::n("", Fill::y(field_1)))))), + Bsp::s(Fixed::y(1, top.map(|top|phat_lo(middle, top))), + Bsp::n(Fixed::y(1, phat_hi(middle, bottom)), + Fill::xy(Tui::bg(middle, field_2)), ) - )) + ) + ) } //pub struct ArrangerVCursor {