diff --git a/src/device/launcher.rs b/src/device/launcher.rs index 489d85da..a17c59a0 100644 --- a/src/device/launcher.rs +++ b/src/device/launcher.rs @@ -1,38 +1,256 @@ use crate::prelude::*; - pub struct Launcher { - name: String + name: String, + timebase: Arc, + cursor: (usize, usize), + tracks: Vec>, + chains: Vec>, + rows: usize, + show_help: bool, } - impl Launcher { - pub fn new (name: &str) -> Result, Box> { + pub fn new (name: &str, timebase: &Arc) -> Result, Box> { Ok(DynamicDevice::new(render, handle, process, Self { - name: name.into(), + name: name.into(), + timebase: timebase.clone(), + cursor: (0, 0), + rows: 8, + tracks: vec![ + Sequencer::new("Drum", timebase)?, + Sequencer::new("Bass", timebase)?, + Sequencer::new("Pads", timebase)?, + Sequencer::new("Lead", timebase)?, + ], + chains: vec![ + // TODO + ], + show_help: true })) } + fn cols (&self) -> usize { + (self.tracks.len() + 1) as usize + } + fn col (&self) -> usize { + self.cursor.0 as usize + } + fn dec_col (&mut self) { + self.cursor.0 = if self.cursor.0 > 0 { + self.cursor.0 - 1 + } else { + (self.cols() - 1) as usize + } + } + fn inc_col (&mut self) { + self.cursor.0 = if self.cursor.0 >= self.cols() - 1 { + 0 + } else { + self.cursor.0 + 1 + } + } + fn rows (&self) -> usize { + (self.rows + 2) as usize + } + fn row (&self) -> usize { + self.cursor.1 as usize + } + fn dec_row (&mut self) { + self.cursor.1 = if self.cursor.1 > 0 { + self.cursor.1 - 1 + } else { + self.rows() - 1 + } + } + fn inc_row (&mut self) { + self.cursor.1 = if self.cursor.1 >= self.rows() - 1 { + 0 + } else { + self.cursor.1 + 1 + } + } } - +impl DevicePorts for Launcher {} pub fn process (_: &mut Launcher, _: &Client, _: &ProcessScope) -> Control { Control::Continue } - -pub fn render (_: &Launcher, buf: &mut Buffer, area: Rect) -> Usually { - for i in 1..=8 { - buf.set_string(area.x + 2 + (i-1) * 10, area.y, format!("Track#{i} | "), Style::default()) +macro_rules! set { + ($buf:expr, $style:expr, $x: expr, $y: expr, $fmt: literal $(, $val:expr)*) => { + $buf.set_string($x, $y, &format!($fmt $(, $val)*), $style) } - for i in 0..=7 { - for j in 0..=7 { - buf.set_string(area.x + 2 + i * 10, area.y + 2 + j, format!("······· | "), Style::default().dim()) +} +trait Blit { + fn blit (&self, buf: &mut Buffer, x: u16, y: u16, style: Option