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")?;
}
}
}
if self.focused && i == self.phrase { add(&CORNERS)?; }
Ok(())
})
)
@ -88,43 +84,61 @@ impl Content for PhrasePool<Tui> {
}
impl Handle<Tui> for PhrasePool<Tui> {
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
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))
}
}