From a4febb8a0dad197bfde22e68df3748bd8ce3911e Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 24 Nov 2024 19:23:56 +0100 Subject: [PATCH] wip: midi import/export browser, pt.3 --- crates/tek_tui/src/tui_command.rs | 3 +- crates/tek_tui/src/tui_content.rs | 72 +++++++++++++++++++------------ crates/tek_tui/src/tui_view.rs | 4 +- 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/crates/tek_tui/src/tui_command.rs b/crates/tek_tui/src/tui_command.rs index bbaaa24d..b9a18b5b 100644 --- a/crates/tek_tui/src/tui_command.rs +++ b/crates/tek_tui/src/tui_command.rs @@ -258,7 +258,8 @@ pub enum FileBrowserCommand { Cancel, Confirm, Select(usize), - Chdir(PathBuf) + Chdir(PathBuf), + Filter(String), } impl Command for FileBrowserCommand { diff --git a/crates/tek_tui/src/tui_content.rs b/crates/tek_tui/src/tui_content.rs index 29d94162..106a4de1 100644 --- a/crates/tek_tui/src/tui_content.rs +++ b/crates/tek_tui/src/tui_content.rs @@ -130,35 +130,46 @@ impl<'a, T: PhrasesViewState> Content for PhrasesView<'a, T> { fn content (&self) -> impl Widget { let focused = self.0.phrases_focused(); let entered = self.0.phrases_entered(); - let phrases = self.0.phrases(); - let selected_phrase = self.0.phrase_index(); - let mode = self.0.phrase_mode(); - let content = col!( - (i, phrase) in phrases.iter().enumerate() => Layers::new(|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 = length.align_e().fill_x(); - let row1 = lay!(format!(" {i}").align_w().fill_x(), length).fill_x(); - let mut row2 = format!(" {name}"); - if let Some(PhrasesMode::Rename(phrase, _)) = mode { - if focused && i == *phrase { - row2 = format!("{row2}▄"); - } - }; - let row2 = TuiStyle::bold(row2, true); - add(&col!(row1, row2).fill_x().bg(color.base.rgb))?; - if focused && i == selected_phrase { - add(&CORNERS)?; + let mode = self.0.phrases_mode(); + let content = Stack::down(move|add|match mode { + Some(PhrasesMode::Import(index, ref browser)) => { + add(browser) + }, + Some(PhrasesMode::Export(index, ref browser)) => { + add(browser) + }, + _ => { + let phrases = self.0.phrases(); + let selected = self.0.phrase_index(); + for (i, phrase) in phrases.iter().enumerate() { + add(&Layers::new(|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 = length.align_e().fill_x(); + let row1 = lay!(format!(" {i}").align_w().fill_x(), length).fill_x(); + let mut row2 = format!(" {name}"); + if let Some(PhrasesMode::Rename(phrase, _)) = mode { + if focused && i == *phrase { + row2 = format!("{row2}▄"); + } + }; + let row2 = TuiStyle::bold(row2, true); + add(&col!(row1, row2).fill_x().bg(color.base.rgb))?; + if focused && i == selected { + add(&CORNERS)?; + } + Ok(()) + }))?; } Ok(()) - }) - ); + } + }); let border_color = if focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)}; let border = Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color)); let content = content.fill_xy().bg(Color::Rgb(28, 35, 25)).border(border); @@ -173,6 +184,13 @@ impl<'a, T: PhrasesViewState> Content for PhrasesView<'a, T> { } } +impl Content for FileBrowser { + type Engine = Tui; + fn content (&self) -> impl Widget { + "todo: file browser" + } +} + impl<'a, T: PhraseViewState> Content for PhraseView<'a, T> { type Engine = Tui; fn content (&self) -> impl Widget { diff --git a/crates/tek_tui/src/tui_view.rs b/crates/tek_tui/src/tui_view.rs index 7fa597a8..30b6100f 100644 --- a/crates/tek_tui/src/tui_view.rs +++ b/crates/tek_tui/src/tui_view.rs @@ -66,7 +66,7 @@ pub trait PhrasesViewState: Send + Sync { fn phrases_entered (&self) -> bool; fn phrases (&self) -> &Vec>>; fn phrase_index (&self) -> usize; - fn phrase_mode (&self) -> &Option; + fn phrases_mode (&self) -> &Option; } macro_rules! impl_phrases_view_state { ($Struct:ident $(:: $field:ident)* [$self1:ident: $focus:expr] [$self2:ident: $enter:expr]) => { @@ -83,7 +83,7 @@ macro_rules! impl_phrases_view_state { fn phrase_index (&self) -> usize { self$(.$field)*.phrase.load(Ordering::Relaxed) } - fn phrase_mode (&self) -> &Option { + fn phrases_mode (&self) -> &Option { &self$(.$field)*.mode } }