use gpui::Keystroke;
use super::edit::TextEdit;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KeyOutcome {
Submit,
Cancel,
Edited,
Pass,
}
pub fn apply_key(edit: &mut TextEdit, ks: &Keystroke) -> KeyOutcome {
let m = &ks.modifiers;
match ks.key.as_str() {
"enter" => return KeyOutcome::Submit,
"escape" => return KeyOutcome::Cancel,
"left" => {
if m.platform {
edit.home();
} else if m.alt {
edit.word_left();
} else {
edit.left();
}
return KeyOutcome::Edited;
}
"right" => {
if m.platform {
edit.end();
} else if m.alt {
edit.word_right();
} else {
edit.right();
}
return KeyOutcome::Edited;
}
"up" | "home" => {
edit.home();
return KeyOutcome::Edited;
}
"down" | "end" => {
edit.end();
return KeyOutcome::Edited;
}
"backspace" => {
if m.platform {
edit.delete_to_start();
} else if m.alt {
edit.delete_word_back();
} else {
edit.backspace();
}
return KeyOutcome::Edited;
}
"delete" => {
if m.platform {
edit.delete_to_end();
} else if m.alt {
edit.delete_word_forward();
} else {
edit.delete();
}
return KeyOutcome::Edited;
}
"k" if m.control => {
edit.delete_to_end();
return KeyOutcome::Edited;
}
"a" if m.control => {
edit.home();
return KeyOutcome::Edited;
}
"e" if m.control => {
edit.end();
return KeyOutcome::Edited;
}
_ => {}
}
if !m.platform && !m.control {
if let Some(t) = ks.key_char.as_deref().filter(|t| !t.is_empty()) {
edit.insert(t);
return KeyOutcome::Edited;
}
}
KeyOutcome::Pass
}