perch/src/keys/edit.rs

66 lines
2.2 KiB
Rust

use crate::*;
impl Taggart {
pub fn handle_edit (&mut self, event: &Event) {
match event {
press!(Char(c)) => self.edit_insert(*c),
press!(Shift-Char(c)) => self.edit_insert(c.to_uppercase().next().unwrap()),
press!(Backspace) => self.edit_backspace(),
press!(Delete) => self.edit_delete(),
press!(Enter) => self.edit_confirm(),
press!(Esc) => self.edit_cancel(),
_ => {}
}
}
pub fn edit_begin (&mut self) {
if let Some(column) = self.columns.0.get(self.column)
&& column.setter.is_some()
{
let value = (column.getter)(&self.entries[self.cursor]);
let value = format!("{}", value.unwrap_or_default());
self.mode = Some(Mode::Edit {
index: value.len(),
value: value.into(),
});
}
}
pub fn edit_cancel (&mut self) {
self.mode = None;
}
pub fn edit_confirm (&mut self) {
let value = if let Some(Mode::Edit { value, .. }) = &self.mode {
Some(value.clone())
} else {
None
};
if let Some(value) = value
&& let Some(column) = self.columns.0.get(self.column)
&& let Some(setter) = &column.setter
&& self.entries.get_mut(self.cursor).is_some()
{
setter(self, self.cursor, value.as_ref());
self.mode = None;
}
}
pub fn edit_insert (&mut self, c: char) {
if let Some(Mode::Edit { value, index }) = &self.mode {
self.mode = Some(Mode::Edit {
index: *index + 1,
value: format!("{value}{c}").into()
});
}
}
pub fn edit_backspace (&mut self) {
if let Some(Mode::Edit { value, index }) = &self.mode {
let mut chars = value.chars();
chars.next_back();
self.mode = Some(Mode::Edit {
index: index.saturating_sub(1),
value: chars.as_str().into()
});
}
}
pub fn edit_delete (&mut self) {
todo!()
}
}