diff options
author | qkzk <qu3nt1n@gmail.com> | 2023-12-04 23:01:29 +0100 |
---|---|---|
committer | qkzk <qu3nt1n@gmail.com> | 2023-12-04 23:01:29 +0100 |
commit | b5919d605dfd499010417bb1f23d030ad6f84b83 (patch) | |
tree | ef7ff8d056fd73b0d60ce38a5e948ecde9a1c51e | |
parent | 53439a734d7267fdcad797d53b208590ae113139 (diff) |
WIP: first step at remaking tree content
-rw-r--r-- | src/io/display.rs | 50 | ||||
-rw-r--r-- | src/modes/display/mod.rs | 2 | ||||
-rw-r--r-- | src/modes/display/preview.rs | 1 | ||||
-rw-r--r-- | src/modes/display/tree.rs | 87 |
4 files changed, 135 insertions, 5 deletions
diff --git a/src/io/display.rs b/src/io/display.rs index f045fb2..0f34162 100644 --- a/src/io/display.rs +++ b/src/io/display.rs @@ -17,7 +17,6 @@ use crate::common::{ }; use crate::io::read_last_log_line; use crate::log_info; -use crate::modes::calculate_top_bottom; use crate::modes::fileinfo_attr; use crate::modes::parse_input_mode; use crate::modes::BinaryContent; @@ -40,6 +39,7 @@ use crate::modes::Trash; use crate::modes::TreePreview; use crate::modes::Ueberzug; use crate::modes::Window; +use crate::modes::{calculate_top_bottom, TreeLineMaker}; /// Iter over the content, returning a triplet of `(index, line, attr)`. macro_rules! enumerated_colored_iter { @@ -288,21 +288,63 @@ impl<'a> WinMain<'a> { 3 }; let height = canvas.height()?; - let (selected_index, content) = self.tab.tree.into_navigable_content(&self.tab.users); + let (selected_index, content) = self.tab.tree.content(&self.tab.users); + // let (selected_index, content) = self.tab.tree.into_navigable_content(&self.tab.users); let (top, bottom) = calculate_top_bottom(selected_index, height); let length = content.len(); - for (index, triplet) in content + // for (index, triplet) in content + for (index, wonder) in content .iter() .enumerate() .skip(top) .take(min(length, bottom + 1)) { - self.draw_tree_line(canvas, left_margin, top, index, triplet, height)?; + // self.draw_tree_line(canvas, left_margin, top, index, triplet, height)?; + self.draw_tree_maker(canvas, left_margin, top, index, wonder, height)?; } Ok(selected_index) } + fn draw_tree_maker( + &self, + canvas: &mut dyn Canvas, + left_margin: usize, + top: usize, + index: usize, + wonder: &TreeLineMaker, + height: usize, + ) -> Result<()> { + let row = index + ContentWindow::WINDOW_MARGIN_TOP - top; + if row > height { + return Ok(()); + } + + let s_metadata = wonder.metadata(); + let s_prefix = wonder.prefix(); + let mut attr = wonder.attr(); + let path = wonder.path(); + + self.print_as_flagged(canvas, row, &path, &mut attr)?; + + let col_metadata = if self.status.display_settings.metadata { + canvas.print_with_attr(row, left_margin, &s_metadata, attr)? + } else { + 0 + }; + + let offset = if index == 0 { 1 } else { 0 }; + let col_tree_prefix = canvas.print(row, left_margin + col_metadata + offset, s_prefix)?; + + canvas.print_with_attr( + row, + left_margin + col_metadata + col_tree_prefix + offset, + &wonder.format_fileline(), + attr, + )?; + Ok(()) + } + fn draw_tree_line( &self, canvas: &mut dyn Canvas, diff --git a/src/modes/display/mod.rs b/src/modes/display/mod.rs index 8fe4e03..a8c8059 100644 --- a/src/modes/display/mod.rs +++ b/src/modes/display/mod.rs @@ -17,5 +17,5 @@ pub use preview::{ TextKind, TreePreview, Ueberzug, Window, }; pub use skim::{print_ansi_str, Skimer}; -pub use tree::{calculate_top_bottom, ColoredString, Go, Node, To, Tree}; +pub use tree::{calculate_top_bottom, ColoredString, Go, Node, To, Tree, TreeLineMaker}; pub use users::Users; diff --git a/src/modes/display/preview.rs b/src/modes/display/preview.rs index ef8c386..8d6938f 100644 --- a/src/modes/display/preview.rs +++ b/src/modes/display/preview.rs @@ -20,6 +20,7 @@ use crate::common::{ }; use crate::log_info; use crate::modes::ContentWindow; +use crate::modes::Node; use crate::modes::Users; use crate::modes::{ColorEffect, FileInfo, FileKind}; use crate::modes::{ColoredString, Tree}; diff --git a/src/modes/display/tree.rs b/src/modes/display/tree.rs index 0435359..0f0dab3 100644 --- a/src/modes/display/tree.rs +++ b/src/modes/display/tree.rs @@ -673,6 +673,46 @@ impl Tree { stack.push((other_prefix.clone(), leaf)); } } + + pub fn content(&self, users: &Users) -> (usize, Vec<TreeLineMaker>) { + let mut stack = vec![("".to_owned(), self.root_path.borrow())]; + let mut content = vec![]; + let mut selected_index = 0; + + while let Some((prefix, path)) = stack.pop() { + let Some(node) = self.nodes.get(path) else { + continue; + }; + + if node.selected { + selected_index = content.len(); + } + + let Ok(fileinfo) = FileInfo::new(path, users) else { + continue; + }; + + content.push( + TreeLineMaker::new(&fileinfo, &prefix, node, path), + // <ColoredTriplet as MakeTriplet>::make( + // &fileinfo, + // &prefix, + // filename_format(path, node), + // ColorEffect::node(&fileinfo, node.selected()), + // path, + // ) + ); + + if node.have_children() { + Self::stack_children(&mut stack, prefix, node); + } + + if content.len() > self.required_height { + break; + } + } + (selected_index, content) + } } #[inline] @@ -732,3 +772,50 @@ fn path_filename_contains(path: &Path, pattern: &str) -> bool { .to_string_lossy() .contains(pattern) } + +pub struct TreeLineMaker<'a> { + node: &'a Node, + prefix: std::rc::Rc<str>, + path: std::rc::Rc<Path>, + color_effect: ColorEffect, + metadata: String, +} + +impl<'a> TreeLineMaker<'a> { + fn new(fileinfo: &FileInfo, prefix: &str, node: &'a Node, path: &Path) -> Self { + let color_effect = ColorEffect::node(fileinfo, node.selected()); + let prefix = Rc::from(prefix); + let path = Rc::from(path); + let metadata = fileinfo + .format_no_filename() + .unwrap_or_else(|_| "?".repeat(19)); + + Self { + node, + prefix, + path, + color_effect, + metadata, + } + } + + pub fn format_fileline(&self) -> String { + filename_format(&self.path, &self.node) + } + + pub fn attr(&self) -> tuikit::attr::Attr { + self.color_effect.attr() + } + + pub fn prefix(&self) -> &str { + self.prefix.borrow() + } + + pub fn path(&self) -> &Path { + self.path.borrow() + } + + pub fn metadata(&self) -> &str { + self.metadata.as_str() + } +} |