summaryrefslogtreecommitdiffstats
path: root/src/util/style.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/style.rs')
-rw-r--r--src/util/style.rs106
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)
+}