mirror of
https://codeberg.org/unspeaker/perch.git
synced 2025-12-06 09:36:42 +01:00
factor input handling into modes
This commit is contained in:
parent
648c37e9d4
commit
48f651fc0f
5 changed files with 115 additions and 74 deletions
66
src/keys/edit.rs
Normal file
66
src/keys/edit.rs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
use crate::*;
|
||||
|
||||
impl Taggart {
|
||||
pub fn mode_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!()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue