mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
use crate::*;
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
pub enum PhraseRenameCommand {
|
|
Begin,
|
|
Set(String),
|
|
Confirm,
|
|
Cancel,
|
|
}
|
|
|
|
impl InputToCommand<Tui, PhrasePoolView<Tui>> for PhraseRenameCommand {
|
|
fn input_to_command (view: &PhrasePoolView<Tui>, from: &TuiInput) -> Option<Self> {
|
|
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<E: Engine> Command<PhrasePoolView<E>> for PhraseRenameCommand {
|
|
fn execute (self, view: &mut PhrasePoolView<E>) -> Perhaps<Self> {
|
|
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!()
|
|
}
|
|
}
|
|
}
|