From 870bf249d84487419d2becc52b596d418b3b21bc Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 24 Mar 2025 03:37:36 +0200 Subject: [PATCH] add edit modes --- src/keys.rs | 47 +++++++++++++++++++++++++++-------------------- src/model.rs | 19 +++++++++++++++++-- src/view.rs | 15 ++++++++------- src/view/table.rs | 2 +- 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index 735d997..f21f9dc 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -25,7 +25,16 @@ impl Handle for Taggart { let x_min = self.offset; let x_max = self.offset + self.display.h().saturating_sub(1); let event = &*input.event(); - match &self.editing { + match &self.mode { + Some(Mode::Edit { .. }) => 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(), + _ => {} + }, None => match event { press!(Char('q')) => { input.done() }, press!(Up) => { self.cursor = self.cursor.saturating_sub(1); }, @@ -40,16 +49,8 @@ impl Handle for Taggart { press!(Char('[')) => { self.columns.0[self.column].width = self.columns.0[self.column].width.saturating_sub(1).max(5); } _ => {} - }, - Some(_value) => 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(), - _ => {} - }, + } + _ => todo!("{:?}", self.mode) } if self.cursor < x_min { self.offset = self.cursor; @@ -77,32 +78,38 @@ impl Taggart { { let value = (column.getter)(&self.entries[self.cursor]); let value = format!("{}", value.unwrap_or_default()); - self.editing = Some((value.len(), value)); + self.mode = Some(Mode::Edit { index: value.len(), value }); } } pub fn edit_cancel (&mut self) { - self.editing = None; + self.mode = None; } pub fn edit_confirm (&mut self) { - if let Some((_edit_index, value)) = &self.editing + if let Some(Mode::Edit { value, .. }) = &self.mode && let Some(column) = self.columns.0.get(self.column) && let Some(setter) = &column.setter && self.entries.get_mut(self.cursor).is_some() { - setter(self.entries.as_mut_slice(), self.cursor, value) + setter(self.entries.as_mut_slice(), self.cursor, value); + self.mode = None; } - self.editing = None; } pub fn edit_insert (&mut self, c: char) { - if let Some((edit_index, value)) = &mut self.editing { - self.editing = Some((*edit_index + 1, format!("{value}{c}"))); + if let Some(Mode::Edit { value, index }) = &self.mode { + self.mode = Some(Mode::Edit { + index: *index + 1, + value: format!("{value}{c}") + }); } } pub fn edit_backspace (&mut self) { - if let Some((edit_index, value)) = &mut self.editing { + if let Some(Mode::Edit { value, index }) = &self.mode { let mut chars = value.chars(); chars.next_back(); - self.editing = Some((edit_index.saturating_sub(1), chars.as_str().into())); + self.mode = Some(Mode::Edit { + index: index.saturating_sub(1), + value: chars.as_str().into() + }); } } pub fn edit_delete (&mut self) { diff --git a/src/model.rs b/src/model.rs index 473ad3c..565e53f 100644 --- a/src/model.rs +++ b/src/model.rs @@ -14,8 +14,23 @@ pub struct Taggart { pub column: usize, pub columns: ColumnsOption>, fn(&mut [Entry], usize, &str)>, pub display: Measure, - pub editing: Option<(usize, String)>, pub tasks: Vec, + pub mode: Option, +} + +#[derive(Debug)] +pub enum Mode { + Help, + Edit { + value: String, + index: usize, + }, + Apply { + value: bool, + }, + Unsaved { + value: u8 + }, } impl Taggart { @@ -26,7 +41,7 @@ impl Taggart { offset: 0, column: 2, display: Measure::new(), - editing: None, + mode: None, columns: Columns::default(), tasks: vec![], entries, diff --git a/src/view.rs b/src/view.rs index df9dadd..fde0217 100644 --- a/src/view.rs +++ b/src/view.rs @@ -34,13 +34,14 @@ impl Content for Taggart { Color::Rgb(0, 0, 0), Color::Rgb(192, 192, 192), Fill::x(Bsp::a( - Fill::x(Align::w(Tui::bold(true, if self.editing.is_some() { - Bsp::e( - Tui::bg(Self::BG_EDIT, Tui::fg(Self::FG_EDIT, " EDIT ")), - " Esc: cancel, Enter: set value" - ) - } else { - Bsp::e( + Fill::x(Align::w(Tui::bold(true, match self.mode { + Some(Mode::Edit { .. }) => { + Bsp::e( + Tui::bg(Self::BG_EDIT, Tui::fg(Self::FG_EDIT, " EDIT ")), + " Esc: cancel, Enter: set value" + ) + }, + _ => Bsp::e( Tui::bg(Self::BG_BROWSE, Tui::fg(Self::FG_BROWSE, " BROWSE ")), " Q: exit, Arrows: select, Space: open, Enter: edit" ) diff --git a/src/view/table.rs b/src/view/table.rs index 314216c..1da0282 100644 --- a/src/view/table.rs +++ b/src/view/table.rs @@ -63,7 +63,7 @@ impl<'a> TreeTable<'a> { .. }) in self.0.columns.0.iter().enumerate() { to.area[0] = *x; - if let Some((edit_index, value)) = self.0.editing.as_ref() + if let Some(Mode::Edit { index: edit_index, value }) = self.0.mode.as_ref() && self.0.column == column_index && self.0.cursor == cursor {