diff options
Diffstat (limited to 'src/util/style.rs')
-rw-r--r-- | src/util/style.rs | 106 |
1 files changed, 78 insertions, 28 deletions
diff --git a/src/util/style.rs b/src/util/style.rs index 96d111c..ffe703c 100644 --- a/src/util/style.rs +++ b/src/util/style.rs @@ -1,4 +1,7 @@ +use ansi_to_tui::IntoText; +use lscolors::LsColors; use ratatui::style::Style; +use std::path::Path; use crate::fs::{FileType, JoshutoDirEntry, LinkType}; use crate::util::unix; @@ -24,40 +27,72 @@ impl PathStyleIfSome for Style { pub fn entry_style(entry: &JoshutoDirEntry) -> Style { let metadata = &entry.metadata; - let filetype = &metadata.file_type(); - let linktype = &metadata.link_type(); + let filetype = metadata.file_type(); + let linktype = metadata.link_type(); if entry.is_visual_mode_selected() { - Style::default() - .fg(THEME_T.visual_mode_selection.fg) - .bg(THEME_T.visual_mode_selection.bg) - .add_modifier(THEME_T.visual_mode_selection.modifier) - } else if entry.is_permanent_selected() { - Style::default() - .fg(THEME_T.selection.fg) - .bg(THEME_T.selection.bg) - .add_modifier(THEME_T.selection.modifier) - } else { - match linktype { - LinkType::Symlink { valid: true, .. } => Style::default() - .fg(THEME_T.link.fg) - .bg(THEME_T.link.bg) - .add_modifier(THEME_T.link.modifier), - LinkType::Symlink { valid: false, .. } => Style::default() - .fg(THEME_T.link_invalid.fg) - .bg(THEME_T.link_invalid.bg) - .add_modifier(THEME_T.link_invalid.modifier), - LinkType::Normal => match filetype { - FileType::Directory => Style::default() - .fg(THEME_T.directory.fg) - .bg(THEME_T.directory.bg) - .add_modifier(THEME_T.directory.modifier), - FileType::File => file_style(entry), - }, + return visual_mode_selected_style(); + } + if entry.is_permanent_selected() { + return permanent_selected_style(); + } + + match &THEME_T.lscolors { + Some(lscolors) => { + let path = entry.file_path(); + lscolors_style(lscolors, path) + .unwrap_or_else(|| default_style(entry, linktype, filetype)) } + None => default_style(entry, linktype, filetype), } } +fn default_style(entry: &JoshutoDirEntry, linktype: &LinkType, filetype: &FileType) -> Style { + match linktype { + LinkType::Symlink { valid: true, .. } => symlink_valid_style(), + LinkType::Symlink { valid: false, .. } => symlink_invalid_style(), + LinkType::Normal => match filetype { + FileType::Directory => directory_style(), + FileType::File => file_style(entry), + }, + } +} + +fn visual_mode_selected_style() -> Style { + Style::default() + .fg(THEME_T.visual_mode_selection.fg) + .bg(THEME_T.visual_mode_selection.bg) + .add_modifier(THEME_T.visual_mode_selection.modifier) +} + +fn permanent_selected_style() -> Style { + Style::default() + .fg(THEME_T.selection.fg) + .bg(THEME_T.selection.bg) + .add_modifier(THEME_T.selection.modifier) +} + +fn symlink_valid_style() -> Style { + Style::default() + .fg(THEME_T.link.fg) + .bg(THEME_T.link.bg) + .add_modifier(THEME_T.link.modifier) +} + +fn symlink_invalid_style() -> Style { + Style::default() + .fg(THEME_T.link_invalid.fg) + .bg(THEME_T.link_invalid.bg) + .add_modifier(THEME_T.link_invalid.modifier) +} + +fn directory_style() -> Style { + Style::default() + .fg(THEME_T.directory.fg) + .bg(THEME_T.directory.bg) + .add_modifier(THEME_T.directory.modifier) +} + fn file_style(entry: &JoshutoDirEntry) -> Style { let regular_style = Style::default() .fg(THEME_T.regular.fg) @@ -84,3 +119,18 @@ fn file_style(entry: &JoshutoDirEntry) -> Style { .unwrap_or(regular_style) } } + +fn lscolors_style(lscolors: &LsColors, path: &Path) -> Option<Style> { + let nu_ansi_term_style = lscolors.style_for_path(path)?.to_nu_ansi_term_style(); + // Paths that are not valid UTF-8 are not styled by LS_COLORS. + let str = path.to_str()?; + let text = nu_ansi_term_style + .paint(str) + .to_string() + .into_bytes() + .into_text() + .ok()?; + // Extract the first Style from the returned Text. + let style = text.lines.first()?.spans.first()?.style; + Some(style) +} |