diff --git a/crates/app/src/lib.rs b/crates/app/src/lib.rs index 8ff103aa..e3578460 100644 --- a/crates/app/src/lib.rs +++ b/crates/app/src/lib.rs @@ -31,6 +31,7 @@ pub use ::tengri::tui::ratatui::prelude::Color::{self, *}; pub use ::tengri::tui::ratatui::prelude::{Style, Stylize, Buffer, Modifier}; pub use ::tengri::tui::crossterm; pub use ::tengri::tui::crossterm::event::{Event, KeyCode::{self, *}}; +pub(crate) use std::path::Path; pub(crate) use std::sync::{Arc, RwLock}; pub(crate) use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering::Relaxed}; diff --git a/crates/app/src/model.rs b/crates/app/src/model.rs index 06529e66..44e0a0c7 100644 --- a/crates/app/src/model.rs +++ b/crates/app/src/model.rs @@ -423,11 +423,51 @@ pub trait HasSelection { #[derive(Default, Debug)] pub struct Configuration { /// View definition - pub view: SourceIter<'static>, + pub view: TokenIter<'static>, // Input keymap pub keys: InputMap<'static, Tek, TekCommand, TuiIn, TokenIter<'static>> } +impl Configuration { + pub fn from_file (path: &impl AsRef, _watch: bool) -> Usually { + Self::from_source(String::from_utf8(std::fs::read(path.as_ref())?)?) + } + pub fn from_source (source: impl AsRef + 'static) -> Usually { + let source: Box = source.as_ref().into(); + let source: &'static str = Box::leak(source); + let iter = TokenIter::from(source.as_ref()); + let mut view: Option = None; + let mut keys: Option = None; + for token in iter { + match token.value { + Value::Exp(_, mut exp) => match exp.next() { + Some(Token { value: Value::Sym(sym), .. }) => match sym { + "keys" => keys = Some(exp), + "view" => view = Some(exp), + _ => return Err(format!("unexpected token {token:?}").into()) + }, + _ => return Err(format!("unexpected token {token:?}").into()) + }, + t => return Err(format!("unexpected token {token:?}").into()) + }; + } + Ok(Self { + view: if let Some(view) = view { + view + } else { + return Err(format!("missing view definition").into()) + }, + keys: if let Some(keys) = keys { + let mut map = InputMap::default(); + // TODO add layers + map + } else { + return Err(format!("missing keys definition").into()) + }, + }) + } +} + /// Various possible modal overlays #[derive(PartialEq, Clone, Copy, Debug)] pub enum Modal { diff --git a/crates/cli/tek.rs b/crates/cli/tek.rs index 6c56a357..604923a9 100644 --- a/crates/cli/tek.rs +++ b/crates/cli/tek.rs @@ -139,19 +139,14 @@ impl Cli { }, scenes, selected: Selection::TrackClip { track: 0, scene: 0 }, - config: Configuration::from(match mode { - LaunchMode::Clock => - include_str!("../../config/view_transport.edn"), - LaunchMode::Sequencer => - include_str!("../../config/view_sequencer.edn"), - LaunchMode::Groovebox => - include_str!("../../config/view_groovebox.edn"), - LaunchMode::Arranger { .. } => - include_str!("../../config/view_arranger.edn"), - LaunchMode::Sampler => - include_str!("../../config/view_sampler.edn"), + config: Configuration::from_file(match mode { + LaunchMode::Clock => &"config/config_transport.edn", + LaunchMode::Sequencer => &"config/config_sequencer.edn", + LaunchMode::Groovebox => &"config/config_groovebox.edn", + LaunchMode::Arranger { .. } => &"config/config_arranger.edn", + LaunchMode::Sampler => &"config/config_sampler.edn", _ => todo!("{mode:?}"), - }), + }, false)?, ..Default::default() }; if let &LaunchMode::Arranger { scenes, tracks, track_width, .. } = mode { diff --git a/deps/tengri b/deps/tengri index 2b208e3c..0d4ba4a5 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit 2b208e3c497d595f7dad5a6d190dfe08f7fb9dc0 +Subproject commit 0d4ba4a54ef0528a0a45b58e21a1e4aa7ed5eaf9