summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2023-12-04 23:01:29 +0100
committerqkzk <qu3nt1n@gmail.com>2023-12-04 23:01:29 +0100
commitb5919d605dfd499010417bb1f23d030ad6f84b83 (patch)
treeef7ff8d056fd73b0d60ce38a5e948ecde9a1c51e
parent53439a734d7267fdcad797d53b208590ae113139 (diff)
WIP: first step at remaking tree content
-rw-r--r--src/io/display.rs50
-rw-r--r--src/modes/display/mod.rs2
-rw-r--r--src/modes/display/preview.rs1
-rw-r--r--src/modes/display/tree.rs87
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()
+ }
+}