Added icons mode w/ prepending (icons themselves do not appear yet)

This commit is contained in:
Alex Soderman 2018-03-22 19:13:02 -04:00
parent 67f2fcc748
commit 57e8802977
4 changed files with 80 additions and 2 deletions

View File

@ -35,7 +35,7 @@ use fs::feature::git::GitCache;
use options::{Options, Vars}; use options::{Options, Vars};
pub use options::vars; pub use options::vars;
pub use options::Misfire; pub use options::Misfire;
use output::{escape, lines, grid, grid_details, details, View, Mode}; use output::{escape, icons, lines, grid, grid_details, details, View, Mode};
mod fs; mod fs;
mod info; mod info;
@ -221,6 +221,11 @@ impl<'args, 'w, W: Write + 'w> Exa<'args, 'w, W> {
let View { ref mode, ref colours, ref style } = self.options.view; let View { ref mode, ref colours, ref style } = self.options.view;
match *mode { match *mode {
Mode::Icons(ref opts) => {
println!("ICONS MODE");
let r = icons::Render { files, colours, style, opts };
r.render(self.writer)
}
Mode::Lines => { Mode::Lines => {
let r = lines::Render { files, colours, style }; let r = lines::Render { files, colours, style };
r.render(self.writer) r.render(self.writer)

View File

@ -1,4 +1,4 @@
use output::{View, Mode, grid, details}; use output::{View, Mode, grid, details, icons};
use output::grid_details::{self, RowThreshold}; use output::grid_details::{self, RowThreshold};
use output::table::{TimeTypes, Environment, SizeFormat, Columns, Options as TableOptions}; use output::table::{TimeTypes, Environment, SizeFormat, Columns, Options as TableOptions};
use output::time::TimeFormat; use output::time::TimeFormat;
@ -63,6 +63,13 @@ impl Mode {
Ok(Mode::Details(details)) Ok(Mode::Details(details))
} }
else if matches.has(&flags::ICONS)? {
let grid = icons::Options {
across: matches.has(&flags::ACROSS)?,
console_width: width,
};
Ok(Mode::Icons(grid))
}
else { else {
let grid = grid::Options { let grid = grid::Options {
across: matches.has(&flags::ACROSS)?, across: matches.has(&flags::ACROSS)?,

64
src/output/icons.rs Normal file
View File

@ -0,0 +1,64 @@
use std::io::{Write, Result as IOResult};
use term_grid as tg;
use fs::File;
use style::Colours;
use output::file_name::FileStyle;
#[derive(PartialEq, Debug, Copy, Clone)]
pub struct Options {
pub across: bool,
pub console_width: usize,
}
impl Options {
pub fn direction(&self) -> tg::Direction {
if self.across { tg::Direction::LeftToRight }
else { tg::Direction::TopToBottom }
}
}
pub struct Render<'a> {
pub files: Vec<File<'a>>,
pub colours: &'a Colours,
pub style: &'a FileStyle,
pub opts: &'a Options,
}
impl<'a> Render<'a> {
pub fn render<W: Write>(&self, w: &mut W) -> IOResult<()> {
let mut grid = tg::Grid::new(tg::GridOptions {
direction: self.opts.direction(),
filling: tg::Filling::Spaces(2),
});
grid.reserve(self.files.len());
for file in self.files.iter() {
let filename = self.style.for_file(file, self.colours).paint();
let width = filename.width();
grid.add(tg::Cell {
contents: format!("<>{}", filename.strings().to_string()),
width: *width,
});
}
if let Some(display) = grid.fit_into_width(self.opts.console_width) {
write!(w, "{}", display)
}
else {
// File names too long for a grid - drop down to just listing them!
// This isnt *quite* the same as the lines view, which also
// displays full link paths.
for file in self.files.iter() {
let name_cell = self.style.for_file(file, self.colours).paint();
writeln!(w, "{}", name_cell.strings())?;
}
Ok(())
}
}
}

View File

@ -8,6 +8,7 @@ pub mod details;
pub mod file_name; pub mod file_name;
pub mod grid_details; pub mod grid_details;
pub mod grid; pub mod grid;
pub mod icons;
pub mod lines; pub mod lines;
pub mod render; pub mod render;
pub mod table; pub mod table;
@ -33,5 +34,6 @@ pub enum Mode {
Grid(grid::Options), Grid(grid::Options),
Details(details::Options), Details(details::Options),
GridDetails(grid_details::Options), GridDetails(grid_details::Options),
Icons(icons::Options),
Lines, Lines,
} }