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!() } }