implement phrase rename

This commit is contained in:
🪞👃🪞 2024-10-11 14:15:20 +03:00
parent 0c5967a915
commit 1bed8aa72f
2 changed files with 66 additions and 52 deletions

View file

@ -34,7 +34,7 @@ pub struct PhrasePool<E: Engine> {
pub mode: Option<PhrasePoolMode>, pub mode: Option<PhrasePoolMode>,
} }
/// Modes for phrase pool /// Modes for phrase pool
pub enum PhrasePoolMode { Rename(usize) } pub enum PhrasePoolMode { Rename(usize, String) }
/// A MIDI sequence. /// A MIDI sequence.
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Phrase { pub struct Phrase {

View file

@ -47,26 +47,22 @@ impl Content for PhrasePool<Tui> {
let content = col!( let content = col!(
(i, phrase) in self.phrases.iter().enumerate() => Layers::new(|add|{ (i, phrase) in self.phrases.iter().enumerate() => Layers::new(|add|{
let Phrase { ref name, color, .. } = *phrase.read().unwrap(); let Phrase { ref name, color, .. } = *phrase.read().unwrap();
add(&col!( let row1 = format!(" {i}");
format!(" {i}"), let row2 = if let Some(PhrasePoolMode::Rename(phrase, ref new_name)) = self.mode {
format!(" {}", name.read().unwrap()), if self.focused && i == phrase {
).fill_x().bg(if i == self.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) color //Color::Rgb(40, 50, 30)
} else { } else {
color //Color::Rgb(28, 35, 25) color //Color::Rgb(28, 35, 25)
}))?; }))?;
match self.mode {
None => {
if self.focused && i == self.phrase { add(&CORNERS)?; } if self.focused && i == self.phrase { add(&CORNERS)?; }
},
Some(PhrasePoolMode::Rename(phrase)) => {
if self.focused && i == phrase {
add(&CORNERS)?;
add(&"Rename")?;
}
}
}
Ok(()) Ok(())
}) })
) )
@ -88,7 +84,19 @@ impl Content for PhrasePool<Tui> {
} }
impl Handle<Tui> for PhrasePool<Tui> { impl Handle<Tui> for PhrasePool<Tui> {
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> { fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
match from.event() { 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)
},
None => match from.event() {
key!(KeyCode::Up) => self.phrase = if self.phrase > 0 { key!(KeyCode::Up) => self.phrase = if self.phrase > 0 {
self.phrase - 1 self.phrase - 1
} else { } else {
@ -121,10 +129,16 @@ impl Handle<Tui> for PhrasePool<Tui> {
phrase.color = random_color(); phrase.color = random_color();
}, },
key!(KeyCode::Char('n')) => { // change name key!(KeyCode::Char('n')) => { // change name
self.mode = Some(PhrasePoolMode::Rename(self.phrase)); 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(None),
} }
}
return Ok(Some(true)) return Ok(Some(true))
} }
} }