diff --git a/crates/tek_core/src/exit.rs b/crates/tek_core/src/exit.rs index 7f0690de..ee9eaa5b 100644 --- a/crates/tek_core/src/exit.rs +++ b/crates/tek_core/src/exit.rs @@ -28,3 +28,5 @@ pub trait ExitableComponent: Exit + Component where E: Engine { Box::new(self) } } + +impl + Exit> ExitableComponent for C {} diff --git a/crates/tek_core/src/keymap.rs b/crates/tek_core/src/keymap.rs index c6b5e61d..816bb145 100644 --- a/crates/tek_core/src/keymap.rs +++ b/crates/tek_core/src/keymap.rs @@ -41,28 +41,28 @@ pub fn handle_keymap ( #[macro_export] macro_rules! key { ($code:pat) => { - crossterm::event::Event::Key(crossterm::event::KeyEvent { + TuiEvent::Input(crossterm::event::Event::Key(crossterm::event::KeyEvent { code: $code, modifiers: crossterm::event::KeyModifiers::NONE, kind: crossterm::event::KeyEventKind::Press, state: crossterm::event::KeyEventState::NONE - }) + })) }; (Ctrl-$code:pat) => { - crossterm::event::Event::Key(crossterm::event::KeyEvent { + TuiEvent::Input(crossterm::event::Event::Key(crossterm::event::KeyEvent { code: $code, modifiers: crossterm::event::KeyModifiers::CONTROL, kind: crossterm::event::KeyEventKind::Press, state: crossterm::event::KeyEventState::NONE - }) + })) }; (Alt-$code:pat) => { - crossterm::event::Event::Key(crossterm::event::KeyEvent { + TuiEvent::Input(crossterm::event::Event::Key(crossterm::event::KeyEvent { code: $code, modifiers: crossterm::event::KeyModifiers::ALT, kind: crossterm::event::KeyEventKind::Press, state: crossterm::event::KeyEventState::NONE - }) + })) } } diff --git a/crates/tek_mixer/src/plugin_lv2.rs b/crates/tek_mixer/src/plugin_lv2.rs index ba645e5f..e918c8b9 100644 --- a/crates/tek_mixer/src/plugin_lv2.rs +++ b/crates/tek_mixer/src/plugin_lv2.rs @@ -22,7 +22,7 @@ pub struct LV2Plugin { } impl LV2Plugin { - pub fn from_edn <'e, E: Engine> (args: &[Edn<'e>]) -> Usually> { + pub fn from_edn <'e> (args: &[Edn<'e>]) -> Usually> { let mut name = String::new(); let mut path = String::new(); edn!(edn in args { diff --git a/crates/tek_mixer/src/track_handle.rs b/crates/tek_mixer/src/track_handle.rs index fcff5429..062e7458 100644 --- a/crates/tek_mixer/src/track_handle.rs +++ b/crates/tek_mixer/src/track_handle.rs @@ -3,37 +3,34 @@ use crate::*; impl Handle for Track { fn handle (&mut self, from: &Tui) -> Perhaps { match from.event() { - TuiEvent::Input(key) => match key { - //, NONE, "chain_cursor_up", "move cursor up", || { - key!(KeyCode::Up) => { - Ok(Some(true)) - }, - // , NONE, "chain_cursor_down", "move cursor down", || { - key!(KeyCode::Down) => { - Ok(Some(true)) - }, - // Left, NONE, "chain_cursor_left", "move cursor left", || { - key!(KeyCode::Left) => { - //if let Some(track) = app.arranger.track_mut() { - //track.device = track.device.saturating_sub(1); - //return Ok(true) - //} - Ok(Some(true)) - }, - // , NONE, "chain_cursor_right", "move cursor right", || { - key!(KeyCode::Right) => { - //if let Some(track) = app.arranger.track_mut() { - //track.device = (track.device + 1).min(track.devices.len().saturating_sub(1)); - //return Ok(true) - //} - Ok(Some(true)) - }, - // , NONE, "chain_mode_switch", "switch the display mode", || { - key!(KeyCode::Char('`')) => { - //app.chain_mode = !app.chain_mode; - Ok(Some(true)) - }, - _ => Ok(None) + //, NONE, "chain_cursor_up", "move cursor up", || { + key!(KeyCode::Up) => { + Ok(Some(true)) + }, + // , NONE, "chain_cursor_down", "move cursor down", || { + key!(KeyCode::Down) => { + Ok(Some(true)) + }, + // Left, NONE, "chain_cursor_left", "move cursor left", || { + key!(KeyCode::Left) => { + //if let Some(track) = app.arranger.track_mut() { + //track.device = track.device.saturating_sub(1); + //return Ok(true) + //} + Ok(Some(true)) + }, + // , NONE, "chain_cursor_right", "move cursor right", || { + key!(KeyCode::Right) => { + //if let Some(track) = app.arranger.track_mut() { + //track.device = (track.device + 1).min(track.devices.len().saturating_sub(1)); + //return Ok(true) + //} + Ok(Some(true)) + }, + // , NONE, "chain_mode_switch", "switch the display mode", || { + key!(KeyCode::Char('`')) => { + //app.chain_mode = !app.chain_mode; + Ok(Some(true)) }, _ => Ok(None) } diff --git a/crates/tek_sequencer/src/arranger_handle.rs b/crates/tek_sequencer/src/arranger_handle.rs index 05deadcd..1dbbdc72 100644 --- a/crates/tek_sequencer/src/arranger_handle.rs +++ b/crates/tek_sequencer/src/arranger_handle.rs @@ -10,89 +10,86 @@ impl Handle for Arranger { return Ok(result) } match from.event() { - TuiEvent::Input(key) => match key { - // mode_switch: switch the display mode - key!(KeyCode::Char('`')) => { - self.mode.to_next(); - Ok(Some(true)) - }, - // cursor_up: move cursor up - key!(KeyCode::Up) => { - match self.mode { - ArrangerViewMode::Horizontal => self.track_prev(), - _ => self.scene_prev(), - }; - self.show_phrase()?; - Ok(Some(true)) - }, - // cursor_down - key!(KeyCode::Down) => { - match self.mode { - ArrangerViewMode::Horizontal => self.track_next(), - _ => self.scene_next(), - }; - self.show_phrase()?; - Ok(Some(true)) - }, - // cursor left - key!(KeyCode::Left) => { - match self.mode { - ArrangerViewMode::Horizontal => self.scene_prev(), - _ => self.track_prev(), - }; - self.show_phrase()?; - Ok(Some(true)) - }, - // cursor right - key!(KeyCode::Right) => { - match self.mode { - ArrangerViewMode::Horizontal => self.scene_next(), - _ => self.track_next(), - }; - self.show_phrase()?; - Ok(Some(true)) - }, - // increment: use next clip here - key!(KeyCode::Char('.')) => { - self.phrase_next(); - Ok(Some(true)) - }, - // increment: use next clip here - key!(KeyCode::Char(',')) => { - self.phrase_prev(); - Ok(Some(true)) - }, - // decrement: use previous clip here - key!(KeyCode::Enter) => { - self.activate(); - Ok(Some(true)) - }, - // scene_add: add a new scene - key!(Ctrl-KeyCode::Char('a')) => { - self.scene_add(None)?; - Ok(Some(true)) - }, - // track_add: add a new scene - key!(Ctrl-KeyCode::Char('t')) => { - self.track_add(None)?; - Ok(Some(true)) - }, - // rename: add a new scene - key!(KeyCode::Char('n')) => { - self.rename_selected(); - Ok(Some(true)) - }, - // length: add a new scene - key!(KeyCode::Char('l')) => { - todo!(); - Ok(Some(true)) - }, - // color: set color of item at cursor - key!(KeyCode::Char('c')) => { - todo!(); - Ok(Some(true)) - }, - _ => Ok(None) + // mode_switch: switch the display mode + key!(KeyCode::Char('`')) => { + self.mode.to_next(); + Ok(Some(true)) + }, + // cursor_up: move cursor up + key!(KeyCode::Up) => { + match self.mode { + ArrangerViewMode::Horizontal => self.track_prev(), + _ => self.scene_prev(), + }; + self.show_phrase()?; + Ok(Some(true)) + }, + // cursor_down + key!(KeyCode::Down) => { + match self.mode { + ArrangerViewMode::Horizontal => self.track_next(), + _ => self.scene_next(), + }; + self.show_phrase()?; + Ok(Some(true)) + }, + // cursor left + key!(KeyCode::Left) => { + match self.mode { + ArrangerViewMode::Horizontal => self.scene_prev(), + _ => self.track_prev(), + }; + self.show_phrase()?; + Ok(Some(true)) + }, + // cursor right + key!(KeyCode::Right) => { + match self.mode { + ArrangerViewMode::Horizontal => self.scene_next(), + _ => self.track_next(), + }; + self.show_phrase()?; + Ok(Some(true)) + }, + // increment: use next clip here + key!(KeyCode::Char('.')) => { + self.phrase_next(); + Ok(Some(true)) + }, + // decrement: use previous next clip here + key!(KeyCode::Char(',')) => { + self.phrase_prev(); + Ok(Some(true)) + }, + // decrement: use previous clip here + key!(KeyCode::Enter) => { + self.activate(); + Ok(Some(true)) + }, + // scene_add: add a new scene + key!(Ctrl-KeyCode::Char('a')) => { + self.scene_add(None)?; + Ok(Some(true)) + }, + // track_add: add a new scene + key!(Ctrl-KeyCode::Char('t')) => { + self.track_add(None)?; + Ok(Some(true)) + }, + // rename: add a new scene + key!(KeyCode::Char('n')) => { + self.rename_selected(); + Ok(Some(true)) + }, + // length: add a new scene + key!(KeyCode::Char('l')) => { + todo!(); + Ok(Some(true)) + }, + // color: set color of item at cursor + key!(KeyCode::Char('c')) => { + todo!(); + Ok(Some(true)) }, _ => Ok(None) } diff --git a/crates/tek_sequencer/src/arranger_main.rs b/crates/tek_sequencer/src/arranger_main.rs index 7a076514..3dff0276 100644 --- a/crates/tek_sequencer/src/arranger_main.rs +++ b/crates/tek_sequencer/src/arranger_main.rs @@ -3,7 +3,7 @@ include!("lib.rs"); use tek_core::clap::{self, Parser}; pub fn main () -> Usually<()> { - tek_core::run(Arc::new(RwLock::new(crate::ArrangerStandalone::from_args()?)))?; + Tui::run(Arc::new(RwLock::new(crate::ArrangerStandalone::from_args()?)))?; Ok(()) } @@ -75,25 +75,26 @@ impl ArrangerStandalone { } } -impl Render for ArrangerStandalone { - fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { +impl Render for ArrangerStandalone { + fn render (&self, to: &mut Tui) -> Perhaps { + let area = to.area(); let sequencer = self.arranger.sequencer(); let result = Split::down() .add_ref(&self.transport) .add_ref(&self.arranger) .add_ref(&sequencer) //.focus(Some(self.focus)) - .render(buf, area)?; + .render(to)?; if let Some(ref modal) = self.arranger.modal { - fill_bg(buf, area, Nord::bg_lo(false, false)); - fill_fg(buf, area, Nord::bg_hi(false, false)); - modal.render(buf, area)?; + to.fill_bg(area, Nord::bg_lo(false, false)); + to.fill_fg(area, Nord::bg_hi(false, false)); + modal.render(to)?; } Ok(result) } } -impl Handle for ArrangerStandalone { +impl Handle for ArrangerStandalone { fn handle (&mut self, e: &AppEvent) -> Usually { match e { AppEvent::Input(Event::Key(KeyEvent { code: KeyCode::Char(' '), .. })) => { diff --git a/crates/tek_sequencer/src/sequencer_handle.rs b/crates/tek_sequencer/src/sequencer_handle.rs index 7f759e1f..ed6ae8a4 100644 --- a/crates/tek_sequencer/src/sequencer_handle.rs +++ b/crates/tek_sequencer/src/sequencer_handle.rs @@ -2,48 +2,45 @@ use crate::*; impl Handle for Sequencer { fn handle (&mut self, from: &Tui) -> Perhaps { - handle_keymap(self, &from.event(), KEYMAP_SEQUENCER) + match from.event() { + // NONE, "seq_cursor_up", "move cursor up", |sequencer: &mut Sequencer| { + key!(KeyCode::Up) => { + match self.entered { + true => { self.note_axis.point_dec(); }, + false => { self.note_axis.start_dec(); }, + } + Ok(Some(true)) + }, + // NONE, "seq_cursor_down", "move cursor down", |self: &mut Sequencer| { + key!(KeyCode::Down) => { + match self.entered { + true => { self.note_axis.point_inc(); }, + false => { self.note_axis.start_inc(); }, + } + Ok(Some(true)) + }, + // NONE, "seq_cursor_left", "move cursor up", |self: &mut Sequencer| { + key!(KeyCode::Left) => { + match self.entered { + true => { self.time_axis.point_dec(); }, + false => { self.time_axis.start_dec(); }, + } + Ok(Some(true)) + }, + // NONE, "seq_cursor_right", "move cursor up", |self: &mut Sequencer| { + key!(KeyCode::Right) => { + match self.entered { + true => { self.time_axis.point_inc(); }, + false => { self.time_axis.start_inc(); }, + } + Ok(Some(true)) + }, + // NONE, "seq_mode_switch", "switch the display mode", |self: &mut Sequencer| { + key!(KeyCode::Char('`')) => { + self.mode = !self.mode; + Ok(Some(true)) + }, + _ => Ok(None) + } } } - -/// Key bindings for phrase editor. -pub const KEYMAP_SEQUENCER: &'static [KeyBinding] = keymap!(Sequencer { - [Up, NONE, "seq_cursor_up", "move cursor up", |sequencer: &mut Sequencer| { - match sequencer.entered { - true => { sequencer.note_axis.point_dec(); }, - false => { sequencer.note_axis.start_dec(); }, - } - Ok(true) - }], - [Down, NONE, "seq_cursor_down", "move cursor down", |sequencer: &mut Sequencer| { - match sequencer.entered { - true => { sequencer.note_axis.point_inc(); }, - false => { sequencer.note_axis.start_inc(); }, - } - Ok(true) - }], - [Left, NONE, "seq_cursor_left", "move cursor up", |sequencer: &mut Sequencer| { - match sequencer.entered { - true => { sequencer.time_axis.point_dec(); }, - false => { sequencer.time_axis.start_dec(); }, - } - Ok(true) - }], - [Right, NONE, "seq_cursor_right", "move cursor up", |sequencer: &mut Sequencer| { - match sequencer.entered { - true => { sequencer.time_axis.point_inc(); }, - false => { sequencer.time_axis.start_inc(); }, - } - Ok(true) - }], - [Char('`'), NONE, "seq_mode_switch", "switch the display mode", |sequencer: &mut Sequencer| { - sequencer.mode = !sequencer.mode; - Ok(true) - }], - /* - [Char('a'), NONE, "note_add", "Add note", note_add], - [Char('z'), NONE, "note_del", "Delete note", note_del], - [CapsLock, NONE, "advance", "Toggle auto advance", nop], - [Char('w'), NONE, "rest", "Advance by note duration", nop], - */ -}); diff --git a/crates/tek_sequencer/src/sequencer_main.rs b/crates/tek_sequencer/src/sequencer_main.rs index ba1d7fb1..668bd946 100644 --- a/crates/tek_sequencer/src/sequencer_main.rs +++ b/crates/tek_sequencer/src/sequencer_main.rs @@ -1,6 +1,5 @@ //! Phrase editor. include!("lib.rs"); pub fn main () -> Usually<()> { - tek_core::run(Arc::new(RwLock::new(crate::Sequencer::from_args())))?; - Ok(()) + Tui::run(Arc::new(RwLock::new(crate::Sequencer::from_args()))).map(|_|()) }