From 004cf96c2e9463fe2983afdca9ffc09375077585 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 6 Apr 2025 23:38:23 +0300 Subject: [PATCH] add stylers; dim column separators; shrink columns; refactor handlers --- src/keys.rs | 32 ++++++++++++++++++-------------- src/model.rs | 10 ++++++++-- src/model/column.rs | 31 +++++++++++++++++++++---------- src/model/entry.rs | 35 ++++++++++++++++++++--------------- src/view/table.rs | 5 +++-- 5 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/keys.rs b/src/keys.rs index 4733618..d2b0bdf 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -39,18 +39,19 @@ impl Handle for Taggart { press!(F(1)) => { self.help_begin() }, press!(Char('q')) => { self.quit_begin(&input) }, press!(Char('w')) => { self.save_begin() }, - press!(Enter) => { self.edit_begin() }, - press!(Up) => { self.cursor = self.cursor.saturating_sub(1); }, - press!(Down) => { self.cursor = self.cursor + 1; }, - press!(PageUp) => { self.cursor = self.cursor.saturating_sub(PAGE_SIZE); }, - press!(PageDown) => { self.cursor += PAGE_SIZE; }, - press!(Char(' ')) => { self.open_in_player()?; }, - press!(Left) => { self.column_prev(); }, - press!(Right) => { self.column_next(); }, - press!(Char('[')) => { self.column_resize(-1); }, - press!(Char(']')) => { self.column_resize( 1); }, + press!(Up) => { self.cursor_select(-1); }, + press!(Down) => { self.cursor_select( 1); }, + press!(PageUp) => { self.cursor_select(-(PAGE_SIZE as isize)); }, + press!(PageDown) => { self.cursor_select( PAGE_SIZE as isize); }, + press!(Left) => { self.column_select(-1); }, + press!(Right) => { self.column_select( 1); }, + press!(Char('[')) => { self.column_resize(-1); }, + press!(Char(']')) => { self.column_resize( 1); }, press!(Char('{')) => { self.column_collapse(true, 1); }, press!(Char('}')) => { self.column_collapse(false, -1); }, + press!(Delete) => { self.clear() }, + press!(Enter) => { self.edit_begin() }, + press!(Char(' ')) => { self.open_in_player()?; }, _ => {} }, } @@ -60,15 +61,18 @@ impl Handle for Taggart { } impl Taggart { + fn clear (&self) { + todo!("clear") + } fn open_in_player (&self) -> Usually<()> { open(self.entries[self.cursor].path.as_ref())?; Ok(()) } - fn column_prev (&mut self) { - self.column = self.column.saturating_sub(1); + fn cursor_select (&mut self, amount: isize) { + self.cursor = ((self.cursor as isize) + amount).max(0) as usize; } - fn column_next (&mut self) { - self.column = self.column + 1; + fn column_select (&mut self, amount: isize) { + self.column = ((self.column as isize) + amount).max(0) as usize; } fn column_resize (&mut self, amount: isize) { let column = &mut self.columns.0[self.column]; diff --git a/src/model.rs b/src/model.rs index ccd7184..382f19d 100644 --- a/src/model.rs +++ b/src/model.rs @@ -1,4 +1,5 @@ use crate::*; +use crate::ratatui::style::Style; mod column; pub use self::column::*; mod entry; pub use self::entry::*; @@ -10,12 +11,17 @@ pub struct Taggart { pub cursor: usize, pub offset: usize, pub column: usize, - pub columns: ColumnsOption>, fn(&mut Self, usize, &str)>, pub display: Measure, /// State of modal dialog of editing field pub mode: Option, /// Count of changes to items - pub changes: usize, + pub changes: usize, + /// Table columns to display + pub columns: Columns< + fn(&Entry)->Option>, + fn(&mut Self, usize, &str), + fn(&Entry)->Option