diff --git a/crates/tek/Cargo.toml b/crates/tek/Cargo.toml index 0f0cbe29..545627e6 100644 --- a/crates/tek/Cargo.toml +++ b/crates/tek/Cargo.toml @@ -33,15 +33,15 @@ winit = { version = "0.30.4", features = [ "x11" ] } [[bin]] name = "tek_arranger" -path = "src/cli_arranger.rs" +path = "src/cli/cli_arranger.rs" [[bin]] name = "tek_sequencer" -path = "src/cli_sequencer.rs" +path = "src/cli/cli_sequencer.rs" [[bin]] name = "tek_transport" -path = "src/cli_transport.rs" +path = "src/cli/cli_transport.rs" #[[bin]] #name = "tek_mixer" diff --git a/crates/tek/src/api.rs b/crates/tek/src/api.rs index ce2f87e1..a3c2e9ca 100644 --- a/crates/tek/src/api.rs +++ b/crates/tek/src/api.rs @@ -1,7 +1,7 @@ use crate::*; mod phrase; pub(crate) use phrase::*; -mod jack; pub(crate) use jack::*; +mod jack; pub(crate) use self::jack::*; mod clip; pub(crate) use clip::*; mod color; pub(crate) use color::*; mod clock; pub(crate) use clock::*; diff --git a/crates/tek/src/cli_arranger.rs b/crates/tek/src/cli/cli_arranger.rs similarity index 95% rename from crates/tek/src/cli_arranger.rs rename to crates/tek/src/cli/cli_arranger.rs index 6f4e9653..4c11ea1f 100644 --- a/crates/tek/src/cli_arranger.rs +++ b/crates/tek/src/cli/cli_arranger.rs @@ -1,4 +1,4 @@ -use crate::*; +include!("../lib.rs"); pub fn main () -> Usually<()> { ArrangerCli::parse().run() @@ -22,7 +22,7 @@ impl ArrangerCli { /// Run the arranger TUI from CLI arguments. fn run (&self) -> Usually<()> { Tui::run(JackClient::new("tek_arranger")?.activate_with(|jack|{ - let mut app = tek_tui::ArrangerTui::try_from(jack)?; + let mut app = ArrangerTui::try_from(jack)?; if let Some(name) = self.name.as_ref() { *app.name.write().unwrap() = name.clone(); } diff --git a/crates/tek/src/cli_sequencer.rs b/crates/tek/src/cli/cli_sequencer.rs similarity index 95% rename from crates/tek/src/cli_sequencer.rs rename to crates/tek/src/cli/cli_sequencer.rs index d6863cb6..1fe86a08 100644 --- a/crates/tek/src/cli_sequencer.rs +++ b/crates/tek/src/cli/cli_sequencer.rs @@ -1,4 +1,4 @@ -use crate::*; +include!("../lib.rs"); pub fn main () -> Usually<()> { SequencerCli::parse().run() @@ -20,7 +20,7 @@ pub struct SequencerCli { impl SequencerCli { fn run (&self) -> Usually<()> { Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{ - let mut app = tek_tui::SequencerTui::try_from(jack)?; + let mut app = SequencerTui::try_from(jack)?; // TODO: create from arguments let midi_in = app.jack.read().unwrap().register_port("in", MidiIn::default())?; app.player.midi_ins.push(midi_in); diff --git a/crates/tek/src/cli_transport.rs b/crates/tek/src/cli/cli_transport.rs similarity index 71% rename from crates/tek/src/cli_transport.rs rename to crates/tek/src/cli/cli_transport.rs index d841ae41..68f47c94 100644 --- a/crates/tek/src/cli_transport.rs +++ b/crates/tek/src/cli/cli_transport.rs @@ -1,9 +1,9 @@ -use crate::*; +include!("../lib.rs"); /// Application entrypoint. pub fn main () -> Usually<()> { Tui::run(JackClient::new("tek_transport")?.activate_with(|jack|{ - tek_tui::TransportTui::try_from(jack) + TransportTui::try_from(jack) })?)?; Ok(()) } diff --git a/crates/tek/src/todo_cli_mixer.rs b/crates/tek/src/cli/todo_cli_mixer.rs similarity index 100% rename from crates/tek/src/todo_cli_mixer.rs rename to crates/tek/src/cli/todo_cli_mixer.rs diff --git a/crates/tek/src/todo_cli_plugin.rs b/crates/tek/src/cli/todo_cli_plugin.rs similarity index 100% rename from crates/tek/src/todo_cli_plugin.rs rename to crates/tek/src/cli/todo_cli_plugin.rs diff --git a/crates/tek/src/todo_cli_sampler.rs b/crates/tek/src/cli/todo_cli_sampler.rs similarity index 100% rename from crates/tek/src/todo_cli_sampler.rs rename to crates/tek/src/cli/todo_cli_sampler.rs diff --git a/crates/tek/src/lib.rs b/crates/tek/src/lib.rs index d8a03be9..6faafea0 100644 --- a/crates/tek/src/lib.rs +++ b/crates/tek/src/lib.rs @@ -39,7 +39,7 @@ pub(crate) use palette::{ okhsl::* }; -pub(crate) use clap; +pub(crate) use clap::{self, Parser}; pub(crate) use crossterm::{ExecutableCommand}; pub(crate) use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen, enable_raw_mode, disable_raw_mode}; diff --git a/crates/tek/src/tui.rs b/crates/tek/src/tui.rs index d56dca59..145eb790 100644 --- a/crates/tek/src/tui.rs +++ b/crates/tek/src/tui.rs @@ -110,7 +110,7 @@ impl Tui { let engine = Self { exited: Arc::new(AtomicBool::new(false)), buffer: Buffer::empty(area), - area: area.xywh(), + area: [area.x, area.y, area.width, area.height], backend, }; let engine = Arc::new(RwLock::new(engine)); @@ -167,7 +167,10 @@ impl Tui { buffer.resize(size); buffer.reset(); } - let mut output = TuiOutput { buffer, area: size.xywh() }; + let mut output = TuiOutput { + buffer, + area: [size.x, size.y, size.width, size.height] + }; state.render(&mut output).expect("render failed"); buffer = engine.write().unwrap().flip(output.buffer, size); } diff --git a/crates/tek/src/tui/engine_input.rs b/crates/tek/src/tui/engine_input.rs index 5ea6993c..7508bf22 100644 --- a/crates/tek/src/tui/engine_input.rs +++ b/crates/tek/src/tui/engine_input.rs @@ -1,8 +1,8 @@ use crate::*; pub struct TuiInput { - exited: Arc, - event: TuiEvent, + pub(crate) exited: Arc, + pub(crate) event: TuiEvent, } #[derive(Debug, Clone)] diff --git a/crates/tek/src/tui/view_phrase_list.rs b/crates/tek/src/tui/view_phrase_list.rs index a9a6a0f2..a69d6ab9 100644 --- a/crates/tek/src/tui/view_phrase_list.rs +++ b/crates/tek/src/tui/view_phrase_list.rs @@ -25,50 +25,49 @@ impl<'a, T: HasPhraseList> From<&'a T> for PhraseListView<'a> { // TODO: Display phrases always in order of appearance render!(|self: PhraseListView<'a>|{ let Self { title, focused, entered, phrases, index, mode } = self; - let content = col!(|add|match mode { - Some(PhrasesMode::Import(_, ref browser)) => { - add(browser) - }, - Some(PhrasesMode::Export(_, ref browser)) => { - add(browser) - }, - _ => { - for (i, phrase) in phrases.iter().enumerate() { - add(&lay!(|add|{ - let Phrase { ref name, color, length, .. } = *phrase.read().unwrap(); - let mut length = PhraseLength::new(length, None); - if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode { - if *focused && i == *phrase { - length.pulses = *new_length; - length.focus = Some(*focus); - } - } - let length = Tui::fill_x(Tui::at_e(length)); - let row1 = Tui::fill_x(lay!([Tui::fill_x(Tui::at_w(format!(" {i}"))), length])); - let mut row2 = format!(" {name}"); - if let Some(PhrasesMode::Rename(phrase, _)) = mode { - if *focused && i == *phrase { - row2 = format!("{row2}▄"); - } - }; - let row2 = Tui::bold(true, row2); - add(&Tui::bg(color.base.rgb, Tui::fill_x(Tui::to_south(row1, row2))))?; - if *entered && i == *index { - add(&CORNERS)?; - } - Ok(()) - }))?; - } - Ok(()) - } - }); let border_color = if *focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)}; let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)}; let upper_left = format!("[{}] {title}", if *entered {"■"} else {" "}); let upper_right = format!("({})", phrases.len()); lay!([ Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color)) - .wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(content))), + .wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(col!(move|add|match mode { + Some(PhrasesMode::Import(_, ref browser)) => { + add(browser) + }, + Some(PhrasesMode::Export(_, ref browser)) => { + add(browser) + }, + _ => { + for (i, phrase) in phrases.iter().enumerate() { + add(&lay!(|add|{ + let Phrase { ref name, color, length, .. } = *phrase.read().unwrap(); + let mut length = PhraseLength::new(length, None); + if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode { + if *focused && i == *phrase { + length.pulses = *new_length; + length.focus = Some(*focus); + } + } + let length = Tui::fill_x(Tui::at_e(length)); + let row1 = Tui::fill_x(lay!([Tui::fill_x(Tui::at_w(format!(" {i}"))), length])); + let mut row2 = format!(" {name}"); + if let Some(PhrasesMode::Rename(phrase, _)) = mode { + if *focused && i == *phrase { + row2 = format!("{row2}▄"); + } + }; + let row2 = Tui::bold(true, row2); + add(&Tui::bg(color.base.rgb, Tui::fill_x(Tui::to_south(row1, row2))))?; + if *entered && i == *index { + add(&CORNERS)?; + } + Ok(()) + }))?; + } + Ok(()) + } + })))), Tui::fill_xy(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, upper_left.to_string())))), Tui::fill_xy(Tui::at_ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))), ])