From b01863dfdc59dc7efaa7719d53f9f92ba4dad780 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 8 Jul 2024 21:19:53 +0300 Subject: [PATCH] refactor: view constructors from App --- src/main.rs | 2 +- src/view.rs | 50 ++----------------- src/view/chain.rs | 10 ++++ src/view/sequencer.rs | 112 ++++++++++++++++++++++-------------------- src/view/transport.rs | 16 +++++- 5 files changed, 88 insertions(+), 102 deletions(-) diff --git a/src/main.rs b/src/main.rs index b8f519bd..6ad00e92 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,7 +35,7 @@ pub fn main () -> Usually<()> { // Init view app.track_cursor = 1; app.scene_cursor = 1; - app.note_start = 12; + app.note_start = 2; app.time_zoom = 12; app.quant = 24; diff --git a/src/view.rs b/src/view.rs index 92e1b43f..44fb36f2 100644 --- a/src/view.rs +++ b/src/view.rs @@ -18,7 +18,7 @@ use crate::{render, App, AppSection, core::*}; render!(App |self, buf, area| { let Rect { x, y, width, height } = area; - let transport = self.draw_transport(buf, area)?; + let transport = TransportView::new(self).render(buf, area)?; let y = y + transport.height; let arranger = if self.arranger_mode { self.draw_arranger_horizontal(buf, Rect { @@ -38,7 +38,7 @@ render!(App |self, buf, area| { } let y = y + arranger.height; if self.track_cursor > 0 { - let chain = self.draw_chain(buf, Rect { + let chain = ChainView::new(&self, false).render(buf, Rect { x, y: y + height - height / 3 - 1, width, height: height / 3 })?; if self.section == AppSection::Chain { @@ -48,7 +48,7 @@ render!(App |self, buf, area| { Style::default().green().dim() }).draw(buf, Rect { width, ..chain }) } - let phrase = self.draw_phrase(buf, Rect { + let phrase = SequencerView::new(&self).render(buf, Rect { x, y, width, height: height - height / 3 })?; if self.section == AppSection::Sequencer { @@ -88,17 +88,6 @@ impl App { } Ok(area) } - fn draw_transport (&self, buf: &mut Buffer, area: Rect) -> Usually { - TransportView { - timebase: &self.timebase, - playing: *self.playing.as_ref().unwrap_or(&TransportState::Stopped), - monitor: self.track().map(|t|t.1.monitoring).unwrap_or(false), - record: self.track().map(|t|t.1.recording).unwrap_or(false), - overdub: self.track().map(|t|t.1.overdub).unwrap_or(false), - frame: self.playhead, - quant: self.quant, - }.render(buf, area) - } fn draw_arranger_horizontal (&self, buf: &mut Buffer, area: Rect) -> Usually { ArrangerViewHorizontal { buf, @@ -121,37 +110,4 @@ impl App { cursor: &(self.track_cursor, self.scene_cursor), }.draw() } - fn draw_chain (&self, buf: &mut Buffer, area: Rect) -> Usually { - ChainView { - focused: self.section == AppSection::Chain, - track: self.tracks.get(self.track_cursor - 1), - vertical: false, - }.render(buf, area) - } - fn draw_phrase (&self, buf: &mut Buffer, area: Rect) -> Usually { - let track = self.tracks.get(self.track_cursor - 1); - let phrase = self.phrase(); - let seq_area = SequencerView { - phrase, - focused: self.section == AppSection::Sequencer, - ppq: self.timebase.ppq() as usize, - now: self.timebase.frame_to_pulse(self.playhead as f64) as usize, - time_cursor: self.time_cursor, - time_start: self.time_start, - time_zoom: self.time_zoom, - note_cursor: self.note_cursor, - note_start: self.note_start, - notes_in: if let Some(track) = track { &track.notes_in } else { &[false;128] }, - notes_out: if let Some(track) = track { &track.notes_out } else { &[false;128] }, - }.render(buf, area)?; - if let Some(track) = track { - if phrase.is_none() && self.section == AppSection::Sequencer { - let label = format!("[ENTER] Create new clip: {}", track.name); - let x = area.x + seq_area.width / 2 - (label.len() / 2) as u16; - let y = area.y + seq_area.height / 2; - label.blit(buf, x, y, Some(Style::default().white())); - } - } - Ok(seq_area) - } } diff --git a/src/view/chain.rs b/src/view/chain.rs index 8f49096c..f3504223 100644 --- a/src/view/chain.rs +++ b/src/view/chain.rs @@ -8,6 +8,16 @@ pub struct ChainView<'a> { pub vertical: bool, } +impl<'a> ChainView<'a> { + pub fn new (app: &'a App, vertical: bool) -> Self { + Self { + focused: app.section == AppSection::Chain, + track: app.tracks.get(app.track_cursor - 1), + vertical + } + } +} + impl<'a> Render for ChainView<'a> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { let style = Some(if self.focused { diff --git a/src/view/sequencer.rs b/src/view/sequencer.rs index 7166e29e..3511e384 100644 --- a/src/view/sequencer.rs +++ b/src/view/sequencer.rs @@ -28,44 +28,75 @@ pub struct SequencerView<'a> { pub notes_out: &'a [bool; 128], } +impl<'a> SequencerView<'a> { + pub fn new (app: &'a App) -> Self { + let track = app.tracks.get(app.track_cursor - 1); + let phrase = app.phrase(); + Self { + phrase, + focused: app.section == AppSection::Sequencer, + ppq: app.timebase.ppq() as usize, + now: app.timebase.frame_to_pulse(app.playhead as f64) as usize, + time_cursor: app.time_cursor, + time_start: app.time_start, + time_zoom: app.time_zoom, + note_cursor: app.note_cursor, + note_start: app.note_start, + notes_in: if let Some(track) = track { &track.notes_in } else { &[false;128] }, + notes_out: if let Some(track) = track { &track.notes_out } else { &[false;128] }, + } + } +} + impl<'a> Render for SequencerView<'a> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { let bg = if self.focused { Color::Rgb(20, 45, 5) } else { Color::Reset }; fill_bg(buf, area, bg); - self.draw_horizontal(buf, area)?; + self.horizontal_draw(buf, area)?; Ok(area) } } impl<'a> SequencerView<'a> { - fn draw_horizontal (&self, buf: &mut Buffer, area: Rect) -> Usually<()> { - let style = Some(if self.focused { + fn style_focus (&self) -> Option