use crate::prelude::*; pub struct Launcher { name: String, timebase: Arc, cursor: (usize, usize), tracks: Vec>, chains: Vec>, rows: usize, show_help: bool, } impl Launcher { pub fn new (name: &str, timebase: &Arc) -> Result, Box> { Ok(DynamicDevice::new(render, handle, process, Self { 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 } macro_rules! set { ($buf:expr, $style:expr, $x: expr, $y: expr, $fmt: literal $(, $val:expr)*) => { $buf.set_string($x, $y, &format!($fmt $(, $val)*), $style) } } trait Blit { fn blit (&self, buf: &mut Buffer, x: u16, y: u16, style: Option