فهرست منبع

Make the cells optional for display Rows.

This will be used to not provide any information for the rows that will have no data (attributes, errors).
Ben S 10 سال پیش
والد
کامیت
ec0539d314
1فایلهای تغییر یافته به همراه24 افزوده شده و 10 حذف شده
  1. 24 10
      src/output/details.rs

+ 24 - 10
src/output/details.rs

@@ -113,7 +113,7 @@ impl Details {
 struct Row {
 
     /// Vector of cells to display.
-    cells:    Vec<Cell>,
+    cells:    Option<Vec<Cell>>,
 
     /// This file's name, in coloured output. The name is treated separately
     /// from the other cells, as it never requires padding.
@@ -135,6 +135,15 @@ struct Row {
     children: bool,
 }
 
+impl Row {
+    fn column_width(&self, index: usize) -> usize {
+        match self.cells {
+            Some(ref cells) => cells[index].length,
+            None => 0,
+        }
+    }
+}
+
 
 /// A **Table** object gets built up by the view as it lists files and
 /// directories.
@@ -192,7 +201,7 @@ impl<U> Table<U> where U: Users {
     pub fn add_header(&mut self) {
         let row = Row {
             depth:    0,
-            cells:    self.columns.iter().map(|c| Cell::paint(self.colours.header, c.header())).collect(),
+            cells:    Some(self.columns.iter().map(|c| Cell::paint(self.colours.header, c.header())).collect()),
             name:     Cell::paint(self.colours.header, "Name"),
             last:     false,
             attrs:    Vec::new(),
@@ -211,7 +220,7 @@ impl<U> Table<U> where U: Users {
     pub fn add_file_with_cells(&mut self, cells: Vec<Cell>, file: &File, depth: usize, last: bool, links: bool) {
         let row = Row {
             depth:    depth,
-            cells:    cells,
+            cells:    Some(cells),
             name:     Cell { text: filename(file, &self.colours, links), length: file.file_name_width() },
             last:     last,
             attrs:    file.xattrs.clone(),
@@ -398,19 +407,24 @@ impl<U> Table<U> where U: Users {
         // each column, then formatting each cell in that column to be the
         // width of that one.
         let column_widths: Vec<usize> = (0 .. self.columns.len())
-            .map(|n| self.rows.iter().map(|row| row.cells[n].length).max().unwrap_or(0))
+            .map(|n| self.rows.iter().map(|row| row.column_width(n)).max().unwrap_or(0))
             .collect();
 
         for row in self.rows.iter() {
             let mut cell = Cell::empty();
 
-            for (n, width) in column_widths.iter().enumerate() {
-                match self.columns[n].alignment() {
-                    Alignment::Left  => { cell.append(&row.cells[n]); cell.add_spaces(width - row.cells[n].length); }
-                    Alignment::Right => { cell.add_spaces(width - row.cells[n].length); cell.append(&row.cells[n]); }
-                }
+            if let Some(ref cells) = row.cells {
+                for (n, width) in column_widths.iter().enumerate() {
+                    match self.columns[n].alignment() {
+                        Alignment::Left  => { cell.append(&cells[n]); cell.add_spaces(width - cells[n].length); }
+                        Alignment::Right => { cell.add_spaces(width - cells[n].length); cell.append(&cells[n]); }
+                    }
 
-                cell.add_spaces(1);
+                    cell.add_spaces(1);
+                }
+            }
+            else {
+                cell.add_spaces(column_widths.len())
             }
 
             let mut filename = String::new();