mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
20 new errors rear their ugly heads
This commit is contained in:
parent
92d747ba2a
commit
e7f2284e5e
8 changed files with 167 additions and 174 deletions
|
|
@ -28,3 +28,5 @@ pub trait ExitableComponent<E>: Exit + Component<E> where E: Engine {
|
|||
Box::new(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<E: Engine, C: Component<E> + Exit> ExitableComponent<E> for C {}
|
||||
|
|
|
|||
|
|
@ -41,28 +41,28 @@ pub fn handle_keymap <T> (
|
|||
|
||||
#[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
|
||||
})
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ pub struct LV2Plugin {
|
|||
}
|
||||
|
||||
impl LV2Plugin {
|
||||
pub fn from_edn <'e, E: Engine> (args: &[Edn<'e>]) -> Usually<JackDevice<E>> {
|
||||
pub fn from_edn <'e> (args: &[Edn<'e>]) -> Usually<JackDevice<Tui>> {
|
||||
let mut name = String::new();
|
||||
let mut path = String::new();
|
||||
edn!(edn in args {
|
||||
|
|
|
|||
|
|
@ -3,37 +3,34 @@ use crate::*;
|
|||
impl Handle<Tui> for Track<Tui> {
|
||||
fn handle (&mut self, from: &Tui) -> Perhaps<bool> {
|
||||
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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,89 +10,86 @@ impl Handle<Tui> for Arranger<Tui> {
|
|||
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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Rect> {
|
||||
impl Render<Tui> for ArrangerStandalone {
|
||||
fn render (&self, to: &mut Tui) -> Perhaps<Rect> {
|
||||
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<Tui> for ArrangerStandalone {
|
||||
fn handle (&mut self, e: &AppEvent) -> Usually<bool> {
|
||||
match e {
|
||||
AppEvent::Input(Event::Key(KeyEvent { code: KeyCode::Char(' '), .. })) => {
|
||||
|
|
|
|||
|
|
@ -2,48 +2,45 @@ use crate::*;
|
|||
|
||||
impl Handle<Tui> for Sequencer {
|
||||
fn handle (&mut self, from: &Tui) -> Perhaps<bool> {
|
||||
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<Sequencer>] = 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],
|
||||
*/
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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(|_|())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue