This commit is contained in:
andy.boot
2025-06-06 22:13:11 +01:00
parent 76b9f32859
commit a78c80ac1c
4 changed files with 109 additions and 19 deletions
Generated
+35
View File
@@ -344,6 +344,7 @@ dependencies = [
"sysinfo", "sysinfo",
"tempfile", "tempfile",
"terminal_size", "terminal_size",
"termion",
"thousands", "thousands",
"unicode-width", "unicode-width",
"winapi-util", "winapi-util",
@@ -486,6 +487,7 @@ checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.1",
"libc", "libc",
"redox_syscall",
] ]
[[package]] [[package]]
@@ -562,6 +564,12 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "numtoa"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f"
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.21.3" version = "1.21.3"
@@ -657,6 +665,21 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "redox_syscall"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags 2.9.1",
]
[[package]]
name = "redox_termios"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb"
[[package]] [[package]]
name = "redox_users" name = "redox_users"
version = "0.4.6" version = "0.4.6"
@@ -841,6 +864,18 @@ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "termion"
version = "4.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3669a69de26799d6321a5aa713f55f7e2cd37bd47be044b50f2acafc42c122bb"
dependencies = [
"libc",
"libredox",
"numtoa",
"redox_termios",
]
[[package]] [[package]]
name = "termtree" name = "termtree"
version = "0.5.1" version = "0.5.1"
+1
View File
@@ -43,6 +43,7 @@ directories = "4"
sysinfo = "0.27" sysinfo = "0.27"
ctrlc = "3.4" ctrlc = "3.4"
chrono = "0.4" chrono = "0.4"
termion="4"
[target.'cfg(not(target_has_atomic = "64"))'.dependencies] [target.'cfg(not(target_has_atomic = "64"))'.dependencies]
portable-atomic = "1.4" portable-atomic = "1.4"
+15 -7
View File
@@ -4,14 +4,17 @@ use crate::node::FileTime;
use ansi_term::Colour::Red; use ansi_term::Colour::Red;
use lscolors::{LsColors, Style}; use lscolors::{LsColors, Style};
use termion::raw::RawTerminal;
use unicode_width::UnicodeWidthStr; use unicode_width::UnicodeWidthStr;
use stfu8::encode_u8; use stfu8::encode_u8;
use std::io::{Write};
use chrono::{DateTime, Local, TimeZone, Utc}; use chrono::{DateTime, Local, TimeZone, Utc};
use std::cmp::max; use std::cmp::max;
use std::cmp::min; use std::cmp::min;
use std::fs; use std::fs;
use std::io::Stdout;
use std::iter::repeat_n; use std::iter::repeat_n;
use std::path::Path; use std::path::Path;
use thousands::Separable; use thousands::Separable;
@@ -129,6 +132,7 @@ pub fn draw_it(
no_percent_bars: bool, no_percent_bars: bool,
terminal_width: usize, terminal_width: usize,
skip_total: bool, skip_total: bool,
stdout: &mut RawTerminal<Stdout>,
) { ) {
let num_chars_needed_on_left_most = if idd.by_filecount { let num_chars_needed_on_left_most = if idd.by_filecount {
let max_size = root_node.size; let max_size = root_node.size;
@@ -143,6 +147,8 @@ pub fn draw_it(
terminal_width > num_chars_needed_on_left_most + 2, terminal_width > num_chars_needed_on_left_most + 2,
"Not enough terminal width" "Not enough terminal width"
); );
// write!(stdout, "{}{}Hello!", termion::clear::All, termion::cursor::Goto(1, 1)).unwrap();
// write!(stdout, "{}", termion::cursor::Goto(2, 1)).unwrap();
let allowed_width = terminal_width - num_chars_needed_on_left_most - 2; let allowed_width = terminal_width - num_chars_needed_on_left_most - 2;
let num_indent_chars = 3; let num_indent_chars = 3;
@@ -171,7 +177,7 @@ pub fn draw_it(
}; };
if !skip_total { if !skip_total {
display_node(root_node, &draw_data, true, true); display_node(root_node, stdout, &draw_data, true, true);
} 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)
@@ -179,7 +185,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, &draw_data, is_biggest, was_i_last); display_node(c, stdout, &draw_data, is_biggest, was_i_last);
} }
} }
} }
@@ -218,16 +224,18 @@ fn find_longest_dir_name(
.fold(longest, max) .fold(longest, max)
} }
fn display_node(node: &DisplayNode, draw_data: &DrawData, is_biggest: bool, is_last: bool) { fn display_node(node: &DisplayNode,
stdout: &mut RawTerminal<Stdout>,
draw_data: &DrawData, is_biggest: bool, is_last: bool) {
// 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 to_print = format_string(node, &indent, &bar_text, is_biggest, draw_data.display_data); let to_print = format_string(node, &indent, &bar_text, is_biggest, &draw_data.display_data);
if !draw_data.display_data.initial.is_reversed { if !draw_data.display_data.initial.is_reversed {
println!("{to_print}") write!(stdout, "{to_print}").unwrap()
} }
let dd = DrawData { let dd = DrawData {
@@ -244,11 +252,11 @@ fn display_node(node: &DisplayNode, draw_data: &DrawData, is_biggest: bool, is_l
{ {
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, &dd, is_biggest, was_i_last); display_node( c, stdout, &dd, is_biggest, was_i_last);
} }
if draw_data.display_data.initial.is_reversed { if draw_data.display_data.initial.is_reversed {
println!("{to_print}") write!(stdout, "{to_print}").unwrap()
} }
} }
+56 -10
View File
@@ -20,10 +20,14 @@ use display::InitialDisplayData;
use filter::AggregateData; use filter::AggregateData;
use progress::PIndicator; use progress::PIndicator;
use regex::Error; use regex::Error;
use termion::raw::RawTerminal;
use std::collections::HashSet; use std::collections::HashSet;
use std::env; use std::env;
use std::fs::read_to_string; use std::fs::read_to_string;
use std::io; use std::io;
use std::io::stdin;
use std::io::stdout;
use std::io::Stdout;
use std::panic; use std::panic;
use std::process; use std::process;
use std::sync::Arc; use std::sync::Arc;
@@ -31,6 +35,11 @@ use std::sync::Mutex;
use sysinfo::{System, SystemExt}; use sysinfo::{System, SystemExt};
use utils::canonicalize_absolute_path; use utils::canonicalize_absolute_path;
use termion::event::{Key, Event};
use termion::input::{TermRead};
use termion::raw::IntoRawMode;
use std::io::{Write};
use self::display::draw_it; use self::display::draw_it;
use config::get_config; use config::get_config;
use dir_walker::walk_it; use dir_walker::walk_it;
@@ -309,24 +318,60 @@ fn main() {
let print_errors = config.get_print_errors(&options); let print_errors = config.get_print_errors(&options);
print_any_errors(print_errors, walk_data.errors); print_any_errors(print_errors, walk_data.errors);
let stdin = stdin();
let mut out = stdout().into_raw_mode().unwrap();
write!(out, "{}{}Dust interactive (q to quit)", termion::clear::All, termion::cursor::Goto(1, 1)).unwrap();
write!(out, "{}", termion::cursor::Goto(1, 2)).unwrap();
print_output( print_output(
config, &config,
options, &options,
tree, &tree,
walk_data.by_filecount,
is_colors, is_colors,
terminal_width, terminal_width,
) &mut out,
}); );
out.flush().unwrap();
for c in stdin.events() {
write!(out, "{}{}Dust interactive (q to quit)", termion::clear::All, termion::cursor::Goto(1, 1)).unwrap();
write!(out, "{}", termion::cursor::Goto(1, 2)).unwrap();
let evt = c.unwrap();
match evt {
Event::Key(Key::Char('q')) => break,
Event::Key(Key::Char(x)) => {
// println!("{}key ", x);
},
Event::Key(Key::Left) =>{
// println!("left ");
}
Event::Key(Key::Right) =>{
// println!("right ");
},
_ => {}
}
print_output(
&config,
&options,
&tree,
is_colors,
terminal_width,
&mut out,
);
out.flush().unwrap();
}
} }
fn print_output( fn print_output(
config: Config, config: &Config,
options: Cli, options: &Cli,
tree: DisplayNode, tree: &DisplayNode,
by_filecount: bool,
is_colors: bool, is_colors: bool,
terminal_width: usize, terminal_width: usize,
stdout: &mut RawTerminal<Stdout>
) { ) {
let output_format = config.get_output_format(&options); let output_format = config.get_output_format(&options);
@@ -353,6 +398,7 @@ fn print_output(
config.get_no_bars(&options), config.get_no_bars(&options),
terminal_width, terminal_width,
config.get_skip_total(&options), config.get_skip_total(&options),
stdout,
) )
} }
} }