diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index 700e4525..0c3985b2 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -34,7 +34,7 @@ pub struct PhrasePool { pub mode: Option, } /// Modes for phrase pool -pub enum PhrasePoolMode { Rename(usize) } +pub enum PhrasePoolMode { Rename(usize, String) } /// A MIDI sequence. #[derive(Debug, Clone)] pub struct Phrase { diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index e83f98d3..5af3c438 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -47,26 +47,22 @@ impl Content for PhrasePool { let content = col!( (i, phrase) in self.phrases.iter().enumerate() => Layers::new(|add|{ let Phrase { ref name, color, .. } = *phrase.read().unwrap(); - add(&col!( - format!(" {i}"), - format!(" {}", name.read().unwrap()), - ).fill_x().bg(if i == self.phrase { + let row1 = format!(" {i}"); + let row2 = if let Some(PhrasePoolMode::Rename(phrase, ref new_name)) = self.mode { + if self.focused && i == phrase { + format!(" {new_name}▄") + } else { + format!(" {}", name.read().unwrap()) + } + } else { + format!(" {}", name.read().unwrap()) + }; + add(&col!(row1, row2).fill_x().bg(if i == self.phrase { color //Color::Rgb(40, 50, 30) } else { color //Color::Rgb(28, 35, 25) }))?; - match self.mode { - None => { - if self.focused && i == self.phrase { add(&CORNERS)?; } - }, - Some(PhrasePoolMode::Rename(phrase)) => { - if self.focused && i == phrase { - add(&CORNERS)?; - add(&"Rename")?; - } - } - } - + if self.focused && i == self.phrase { add(&CORNERS)?; } Ok(()) }) ) @@ -88,43 +84,61 @@ impl Content for PhrasePool { } impl Handle for PhrasePool { fn handle (&mut self, from: &TuiInput) -> Perhaps { - match from.event() { - key!(KeyCode::Up) => self.phrase = if self.phrase > 0 { - self.phrase - 1 - } else { - self.phrases.len() - 1 + match self.mode { + Some(PhrasePoolMode::Rename(phrase, ref mut new_name)) => match from.event() { + key!(KeyCode::Backspace) => { new_name.pop(); }, + key!(KeyCode::Char(c)) => { new_name.push(*c); }, + key!(Shift-KeyCode::Char(c)) => { new_name.push(*c); }, + key!(KeyCode::Esc) => { self.mode = None; }, + key!(KeyCode::Enter) => { + *self.phrases[phrase].read().unwrap().name.write().unwrap() = new_name.clone(); + self.mode = None; + }, + _ => return Ok(None) }, - key!(KeyCode::Down) => { - self.phrase = (self.phrase + 1) % self.phrases.len() - }, - key!(KeyCode::Char('a')) => { // append new - let mut phrase = Phrase::default(); - phrase.name = Arc::new(RwLock::new("(no name)".to_string())); - phrase.color = random_color(); - self.phrases.push(Arc::new(RwLock::new(phrase))); - self.phrase = self.phrases.len() - 1; - }, - key!(KeyCode::Char('i')) => { // insert new - let mut phrase = Phrase::default(); - phrase.name = Arc::new(RwLock::new("(no name)".to_string())); - phrase.color = random_color(); - self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); - self.phrase += 1; - }, - key!(KeyCode::Char('d')) => { // insert duplicate - let phrase = (*self.phrases[self.phrase].read().unwrap()).clone(); - self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); - self.phrase += 1; - }, - key!(KeyCode::Char('c')) => { // change color - let mut phrase = self.phrases[self.phrase].write().unwrap(); - phrase.color = random_color(); - }, - key!(KeyCode::Char('n')) => { // change name - self.mode = Some(PhrasePoolMode::Rename(self.phrase)); - }, - _ => return Ok(None), + None => match from.event() { + 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('a')) => { // append new + let mut phrase = Phrase::default(); + phrase.name = Arc::new(RwLock::new("(no name)".to_string())); + phrase.color = random_color(); + self.phrases.push(Arc::new(RwLock::new(phrase))); + self.phrase = self.phrases.len() - 1; + }, + key!(KeyCode::Char('i')) => { // insert new + let mut phrase = Phrase::default(); + phrase.name = Arc::new(RwLock::new("(no name)".to_string())); + phrase.color = random_color(); + self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); + self.phrase += 1; + }, + key!(KeyCode::Char('d')) => { // insert duplicate + let phrase = (*self.phrases[self.phrase].read().unwrap()).clone(); + self.phrases.insert(self.phrase, Arc::new(RwLock::new(phrase))); + self.phrase += 1; + }, + key!(KeyCode::Char('c')) => { // change color + let mut phrase = self.phrases[self.phrase].write().unwrap(); + phrase.color = random_color(); + }, + key!(KeyCode::Char('n')) => { // change name + let phrase = self.phrases[self.phrase].read().unwrap(); + self.mode = Some(PhrasePoolMode::Rename( + self.phrase, + phrase.name.read().unwrap().clone() + )); + }, + _ => return Ok(None), + } } + return Ok(Some(true)) } }