From dc3edc86ff0e19db8e2dc93ed3cd71814210bef0 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 10 Oct 2024 09:44:28 +0300 Subject: [PATCH] phrase list select and append/insert --- crates/tek_sequencer/src/sequencer.rs | 6 ++++++ crates/tek_sequencer/src/sequencer_tui.rs | 25 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index dd77beef..59de47e4 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -22,6 +22,10 @@ pub enum SequencerFocus { Transport, PhrasePool, PhraseEditor } /// Contains all phrases in a project pub struct PhrasePool { _engine: PhantomData, + /// Scroll offset + pub scroll: usize, + /// Highlighted phrase + pub phrase: usize, /// Phrases in the pool pub phrases: Vec>>>, /// Whether this widget is focused @@ -120,6 +124,8 @@ impl PhrasePool { pub fn new () -> Self { Self { _engine: Default::default(), + scroll: 0, + phrase: 0, phrases: vec![Arc::new(RwLock::new(Some(Phrase::default())))], focused: false } diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index bc03b976..2e1b6a31 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -45,8 +45,13 @@ impl Content for PhrasePool { type Engine = Tui; fn content (&self) -> impl Widget { col!( - "Phrases:", - col!((i, phrase) in self.phrases.iter().enumerate() => format!("{i}")) + "Phrases:".fill_x().fixed_y(2), + col!((i, phrase) in self.phrases.iter().enumerate() => + format!("{i}").fixed_y(2).bg(if i == self.phrase { + Color::Rgb(40, 50, 30) + } else { + Color::Rgb(28, 35, 25) + })) ) .fill_xy() .bg(Color::Rgb(28, 35, 25)) @@ -62,8 +67,20 @@ impl Content for PhrasePool { impl Handle for PhrasePool { fn handle (&mut self, from: &TuiInput) -> Perhaps { match from.event() { - key!(KeyCode::Up) => todo!(), - key!(KeyCode::Down) => todo!(), + key!(KeyCode::Up) => self.phrase = if self.phrase > 0 { + self.phrase - 1 + } else { + self.phrases.len() - 1 + }, + key!(KeyCode::Down) => { + self.phrase = (self.phrase + 1) % self.phrases.len() + }, + key!(KeyCode::Char('i')) => { + self.phrases.insert(self.phrase, Arc::new(RwLock::new(Some(Phrase::default())))) + }, + key!(KeyCode::Char('a')) => { + self.phrases.push(Arc::new(RwLock::new(Some(Phrase::default())))) + }, _ => return Ok(None), } return Ok(Some(true))