Don’t produce extra column sometimes with long grid + header

The number of necessary columns was computed by producing a grid in different sizes and see if all columns were used. However, if there was two files and we tried to fit them in a 3-column grid, it would produces three headers and all three columns would be used; when trying a 4-column grid, the two supplementary headers would fill the third column and the fourth would be empty; so 3 columns would be used.

Now, when the grid fits into the terminal and the number of columns is exactly the number of files to display, it returns immediately instead of trying bigger grids.

Fixes GH-436.
This commit is contained in:
ariasuni 2021-01-10 16:52:49 +01:00
parent 73e43c0700
commit 0f414cf0b9
4 changed files with 39 additions and 7 deletions

View File

@ -157,7 +157,11 @@ impl<'a> Render<'a> {
.map(|file| self.file_style.for_file(file, self.theme).paint().promote()) .map(|file| self.file_style.for_file(file, self.theme).paint().promote())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let mut last_working_table = self.make_grid(1, options, &file_names, rows.clone(), &drender); let mut last_working_grid = self.make_grid(1, options, &file_names, rows.clone(), &drender);
if file_names.len() == 1 {
return Some((last_working_grid, 1));
}
// If we cant fit everything in a grid 100 columns wide, then // If we cant fit everything in a grid 100 columns wide, then
// something has gone seriously awry // something has gone seriously awry
@ -166,23 +170,26 @@ impl<'a> Render<'a> {
let the_grid_fits = { let the_grid_fits = {
let d = grid.fit_into_columns(column_count); let d = grid.fit_into_columns(column_count);
d.is_complete() && d.width() <= self.console_width d.width() <= self.console_width
}; };
if the_grid_fits { if the_grid_fits {
last_working_table = grid; if column_count == file_names.len() {
} return Some((grid, column_count));
else { } else {
last_working_grid = grid;
}
} else {
// If weve figured out how many columns can fit in the users // If weve figured out how many columns can fit in the users
// terminal, and it turns out there arent enough rows to // terminal, and it turns out there arent enough rows to
// make it worthwhile, then just resort to the lines view. // make it worthwhile, then just resort to the lines view.
if let RowThreshold::MinimumRows(thresh) = self.row_threshold { if let RowThreshold::MinimumRows(thresh) = self.row_threshold {
if last_working_table.fit_into_columns(column_count - 1).row_count() < thresh { if last_working_grid.fit_into_columns(column_count - 1).row_count() < thresh {
return None; return None;
} }
} }
return Some((last_working_table, column_count - 1)); return Some((last_working_grid, column_count - 1));
} }
} }

View File

@ -76,3 +76,24 @@ stdout = { file = "outputs/files_paths_long_grid_3col.ansitxt" }
stderr = { empty = true } stderr = { empty = true }
status = 0 status = 0
tags = [ 'env', 'long', 'grid' ] tags = [ 'env', 'long', 'grid' ]
# check if exa is using the minimum number of columns with headers
[[cmd]]
name = "COLUMN=200 exa -lGh with one file dont produce extra columns even if there place for more"
shell = "exa -lGh /testcases/files/10_bytes"
environment = { COLUMNS = "200" }
stdout = { file = "outputs/files_paths_long_grid_header_1file.ansitxt" }
stderr = { empty = true }
status = 0
tags = [ 'env', 'long', 'grid' ]
[[cmd]]
name = "COLUMN=200 exa -lGh with several files dont produce extra columns even if there place for more"
shell = "exa -lGh /testcases/files/10_{bytes,KiB}"
environment = { COLUMNS = "200" }
stdout = { file = "outputs/files_paths_long_grid_header_2files.ansitxt" }
stderr = { empty = true }
status = 0
tags = [ 'env', 'long', 'grid' ]

View File

@ -0,0 +1,2 @@
Permissions Size User Date Modified Name
.rw-r--r-- 10 cassowary  1 Jan 12:34 /testcases/files/10_bytes

View File

@ -0,0 +1,2 @@
Permissions Size User Date Modified Name Permissions Size User Date Modified Name
.rw-r--r-- 10 cassowary  1 Jan 12:34 /testcases/files/10_bytes .rw-r--r-- 10k cassowary  1 Jan 12:34 /testcases/files/10_KiB