use crate::*; #[derive(Clone, Debug, PartialEq)] pub enum PhraseRenameCommand { Begin, Set(String), Confirm, Cancel, } impl InputToCommand> for PhraseRenameCommand { fn input_to_command (view: &PhrasePoolView, from: &TuiInput) -> Option { if let Some(PhrasePoolMode::Rename(_, ref old_name)) = view.mode { Some(match from.event() { key!(KeyCode::Char(c)) => { let mut new_name = old_name.clone(); new_name.push(*c); Self::Set(new_name) }, key!(KeyCode::Backspace) => { let mut new_name = old_name.clone(); new_name.pop(); Self::Set(new_name) }, key!(KeyCode::Enter) => Self::Confirm, key!(KeyCode::Esc) => Self::Cancel, _ => return None }) } else { unreachable!() } } } impl Command> for PhraseRenameCommand { fn execute (self, view: &mut PhrasePoolView) -> Perhaps { use PhraseRenameCommand::*; if let Some(PhrasePoolMode::Rename(phrase, ref mut old_name)) = view.mode { match self { Set(s) => { view.model.phrases[phrase].write().unwrap().name = s.into(); return Ok(Some(Self::Set(old_name.clone()))) }, Confirm => { let old_name = old_name.clone(); view.mode = None; return Ok(Some(Self::Set(old_name))) }, Cancel => { let mut phrase = view.model.phrases[phrase].write().unwrap(); phrase.name = old_name.clone(); }, _ => unreachable!() }; Ok(None) } else if self == Begin { view.mode = Some(PhrasePoolMode::Rename( view.phrase, view.model.phrases[view.phrase].read().unwrap().name.clone() )); Ok(None) } else { unreachable!() } } }