use super::Movement;
use crate::{HotKey, KeyCode, SysMods};
use druid_shell::{KeyEvent, KeyModifiers};
#[derive(Debug, PartialEq, Clone)]
pub enum EditAction {
Move(Movement),
ModifySelection(Movement),
SelectAll,
Click(MouseAction),
Drag(MouseAction),
Delete,
Backspace,
Insert(String),
Paste(String),
}
#[derive(PartialEq, Debug, Clone)]
pub struct MouseAction {
pub row: usize,
pub column: usize,
pub mods: KeyModifiers,
}
pub trait TextInput {
fn handle_event(&self, event: &KeyEvent) -> Option<EditAction>;
}
pub struct BasicTextInput {}
impl BasicTextInput {
pub fn new() -> Self {
Self {}
}
}
impl TextInput for BasicTextInput {
fn handle_event(&self, event: &KeyEvent) -> Option<EditAction> {
let action = match event {
k_e if (HotKey::new(SysMods::Cmd, "a")).matches(k_e) => EditAction::SelectAll,
k_e if (HotKey::new(SysMods::Cmd, KeyCode::ArrowLeft)).matches(k_e)
|| HotKey::new(None, KeyCode::Home).matches(k_e) =>
{
EditAction::Move(Movement::LeftOfLine)
}
k_e if (HotKey::new(SysMods::Cmd, KeyCode::ArrowRight)).matches(k_e)
|| HotKey::new(None, KeyCode::End).matches(k_e) =>
{
EditAction::Move(Movement::RightOfLine)
}
k_e if (HotKey::new(SysMods::Shift, KeyCode::ArrowLeft)).matches(k_e) => {
EditAction::ModifySelection(Movement::Left)
}
k_e if (HotKey::new(SysMods::Shift, KeyCode::ArrowRight)).matches(k_e) => {
EditAction::ModifySelection(Movement::Right)
}
k_e if (HotKey::new(None, KeyCode::ArrowLeft)).matches(k_e) => {
EditAction::Move(Movement::Left)
}
k_e if (HotKey::new(None, KeyCode::ArrowRight)).matches(k_e) => {
EditAction::Move(Movement::Right)
}
k_e if (HotKey::new(None, KeyCode::Backspace)).matches(k_e) => EditAction::Backspace,
k_e if (HotKey::new(None, KeyCode::Delete)).matches(k_e) => EditAction::Delete,
k_e if k_e.key_code.is_printable() => {
if let Some(chars) = k_e.text() {
EditAction::Insert(chars.to_owned())
} else {
return None;
}
}
_ => return None,
};
Some(action)
}
}