diff --git a/Justfile b/Justfile index 5839620..14fe25d 100644 --- a/Justfile +++ b/Justfile @@ -16,3 +16,5 @@ doc: build-release: time cargo build -j4 --release +run: + cargo run -- -j16 ~/Music diff --git a/src/view.rs b/src/view.rs index 6e5de31..bfa2e9f 100644 --- a/src/view.rs +++ b/src/view.rs @@ -1,5 +1,6 @@ use crate::*; use tengri::tui::ratatui::{style::{Color, Style}, prelude::Stylize}; +use std::sync::atomic::{AtomicU16, Ordering::Relaxed}; pub(crate) use pad::PadStr; mod column; pub use self::column::*; @@ -18,58 +19,46 @@ impl Content for Taggart { struct TreeTable<'a>(&'a Taggart); impl<'a> Content for TreeTable<'a> { - fn content (&self) -> impl Render { + fn render (&self, to: &mut TuiOut) { + let area = to.area(); let Taggart { offset, paths, cursor, column, .. } = self.0; - let mut dy = 0; - let offset = *offset; - let height = self.0.size.h(); - Map::new( - move||offset..(offset + height), - move|row, y: usize|{ - let mut dx = 0; - map_south(y as u16, 1, Map::new( - move||self.0.columns.0.iter(), - move|column: &Column<_>, x: usize|{ - dx = dx + column.width; - map_east((dx - column.width) as u16, 1, "test") + let (x, w) = self.0.columns.xw(*column); + to.fill_bg([area.x() + x, area.y(), w, area.h()], Color::Rgb(0, 0, 0)); + for (i, y) in area.iter_y().enumerate() { + let i_offset = i + offset; + let selected = *cursor == i_offset; + let mut x = area.x(); + if let Some(entry) = paths.get(i_offset) { + for (index, _fragment) in entry.path.iter().enumerate() { + if index == entry.depth - 1 { + let _cursor = if selected { ">" } else { " " }; + to.area[1] = y; + for Column { width, value, .. } in self.0.columns.0.iter() { + to.area[0] = x; + if let Some(value) = value(entry) { + Content::render(&TrimStringRef(*width as u16, &value), to); + } + x += *width as u16; + } + if selected { + let fill = [area.x(), y, area.w(), 1]; + to.fill_fg(fill, Color::Rgb(0, 0, 0)); + to.fill_bg(fill, Color::Rgb(192, 128, 0)); + let fill = [area.x() + x as u16, y, w, 1]; + to.fill_bg(fill, Color::Rgb(224, 192, 0)); + if let Some((_index, value)) = &self.0.editing { + let x = area.x() + if x > 0 { x + 1 } else { x } as u16; + to.blit(&value, x, y, None) + } + } } - )) - }) + } + } else { + break + } + } + to.area = area; } - - //fn render (&self, to: &mut TuiOut) { - ////let area = to.area(); - ////let Taggart { offset, paths, cursor, column, .. } = self.0; - ////let (x, w) = self.0.columns.xw(*column); - ////to.fill_bg([area.x() + x, area.y(), w, area.h()], Color::Rgb(0, 0, 0)); - ////for (i, y) in area.iter_y().enumerate() { - ////let i_offset = i + offset; - ////let selected = *cursor == i_offset; - ////if let Some(entry) = paths.get(i_offset) { - ////for (index, _fragment) in entry.path.iter().enumerate() { - ////if index == entry.depth - 1 { - ////let _cursor = if selected { ">" } else { " " }; - ////let label = self.0.columns.row_content(&entry); - //////Content::render(&label) - ////to.blit(&label, area.x(), y, entry.style()); - ////if selected { - ////let fill = [area.x(), y, area.w(), 1]; - ////to.fill_fg(fill, Color::Rgb(0, 0, 0)); - ////to.fill_bg(fill, Color::Rgb(192, 128, 0)); - ////let fill = [area.x() + x as u16, y, w, 1]; - ////to.fill_bg(fill, Color::Rgb(224, 192, 0)); - ////if let Some((_index, value)) = &self.0.editing { - ////let x = area.x() + if x > 0 { x + 1 } else { x } as u16; - ////to.blit(&value, x, y, None) - ////} - ////} - ////} - ////} - ////} else { - ////break - ////} - ////} - //} } impl Entry {