use crate::*; mod column; pub use self::column::*; mod entry; pub use self::entry::*; mod metadata; pub use self::metadata::*; mod task; pub use self::task::*; /// The application state. pub struct Taggart { pub _root: PathBuf, pub entries: Vec, pub cursor: usize, pub offset: usize, pub column: usize, pub columns: ColumnsOption>, fn(&mut Self, usize, &str)>, pub display: Measure, pub tasks: Vec, pub mode: Option, } #[derive(Debug)] pub enum Mode { Help { page: u8 }, Edit { value: Arc, index: usize, }, Save { choice: u8, }, Quit { choice: u8, }, } impl Taggart { pub fn new (root: &impl AsRef, entries: Vec) -> Usually { Ok(Self { _root: root.as_ref().into(), cursor: 0, offset: 0, column: 2, display: Measure::new(), mode: None, columns: Columns::default(), tasks: vec![], entries, }) } /// Make sure cursor is always in view pub(crate) fn clamp (&mut self, min: usize, max: usize) { if self.cursor < min { self.offset = self.cursor; } if self.cursor > max { self.offset += self.cursor - max; } if self.offset > self.entries.len().saturating_sub(self.display.h()) { self.offset = self.entries.len().saturating_sub(self.display.h()) } if self.cursor >= self.entries.len() { self.cursor = self.entries.len().saturating_sub(1) } if self.column + 1 > self.columns.0.len() { self.column = self.columns.0.len().saturating_sub(1) } } }