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 outcome = apply_nav(edit, ks);
if outcome != KeyOutcome::Pass {
return outcome;
}
if !ks.modifiers.platform && !ks.modifiers.control {
if let Some(text) = ks.key_char.as_deref() {
let text: String = text.chars().filter(|c| !c.is_control()).collect();
if !text.is_empty() {
edit.insert(&text);
return KeyOutcome::Edited;
}
}
}
KeyOutcome::Pass
}
pub fn apply_nav(edit: &mut TextEdit, ks: &Keystroke) -> KeyOutcome {
let m = &ks.modifiers;
match ks.key.as_str() {
"enter" => return KeyOutcome::Submit,
"escape" => return KeyOutcome::Cancel,
"a" if m.platform => {
edit.select_all();
return KeyOutcome::Edited;
}
"left" => {
if !m.shift && !m.platform && !m.alt && edit.collapse_selection_start() {
return KeyOutcome::Edited;
}
edit.pre_move(m.shift);
if m.platform {
edit.home();
} else if m.alt {
edit.word_left();
} else {
edit.left();
}
return KeyOutcome::Edited;
}
"right" => {
if !m.shift && !m.platform && !m.alt && edit.collapse_selection_end() {
return KeyOutcome::Edited;
}
edit.pre_move(m.shift);
if m.platform {
edit.end();
} else if m.alt {
edit.word_right();
} else {
edit.right();
}
return KeyOutcome::Edited;
}
"up" | "home" => {
edit.pre_move(m.shift);
edit.home();
return KeyOutcome::Edited;
}
"down" | "end" => {
edit.pre_move(m.shift);
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;
}
_ => {}
}
KeyOutcome::Pass
}