This commit is contained in:
andy.boot
2025-07-07 22:19:16 +01:00
parent 9957cd3d9c
commit 5057337340
2 changed files with 91 additions and 17 deletions

View File

@@ -32,6 +32,7 @@ pub struct InitialDisplayData {
pub is_screen_reader: bool, pub is_screen_reader: bool,
pub output_format: String, pub output_format: String,
pub bars_on_right: bool, pub bars_on_right: bool,
pub selected_index: i32,
} }
pub struct DisplayData { pub struct DisplayData {
@@ -84,6 +85,16 @@ struct DrawData<'a> {
display_data: &'a DisplayData, display_data: &'a DisplayData,
} }
struct State {
test: i32,
}
impl State {
fn decrement(&mut self) {
self.test -= 1;
}
}
impl DrawData<'_> { impl DrawData<'_> {
fn get_new_indent(&self, has_children: bool, was_i_last: bool) -> String { fn get_new_indent(&self, has_children: bool, was_i_last: bool) -> String {
let chars = self.display_data.get_tree_chars(was_i_last, has_children); let chars = self.display_data.get_tree_chars(was_i_last, has_children);
@@ -175,9 +186,10 @@ pub fn draw_it(
percent_bar: first_size_bar, percent_bar: first_size_bar,
display_data: &display_data, display_data: &display_data,
}; };
let mut state = State { test: 0 };
if !skip_total { if !skip_total {
display_node(root_node, stdout, &draw_data, true, true); display_node(root_node, stdout, &draw_data, true, true, &mut state);
} else { } else {
for (count, c) in root_node for (count, c) in root_node
.get_children_from_node(draw_data.display_data.initial.is_reversed) .get_children_from_node(draw_data.display_data.initial.is_reversed)
@@ -185,7 +197,7 @@ pub fn draw_it(
{ {
let is_biggest = display_data.is_biggest(count, root_node.num_siblings()); let is_biggest = display_data.is_biggest(count, root_node.num_siblings());
let was_i_last = display_data.is_last(count, root_node.num_siblings()); let was_i_last = display_data.is_last(count, root_node.num_siblings());
display_node(c, stdout, &draw_data, is_biggest, was_i_last); display_node(c, stdout, &draw_data, is_biggest, was_i_last, &mut state);
} }
} }
} }
@@ -224,27 +236,44 @@ fn find_longest_dir_name(
.fold(longest, max) .fold(longest, max)
} }
fn recursive_child_count(node: &DisplayNode) -> i32 {
let mut total = 1;
for n in node.children.iter() {
total += recursive_child_count(&n);
}
return total;
}
fn display_node( fn display_node(
node: &DisplayNode, node: &DisplayNode,
stdout: &mut RawTerminal<Stdout>, stdout: &mut RawTerminal<Stdout>,
draw_data: &DrawData, draw_data: &DrawData,
is_biggest: bool, is_biggest: bool,
is_last: bool, is_last: bool,
state: &mut State,
) { ) {
// hacky way of working out how deep we are in the tree // hacky way of working out how deep we are in the tree
let indent = draw_data.get_new_indent(!node.children.is_empty(), is_last); let indent = draw_data.get_new_indent(!node.children.is_empty(), is_last);
let level = ((indent.chars().count() - 1) / 2) - 1; let level = ((indent.chars().count() - 1) / 2) - 1;
let bar_text = draw_data.generate_bar(node, level); let bar_text = draw_data.generate_bar(node, level);
let cnt = if draw_data.display_data.initial.is_reversed {
recursive_child_count(node)
} else {
0
};
let to_print = format_string( let to_print = format_string(
node, node,
&indent, &indent,
&bar_text, &bar_text,
is_biggest, is_biggest,
&draw_data.display_data, &draw_data.display_data,
state.test - cnt,
); );
if !draw_data.display_data.initial.is_reversed { if !draw_data.display_data.initial.is_reversed {
state.test -= 1; // works if reversed
write!(stdout, "{to_print}").unwrap() write!(stdout, "{to_print}").unwrap()
} }
@@ -262,10 +291,15 @@ fn display_node(
{ {
let is_biggest = dd.display_data.is_biggest(count, num_siblings); let is_biggest = dd.display_data.is_biggest(count, num_siblings);
let was_i_last = dd.display_data.is_last(count, num_siblings); let was_i_last = dd.display_data.is_last(count, num_siblings);
display_node(c, stdout, &dd, is_biggest, was_i_last);
display_node(c, stdout, &dd, is_biggest, was_i_last, state);
} }
if draw_data.display_data.initial.is_reversed { if draw_data.display_data.initial.is_reversed {
// for (c) in node.get_children_from_node(draw_data.display_data.initial.is_reversed){
// state.decrement();
// }
state.test -= 1;
write!(stdout, "{to_print}").unwrap() write!(stdout, "{to_print}").unwrap()
} }
} }
@@ -343,18 +377,21 @@ pub fn format_string(
bars: &str, bars: &str,
is_biggest: bool, is_biggest: bool,
display_data: &DisplayData, display_data: &DisplayData,
test: i32,
) -> String { ) -> String {
let (percent, name_and_padding) = get_name_percent(node, indent, bars, display_data); let (percent, name_and_padding) = get_name_percent(node, indent, bars, display_data);
let pretty_size = get_pretty_size(node, is_biggest, display_data); let pretty_size = get_pretty_size(node, is_biggest, display_data, test);
let pretty_name = get_pretty_name(node, name_and_padding, display_data); let pretty_name = get_pretty_name(node, name_and_padding, display_data);
let marked = get_name_if_marked(test, &pretty_name);
// we can clean this and the method below somehow, not sure yet // we can clean this and the method below somehow, not sure yet
if display_data.initial.is_screen_reader { if display_data.initial.is_screen_reader {
// if screen_reader then bars is 'depth' // if screen_reader then bars is 'depth'
format!("{pretty_name} {bars} {pretty_size}{percent}") format!("{marked} {bars} {pretty_size}{percent}")
} else if display_data.initial.by_filetime.is_some() { } else if display_data.initial.by_filetime.is_some() {
format!("{pretty_size} {indent}{pretty_name}") format!("{pretty_size} {indent}{marked}")
} else { } else {
format!("{pretty_size} {indent} {pretty_name}{percent}") format!("{pretty_size} {indent} {marked}{percent}")
} }
} }
@@ -384,13 +421,19 @@ fn get_name_percent(
} }
} }
fn get_pretty_size(node: &DisplayNode, is_biggest: bool, display_data: &DisplayData) -> String { fn get_pretty_size(
node: &DisplayNode,
is_biggest: bool,
display_data: &DisplayData,
n: i32,
) -> String {
let output = if display_data.initial.by_filecount { let output = if display_data.initial.by_filecount {
node.size.separate_with_commas() node.size.separate_with_commas()
} else if display_data.initial.by_filetime.is_some() { } else if display_data.initial.by_filetime.is_some() {
get_pretty_file_modified_time(node.size as i64) get_pretty_file_modified_time(node.size as i64)
} else { } else {
human_readable_number(node.size, &display_data.initial.output_format) // human_readable_number(n, &display_data.initial.output_format)
format!("{n}")
}; };
let spaces_to_add = display_data.num_chars_needed_on_left_most - output.chars().count(); let spaces_to_add = display_data.num_chars_needed_on_left_most - output.chars().count();
let output = " ".repeat(spaces_to_add) + output.as_str(); let output = " ".repeat(spaces_to_add) + output.as_str();
@@ -410,6 +453,24 @@ fn get_pretty_file_modified_time(timestamp: i64) -> String {
local_datetime.format("%Y-%m-%dT%H:%M:%S").to_string() local_datetime.format("%Y-%m-%dT%H:%M:%S").to_string()
} }
fn get_name_if_marked(test: i32, name: &str) -> String {
if test == -9 {
let mut new_name = String::new();
for c in name.chars() {
if c == ' ' {
new_name.push(BLOCKS[0])
// new_name.push('x')
} else {
new_name.push(c)
}
}
new_name
} else {
name.into()
// format!("{name}{:?}", {state.test})
}
}
fn get_pretty_name( fn get_pretty_name(
node: &DisplayNode, node: &DisplayNode,
name_and_padding: String, name_and_padding: String,

View File

@@ -336,13 +336,15 @@ fn main() {
is_colors, is_colors,
terminal_width, terminal_width,
&mut out, &mut out,
-1,
); );
out.flush().unwrap(); out.flush().unwrap();
let mut state = 0;
for c in stdin.events() { for c in stdin.events() {
write!( write!(
out, out,
"{}{}Dust interactive (q to quit)", "{}{}Dust interactive (q to quit) {state}",
termion::clear::All, termion::clear::All,
termion::cursor::Goto(1, 1) termion::cursor::Goto(1, 1)
) )
@@ -351,14 +353,22 @@ fn main() {
let evt = c.unwrap(); let evt = c.unwrap();
match evt { match evt {
Event::Key(Key::Char('q')) => break, Event::Key(Key::Char('q')) => break,
Event::Key(Key::Up | Key::Char('k')) => {
write!(out, "up\n").unwrap();
state -= 1;
}
Event::Key(Key::Down | Key::Char('j')) => {
write!(out, "down\n").unwrap();
state += 1;
}
Event::Key(Key::Left | Key::Char('h')) => {
write!(out, "left\n").unwrap();
}
Event::Key(Key::Right | Key::Char('l')) => {
write!(out, "right\n").unwrap();
}
Event::Key(Key::Char(x)) => { Event::Key(Key::Char(x)) => {
write!(out,"{x} key\n" ); write!(out, "{x} key\n").unwrap();
}
Event::Key(Key::Left) => {
write!(out,"left\n");
}
Event::Key(Key::Right) => {
write!(out,"right\n");
} }
_ => {} _ => {}
} }
@@ -370,6 +380,7 @@ fn main() {
is_colors, is_colors,
terminal_width, terminal_width,
&mut out, &mut out,
state,
); );
out.flush().unwrap(); out.flush().unwrap();
} }
@@ -383,6 +394,7 @@ fn print_output(
is_colors: bool, is_colors: bool,
terminal_width: usize, terminal_width: usize,
stdout: &mut RawTerminal<Stdout>, stdout: &mut RawTerminal<Stdout>,
selected_index: i32,
) { ) {
let output_format = config.get_output_format(&options); let output_format = config.get_output_format(&options);
@@ -401,6 +413,7 @@ fn print_output(
is_screen_reader: config.get_screen_reader(&options), is_screen_reader: config.get_screen_reader(&options),
output_format, output_format,
bars_on_right: config.get_bars_on_right(&options), bars_on_right: config.get_bars_on_right(&options),
selected_index: selected_index,
}; };
draw_it( draw_it(