From 1f10c95ed03f6202a64ebe1aaf8da1c86098dc01 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 11 Jan 2025 21:35:21 +0100 Subject: [PATCH] wip: configuring keybinds with edn... oh my --- midi/src/midi_keys.edn | 22 ++++++++++++++++++++ output/src/edn_view.rs | 4 ++-- tek/src/app.rs | 42 +++++++++++++++++++-------------------- tui/src/lib.rs | 2 ++ tui/src/tui_edn_keymap.rs | 26 ++++++++++++++++++++++++ tui/src/tui_output.rs | 12 ----------- 6 files changed, 73 insertions(+), 35 deletions(-) create mode 100644 midi/src/midi_keys.edn create mode 100644 tui/src/tui_edn_keymap.rs diff --git a/midi/src/midi_keys.edn b/midi/src/midi_keys.edn new file mode 100644 index 00000000..baf6979e --- /dev/null +++ b/midi/src/midi_keys.edn @@ -0,0 +1,22 @@ +(@up (note/cursor/inc)) +(@down (note/cursor/dec)) +(@left (time/cursor/dec)) +(@right (time/cursor/inc)) +(@z (time/zoom/lock)) +(@= (time/zoom/in)) +(@- (time/zoom/out)) +(@+ (note/scale/inc)) +(@- (note/scale/dec)) +(@enter (note/put)) +(@del (note/del)) +(@, (note/duration/dec)) +(@. (note/duration/inc)) + +;(@ctrl-k (midi/kbd/toggle)) +;(@space (clock/toggle)) +;(@shift-space (clock/toggle-start)) +;(@u (undo)) +;(@shift-u (redo)) +;(@tab (compact/toggle)) +;(@q (player/enqueue :clip)) +;(@0 (player/enqueue :stop))) diff --git a/output/src/edn_view.rs b/output/src/edn_view.rs index 30cc3693..bc173a9d 100644 --- a/output/src/edn_view.rs +++ b/output/src/edn_view.rs @@ -2,10 +2,10 @@ use crate::*; use std::marker::PhantomData; use EdnItem::*; -pub type EdnCallback<'a, O: Output, State> = +pub type EdnCallback<'a, O, State> = dyn Fn(&'a State)-> RenderBox<'a, O> + Send + Sync + 'a; -pub type EdnRenderCallback<'a, O: Output, State> = +pub type EdnRenderCallback<'a, O, State> = Box>; /// Provides values to the template diff --git a/tek/src/app.rs b/tek/src/app.rs index 5103e8f5..10a585da 100644 --- a/tek/src/app.rs +++ b/tek/src/app.rs @@ -89,7 +89,6 @@ impl App { } render!(TuiOut: (self: App) => self.size.of(EdnView::from_source(self, self.edn.as_ref()))); audio!(|self: App, _client, _scope|Control::Continue); -handle!(TuiIn: |self: App, input| Ok(None)); impl EdnViewData for &App { fn get_content <'a> (&'a self, item: EdnItem<&'a str>) -> RenderBox<'a, TuiOut> { use EdnItem::*; @@ -318,26 +317,6 @@ fn output_cells <'a> (state: &'a App) -> BoxThunk<'a, TuiOut> { )))) })).boxed()).into() } -fn rec_mon (bg: Color, rec: bool, mon: bool) -> impl Content { - row!( - Tui::fg_bg(if rec { Color::Red } else { bg }, bg, "▐"), - Tui::fg_bg(if rec { Color::White } else { Color::Rgb(0,0,0) }, bg, "REC"), - Tui::fg_bg(if rec { Color::White } else { bg }, bg, "▐"), - Tui::fg_bg(if mon { Color::White } else { Color::Rgb(0,0,0) }, bg, "MON"), - Tui::fg_bg(if mon { Color::White } else { bg }, bg, "▌"), - ) -} -fn mute_solo (bg: Color, mute: bool, solo: bool) -> impl Content { - row!( - Tui::fg_bg(if mute { Color::White } else { Color::Rgb(0,0,0) }, bg, "MUTE"), - Tui::fg_bg(if mute { Color::White } else { bg }, bg, "▐"), - Tui::fg_bg(if solo { Color::White } else { Color::Rgb(0,0,0) }, bg, "SOLO"), - ) -} -fn cell > (color: ItemPalette, field: T) -> impl Content { - Tui::fg_bg(color.lightest.rgb, color.base.rgb, Fixed::y(1, field)) -} - fn scene_headers <'a> (state: &'a App) -> BoxThunk<'a, TuiOut> { (||{ let last_color = Arc::new(RwLock::new(ItemPalette::from(Color::Rgb(0, 0, 0)))); @@ -426,3 +405,24 @@ fn cell_clip <'a> ( Fixed::xy(w, h, &Tui::bg(bg, Push::x(1, Fixed::x(w, &name.as_str()[0..max_w])))); })) } +fn rec_mon (bg: Color, rec: bool, mon: bool) -> impl Content { + row!( + Tui::fg_bg(if rec { Color::Red } else { bg }, bg, "▐"), + Tui::fg_bg(if rec { Color::White } else { Color::Rgb(0,0,0) }, bg, "REC"), + Tui::fg_bg(if rec { Color::White } else { bg }, bg, "▐"), + Tui::fg_bg(if mon { Color::White } else { Color::Rgb(0,0,0) }, bg, "MON"), + Tui::fg_bg(if mon { Color::White } else { bg }, bg, "▌"), + ) +} +fn mute_solo (bg: Color, mute: bool, solo: bool) -> impl Content { + row!( + Tui::fg_bg(if mute { Color::White } else { Color::Rgb(0,0,0) }, bg, "MUTE"), + Tui::fg_bg(if mute { Color::White } else { bg }, bg, "▐"), + Tui::fg_bg(if solo { Color::White } else { Color::Rgb(0,0,0) }, bg, "SOLO"), + ) +} +fn cell > (color: ItemPalette, field: T) -> impl Content { + Tui::fg_bg(color.lightest.rgb, color.base.rgb, Fixed::y(1, field)) +} + +handle!(TuiIn: |self: App, input| Ok(None)); diff --git a/tui/src/lib.rs b/tui/src/lib.rs index db1dce5c..028fbd4d 100644 --- a/tui/src/lib.rs +++ b/tui/src/lib.rs @@ -21,6 +21,8 @@ mod tui_field; pub use self::tui_field::*; mod tui_buffer; pub use self::tui_buffer::*; mod tui_file; pub use self::tui_file::*; +mod tui_edn_keymap; pub use self::tui_edn_keymap::*; + pub(crate) use std::sync::{Arc, RwLock, atomic::{AtomicUsize, AtomicBool, Ordering::*}}; pub(crate) use std::io::{stdout, Stdout}; pub(crate) use std::error::Error; diff --git a/tui/src/tui_edn_keymap.rs b/tui/src/tui_edn_keymap.rs new file mode 100644 index 00000000..21fd7f79 --- /dev/null +++ b/tui/src/tui_edn_keymap.rs @@ -0,0 +1,26 @@ +use crate::*; +use std::marker::PhantomData; + +pub trait EdnControlData {} + +/// Renders from EDN source and context. +#[derive(Default)] +pub enum EdnControls> { + #[default] + Inert, + _Unused(PhantomData), + Ok(T, EdnItem), + Err(String) +} + +impl> EdnControls { + pub fn from_source (state: T, source: &str) -> Self { + match EdnItem::read_one(&source) { + Ok((layout, _)) => Self::Ok(state, layout), + Err(error) => Self::Err(format!("{error}")) + } + } + pub fn from_items (state: T, items: &[EdnItem<&str>]) -> Self { + Self::Ok(state, EdnItem::Exp(items.iter().map(|i|(*i).clone()).collect())) + } +} diff --git a/tui/src/tui_output.rs b/tui/src/tui_output.rs index e2b67006..9a119463 100644 --- a/tui/src/tui_output.rs +++ b/tui/src/tui_output.rs @@ -68,15 +68,3 @@ impl TuiOut { self } } - -pub fn buffer_update (buf: &mut Buffer, area: [u16;4], callback: &impl Fn(&mut Cell, u16, u16)) { - for row in 0..area.h() { - let y = area.y() + row; - for col in 0..area.w() { - let x = area.x() + col; - if x < buf.area.width && y < buf.area.height { - callback(buf.get_mut(x, y), col, row); - } - } - } -}