diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-20 20:55:51 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-20 21:03:31 -0400 |
commit | 0b5f098109c3dc8c488d5d8e6eee06e278f2ce4e (patch) | |
tree | 7343384029ae1f90c61a10379d2cf7cea4208f15 | |
parent | cf660136ea43e0a463fd270bfdaf8bb3ee606d9d (diff) |
fix file sizes not appearing when filename too long
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 68 |
1 files changed, 36 insertions, 32 deletions
diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index 2c0337d..ab62176 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -90,8 +90,13 @@ fn print_entry( }; let left_label_original = entry.label(); let right_label_original = format!(" {}{}", symlink_string, size_string); - let (left_label, right_label) = - factor_labels_for_entry(left_label_original, right_label_original, drawing_width); + + let (left_label, right_label) = factor_labels_for_entry( + left_label_original, + right_label_original.as_str(), + drawing_width, + ); + let right_width = right_label.width(); buf.set_stringn(x, y, left_label, drawing_width, style); buf.set_stringn( @@ -103,30 +108,29 @@ fn print_entry( ); } -fn factor_labels_for_entry( - left_label_original: &str, - right_label_original: String, +fn factor_labels_for_entry<'a>( + left_label_original: &'a str, + right_label_original: &'a str, drawing_width: usize, -) -> (String, String) { - let left_width_remainder = drawing_width as i32 - right_label_original.width() as i32; - let width_remainder = left_width_remainder as i32 - left_label_original.width() as i32; +) -> (String, &'a str) { + let left_label_original_width = left_label_original.width(); + let right_label_original_width = right_label_original.width(); + + if drawing_width < right_label_original_width { + return (ELLIPSIS.to_string(), ""); + } + + let left_width_remainder = drawing_width as i32 - right_label_original_width as i32; + let width_remainder = left_width_remainder as i32 - left_label_original_width as i32; if width_remainder >= 0 { - ( - left_label_original.to_string(), - right_label_original.to_string(), - ) + (left_label_original.to_string(), right_label_original) } else { - if left_label_original.width() <= drawing_width { - (left_label_original.to_string(), "".to_string()) - } else if left_width_remainder < MIN_LEFT_LABEL_WIDTH { - ( - trim_file_label(left_label_original, drawing_width), - "".to_string(), - ) + if left_label_original_width + right_label_original_width <= drawing_width { + (left_label_original.to_string(), "") } else { ( trim_file_label(left_label_original, left_width_remainder as usize), - right_label_original.to_string(), + right_label_original, ) } } @@ -151,7 +155,7 @@ pub fn trim_file_label(name: &str, drawing_width: usize) -> String { // file ext does not fit ELLIPSIS.to_string() } else if ext_width == drawing_width { - extension.to_string().replacen('.', ELLIPSIS, 1) + extension.replacen('.', ELLIPSIS, 1).to_string() } else { let stem_width = drawing_width - ext_width; let truncated_stem = stem.trunc(stem_width - 1); @@ -162,15 +166,15 @@ pub fn trim_file_label(name: &str, drawing_width: usize) -> String { #[cfg(test)] mod test_factor_labels { - use super::{factor_labels_for_entry, MIN_LEFT_LABEL_WIDTH}; + use super::{factor_labels_for_entry, ELLIPSIS, MIN_LEFT_LABEL_WIDTH}; #[test] fn both_labels_empty_if_drawing_width_zero() { let left = "foo.ext"; let right = "right"; assert_eq!( - ("".to_string(), "".to_string()), - factor_labels_for_entry(left, right.to_string(), 0) + (ELLIPSIS.to_string(), ""), + factor_labels_for_entry(left, right, 0) ); } @@ -179,8 +183,8 @@ mod test_factor_labels { let left = "foo.ext"; let right = "right"; assert_eq!( - (left.to_string(), right.to_string()), - factor_labels_for_entry(left, right.to_string(), 20) + (left.to_string(), right), + factor_labels_for_entry(left, right, 20) ); } @@ -189,8 +193,8 @@ mod test_factor_labels { let left = "foo.ext"; let right = "right"; assert_eq!( - (left.to_string(), right.to_string()), - factor_labels_for_entry(left, right.to_string(), 12) + (left.to_string(), right), + factor_labels_for_entry(left, right, 12) ); } @@ -200,8 +204,8 @@ mod test_factor_labels { let right = "right"; assert!(left.chars().count() as i32 == MIN_LEFT_LABEL_WIDTH); assert_eq!( - (left.to_string(), "".to_string()), - factor_labels_for_entry(left, right.to_string(), MIN_LEFT_LABEL_WIDTH as usize) + ("fooba….ext".to_string(), "right"), + factor_labels_for_entry(left, right, MIN_LEFT_LABEL_WIDTH as usize) ); } @@ -211,10 +215,10 @@ mod test_factor_labels { let right = "right"; assert!(left.chars().count() as i32 > MIN_LEFT_LABEL_WIDTH + right.chars().count() as i32); assert_eq!( - ("foobarbazf….ext".to_string(), right.to_string()), + ("foobarbazf….ext".to_string(), right), factor_labels_for_entry( left, - right.to_string(), + right, MIN_LEFT_LABEL_WIDTH as usize + right.chars().count() ) ); |