From 61af72c2816faebcf98d2307218a70e400eebcdc Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 6 Jul 2024 21:30:19 +0300 Subject: [PATCH] 2-line transport bar on narrow screen --- src/view/chain.rs | 2 +- src/view/transport.rs | 49 +++++++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/view/chain.rs b/src/view/chain.rs index 75058a84..076b6fa9 100644 --- a/src/view/chain.rs +++ b/src/view/chain.rs @@ -26,7 +26,7 @@ impl<'a> Render for ChainView<'a> { ); } lozenge_left(buf, x, y, height, style); - let (area, _plugins) = if let Some(ref chain) = self.track { + let (area, _plugins) = if self.track.is_some() { if self.vertical { self.draw_as_column(buf, area, style)? } else { diff --git a/src/view/transport.rs b/src/view/transport.rs index da7ff61d..95a1e0ee 100644 --- a/src/view/transport.rs +++ b/src/view/transport.rs @@ -13,31 +13,40 @@ pub struct TransportView<'a> { impl<'a> Render for TransportView<'a> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { let Rect { x, y, width, .. } = area; - draw_play_stop(buf, x + 1, y, &self.playing); - draw_rec(buf, x + 12, y, self.record); - draw_dub(buf, x + 19, y, self.overdub); - draw_mon(buf, x + 26, y, self.monitor); - draw_bpm(buf, x + 33, y, self.timebase.bpm() as usize, self.quant); - draw_timer(buf, x + width - 1, y, &self.timebase, self.frame); - Ok(Rect { x, y, width, height: 1 }) + if width > 100 { + draw_play_stop(buf, x + 1, y, &self.playing); + draw_rec(buf, x + 12, y, self.record); + draw_dub(buf, x + 19, y, self.overdub); + draw_mon(buf, x + 26, y, self.monitor); + draw_bpm(buf, x + 33, y, self.timebase.bpm() as usize, self.quant); + draw_timer(buf, x + width - 1, y, + self.timebase.ppq() as usize, + self.timebase.frame_to_pulse(self.frame as f64) as usize, + self.timebase.frame_to_usec(self.frame as f64) as usize, + ); + Ok(Rect { x, y, width, height: 1 }) + } else { + draw_play_stop(buf, x + 1, y, &self.playing); + draw_bpm(buf, x + 12, y, self.timebase.bpm() as usize, self.quant); + draw_timer(buf, x + width - 1, y, + self.timebase.ppq() as usize, + self.timebase.frame_to_pulse(self.frame as f64) as usize, + self.timebase.frame_to_usec(self.frame as f64) as usize, + ); + draw_rec(buf, x + 1, y + 1, self.record); + draw_dub(buf, x + 8, y + 1, self.overdub); + draw_mon(buf, x + 15, y + 1, self.monitor); + Ok(Rect { x, y, width, height: 2 }) + } } } -pub fn draw_timer (buf: &mut Buffer, x: u16, y: u16, timebase: &Arc, frame: usize) { - let ppq = timebase.ppq() as usize; - - let pulse = timebase.pulse_to_frame(frame as f64) as usize; - let (beats, pulses) = (pulse / ppq, pulse % ppq); - let (bars, beats) = (beats / 4, beats % 4); - - let usecs = timebase.frame_to_usec(frame as f64) as usize; +pub fn draw_timer (buf: &mut Buffer, x: u16, y: u16, ppq: usize, pulse: usize, usecs: usize) { + let (beats, pulses) = (pulse / ppq, pulse % ppq); + let (bars, beats) = ((beats / 4) + 1, (beats % 4) + 1); let (seconds, msecs) = (usecs / 1000000, usecs / 1000 % 1000); let (minutes, seconds) = (seconds / 60, seconds % 60); - - let timer = format!("{minutes}:{seconds:02}:{msecs:03} {}.{}.{pulses:02}", - bars as usize + 1, - beats as usize + 1 - ); + let timer = format!("{minutes}:{seconds:02}:{msecs:03} {bars}.{beats}.{pulses:02}"); timer.blit(buf, x - timer.len() as u16, y, Some(Style::default().not_dim())); }