mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
60 lines
1.9 KiB
Rust
60 lines
1.9 KiB
Rust
use crate::*;
|
|
use super::*;
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
pub enum PhraseRenameCommand {
|
|
Begin,
|
|
Cancel,
|
|
Confirm,
|
|
Set(String),
|
|
}
|
|
|
|
impl Command<PoolModel> for PhraseRenameCommand {
|
|
fn execute (self, state: &mut PoolModel) -> Perhaps<Self> {
|
|
use PhraseRenameCommand::*;
|
|
match state.phrases_mode_mut().clone() {
|
|
Some(PoolMode::Rename(phrase, ref mut old_name)) => match self {
|
|
Set(s) => {
|
|
state.phrases()[phrase].write().unwrap().name = s;
|
|
return Ok(Some(Self::Set(old_name.clone())))
|
|
},
|
|
Confirm => {
|
|
let old_name = old_name.clone();
|
|
*state.phrases_mode_mut() = None;
|
|
return Ok(Some(Self::Set(old_name)))
|
|
},
|
|
Cancel => {
|
|
state.phrases()[phrase].write().unwrap().name = old_name.clone();
|
|
},
|
|
_ => unreachable!()
|
|
},
|
|
_ => unreachable!()
|
|
};
|
|
Ok(None)
|
|
}
|
|
}
|
|
|
|
impl InputToCommand<Tui, PoolModel> for PhraseRenameCommand {
|
|
fn input_to_command (state: &PoolModel, from: &TuiInput) -> Option<Self> {
|
|
use KeyCode::{Char, Backspace, Enter, Esc};
|
|
if let Some(PoolMode::Rename(_, ref old_name)) = state.phrases_mode() {
|
|
Some(match from.event() {
|
|
key_pat!(Char(c)) => {
|
|
let mut new_name = old_name.clone();
|
|
new_name.push(*c);
|
|
Self::Set(new_name)
|
|
},
|
|
key_pat!(Backspace) => {
|
|
let mut new_name = old_name.clone();
|
|
new_name.pop();
|
|
Self::Set(new_name)
|
|
},
|
|
key_pat!(Enter) => Self::Confirm,
|
|
key_pat!(Esc) => Self::Cancel,
|
|
_ => return None
|
|
})
|
|
} else {
|
|
unreachable!()
|
|
}
|
|
}
|
|
}
|