From 1891cdabfd3bc789efe29f1b9e02c732cfd37aed Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 18 Oct 2024 19:44:57 +0300 Subject: [PATCH] crop track name --- crates/tek_sequencer/src/arranger_tui.rs | 76 ++++++++++++++---------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index c18e7b84..55e43162 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -23,7 +23,7 @@ impl Content for Arrangement { fn content (&self) -> impl Widget { Layers::new(move |add|{ match self.mode { - ArrangementViewMode::Horizontal => add(&HorizontalArranger(&self)), + ArrangementViewMode::Horizontal => add(&HorizontalArranger(&self)), ArrangementViewMode::Vertical(factor) => add(&VerticalArranger(&self, factor)) }?; let color = if self.focused{Color::Rgb(150, 160, 90)}else{Color::Rgb(120, 130, 100)}; @@ -45,33 +45,42 @@ impl<'a> Content for VerticalArranger<'a, Tui> { fn content (&self) -> impl Widget { let Self(state, factor) = self; let (cols, rows) = if *factor == 0 {( - state.track_widths(), - Scene::ppqs(state.tracks.as_slice(), state.scenes.as_slice()), + state.track_widths(), Scene::ppqs(state.tracks.as_slice(), state.scenes.as_slice()), )} else {( state.track_widths(), (0..=state.scenes.len()).map(|i|(factor*PPQ, factor*PPQ*i)).collect::>(), )}; - //let height = rows.last().map(|(w,y)|(y+w)/PPQ).unwrap_or(16); let tracks: &[ArrangementTrack] = state.tracks.as_ref(); let scenes: &[Scene] = state.scenes.as_ref(); - let offset = 3 + Scene::longest_name(scenes) as u16; - let border_fg = if self.0.focused{Color::Rgb(100, 110, 40)}else{Color::Rgb( 70, 80, 50)}; + let offset = 3 + Scene::longest_name(scenes) as u16; // x of 1st track + let bg = Color::Rgb(28, 35, 25); + let clip_bg = Color::Rgb(40, 50, 30); let border_bg = Color::Rgb(40, 50, 30); - let border = Lozenge(Style::default().bg(border_bg).fg(border_fg)); + let border_hi = Color::Rgb(100, 110, 40); + let border_lo = Color::Rgb(70, 80, 50); + let border_fg = if self.0.focused { border_hi } else { border_lo }; + let border = Lozenge(Style::default().bg(border_bg).fg(border_fg)); Layers::new(move |add|{ let rows: &[(usize, usize)] = rows.as_ref(); let cols: &[(usize, usize)] = cols.as_ref(); - // grid + // column separators add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{ let area = to.area(); let style = Some(Style::default().fg(COLOR_SEPARATOR)); - for (_, x) in cols.iter() { - let x = offset + area.x() + *x as u16 - 1; + for x in cols.iter().map(|col|col.1) { + let x = offset + area.x() + x as u16 - 1; for y in area.y()..area.y2() { to.blit(&"▎", x, y, style); } } - for (_, y) in rows.iter() { - let y = area.y() + (*y / PPQ) as u16 + 1; + Ok(()) + }))?; + + // row separators + add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{ + let area = to.area(); + let style = Some(Style::default().fg(COLOR_SEPARATOR)); + for y in rows.iter().map(|row|row.1) { + let y = area.y() + (y / PPQ) as u16 + 1; if y >= to.buffer.area.height { break } for x in area.x()..area.x2().saturating_sub(2) { if x < to.buffer.area.x && y < to.buffer.area.y { @@ -141,11 +150,13 @@ impl<'a> Content for VerticalArranger<'a, Tui> { Ok(()) }))?; - let track_titles = row!((track, (w, _)) in tracks.iter().zip(cols) => - (&format!("▎{}", &track.name.read().unwrap()).as_str() as &dyn Widget) - .min_xy(*w as u16, 2) + let track_titles = row!((track, w) in tracks.iter().zip(cols.iter().map(|col|col.0))=>{ + let name = track.name.read().unwrap(); + (&format!("▎{}", &name).as_str())[0..(w+1).min(name.len()+3)] + .min_xy(w as u16, 2) .bg(track.color) - .push_x(offset - 1)); + .push_x(offset - 1) + }); let scene_name = |scene, playing: bool, height|row!( if playing { "▶ " } else { " " }, @@ -153,7 +164,7 @@ impl<'a> Content for VerticalArranger<'a, Tui> { ).fixed_xy(offset.saturating_sub(1), height); let scene_clip = |scene, track: usize, w: u16, h: u16|Layers::new(move |add|{ - let mut color = Color::Rgb(40, 50, 30); + let mut color = clip_bg; match (tracks.get(track), (scene as &Scene).clips.get(track)) { (Some(_), Some(Some(phrase))) => { let name = &(phrase as &Arc>).read().unwrap().name; @@ -166,20 +177,23 @@ impl<'a> Content for VerticalArranger<'a, Tui> { add(&Background(color)) }).fixed_xy(w, h); - let tracks_clips = col!((scene, (pulses, _)) in scenes.iter().zip(rows) => { - let height = 1.max((pulses / PPQ) as u16); - let playing = scene.is_playing(tracks); - Stack::right(move |add| { - add(&scene_name(scene, playing, height).bg(scene.color))?; - for (track, (w, _)) in cols.iter().enumerate() { - add(&scene_clip(scene, track, *w as u16, height))?; - } - Ok(()) - }).fixed_y(height) - }); - - add(&col!(track_titles, tracks_clips)) - }).bg(Color::Rgb(28, 35, 25)).border(border) + add(&col!(track_titles, col!( + // scenes: + (scene, pulses) in scenes.iter().zip(rows.iter().map(|row|row.0)) => { + let height = 1.max((pulses / PPQ) as u16); + let playing = scene.is_playing(tracks); + Stack::right(move |add| { + // scene title: + add(&scene_name(scene, playing, height).bg(scene.color))?; + // clip per track: + for (track, w) in cols.iter().map(|col|col.0).enumerate() { + add(&scene_clip(scene, track, w as u16, height))?; + } + Ok(()) + }).fixed_y(height) + } + ))) + }).bg(bg).border(border) } } impl<'a> Content for HorizontalArranger<'a, Tui> {