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>,
}
/// Modes for phrase pool
pub enum PhrasePoolMode { Rename(usize) }
pub enum PhrasePoolMode { Rename(usize, String) }
/// A MIDI sequence.
#[derive(Debug, Clone)]
pub struct Phrase {

View file

@ -47,26 +47,22 @@ impl Content for PhrasePool<Tui> {
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")?;
}
}
}
Ok(())
})
)
@ -88,7 +84,19 @@ impl Content for PhrasePool<Tui> {
}
impl Handle<Tui> for PhrasePool<Tui> {
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 {
self.phrase - 1
} else {
@ -121,10 +129,16 @@ impl Handle<Tui> for PhrasePool<Tui> {
phrase.color = random_color();
},
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(Some(true))
}
}