summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-01-25 11:14:41 +0100
committerrabite <rabite@posteo.de>2019-01-25 11:16:55 +0100
commitf3f783a3a0bc3c96e4678c7fa986dc31bcb8d585 (patch)
tree2daa9a81e3165bf0fbbd72ddcddbc7f25401ec40 /src
parenta1900941ce9a6277f9f0cecd685f8f1c1c6bb705 (diff)
colored file names
Diffstat (limited to 'src')
-rw-r--r--src/files.rs23
-rw-r--r--src/listview.rs22
-rw-r--r--src/main.rs1
3 files changed, 33 insertions, 13 deletions
diff --git a/src/files.rs b/src/files.rs
index d1422f5..1192659 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -5,12 +5,15 @@ use std::ffi::OsStr;
use std::cmp::{Ord, Ordering};
pub struct Files(Vec<File>);
+use lscolors::{LsColors, Style};
impl Index<usize> for Files {
type Output = File;
fn index(&self, pos: usize) -> &Self::Output {
&self.0[pos]
}
+lazy_static! {
+ static ref COLORS: LsColors = LsColors::from_env().unwrap();
}
impl PartialOrd for File {
@@ -45,8 +48,14 @@ impl Files {
let name = name.to_string_lossy();
let kind = get_kind(&file);
let path = file.path();
- let size = file.metadata()?.len() / 1024;
- let file = File::new(&name, path, kind, size as usize);
+ let meta = file.metadata()?;
+ let size = meta.len() / 1024;
+ let style
+ = match COLORS.style_for_path_with_metadata(file.path(), Some(&meta)) {
+ Some(style) => Some(style.clone()),
+ None => None
+ };
+ let file = File::new(&name, path, kind, size as usize, style);
match kind {
Kind::Directory => dirs.push(file),
_ => files.push(file),
@@ -84,6 +93,7 @@ pub struct File {
pub path: PathBuf,
pub size: Option<usize>,
pub kind: Kind,
+ pub style: Option<Style>
// owner: Option<String>,
// group: Option<String>,
// flags: Option<String>,
@@ -93,12 +103,17 @@ pub struct File {
impl File {
- pub fn new(name: &str, path: PathBuf, kind: Kind, size: usize) -> File {
+ pub fn new(name: &str,
+ path: PathBuf,
+ kind: Kind,
+ size: usize,
+ style: Option<Style>) -> File {
File {
name: name.to_string(),
path: path,
size: Some(size),
- kind: kind
+ kind: kind,
+ style: style
// owner: None,
// group: None,
// flags: None,
diff --git a/src/listview.rs b/src/listview.rs
index 1ec0dfb..93424d7 100644
--- a/src/listview.rs
+++ b/src/listview.rs
@@ -61,17 +61,22 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget {
self.selection += 1;
}
- fn render_line(&self, name: &str, size: usize, unit: &str) -> String {
+ fn render_line(&self, file: &File) -> String {
+ let name = &file.name;
+ let (size, unit) = file.calculate_size();
+
let (xsize, _) = self.get_dimensions();
- let sized_string = term::sized_string(name, xsize);
+ let sized_string = term::sized_string(&name, xsize);
let padding = xsize - sized_string.width() as u16;
-
-
+ let styled_string = match &file.style {
+ Some(style) => style.to_ansi_term_style().paint(sized_string).to_string(),
+ _ => format!("{}{}", term::normal_color(), sized_string),
+ };
+
format!(
- "{}{}{:padding$}{}{}{}{}",
- term::normal_color(),
- sized_string,
+ "{}{:padding$}{}{}{}{}",
+ styled_string,
" ",
term::highlight_color(),
term::cursor_left(size.to_string().width() + unit.width()),
@@ -150,8 +155,7 @@ impl Widget for ListView<Files> {
fn render(&self) -> Vec<String> {
self.content.iter().map(|file| {
- let (size, unit) = file.calculate_size();
- self.render_line(&file.name, size, &unit)
+ self.render_line(&file)
}).collect()
}
diff --git a/src/main.rs b/src/main.rs
index 4ec5400..4a79322 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,6 +3,7 @@ extern crate unicode_width;
#[macro_use]
extern crate lazy_static;
extern crate alphanumeric_sort;
+extern crate lscolors;
use std::io::{stdout, Write};