فهرست منبع

feat: rename UiStyles.icon_override to icons and add Style field

Signed-off-by: Sandro-Alessio Gierens <sandro@gierens.de>
Sandro-Alessio Gierens 1 سال پیش
والد
کامیت
5ff6693b55
5فایلهای تغییر یافته به همراه45 افزوده شده و 25 حذف شده
  1. 21 8
      src/output/file_name.rs
  2. 1 1
      src/theme/default_theme.rs
  3. 6 6
      src/theme/mod.rs
  4. 11 6
      src/theme/ui_styles.rs
  5. 6 4
      themes/theme.yml

+ 21 - 8
src/output/file_name.rs

@@ -10,6 +10,7 @@ use crate::output::cell::TextCellContents;
 use crate::output::escape;
 use crate::output::icons::{icon_for_file, iconify_style};
 use crate::output::render::FiletypeColours;
+use crate::theme::IconStyle;
 
 /// Basically a file name factory.
 #[derive(Debug, Copy, Clone)]
@@ -203,13 +204,25 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
         };
 
         if let Some(spaces_count) = spaces_count_opt {
-            let style = iconify_style(self.style());
-            let file_icon = match self.colours.icon_override(self.file) {
-                Some(icon) => icon,
-                None => icon_for_file(self.file),
-            }
-            .to_string();
-            bits.push(style.paint(file_icon));
+            let (style, icon) = match self.colours.icon_style(self.file) {
+                Some(icon_override) => (
+                    if let Some(style_override) = icon_override.style {
+                        style_override.into()
+                    } else {
+                        iconify_style(self.style())
+                    },
+                    icon_override
+                        .icon
+                        .unwrap_or_else(|| icon_for_file(self.file))
+                        .to_string(),
+                ),
+                None => (
+                    iconify_style(self.style()),
+                    icon_for_file(self.file).to_string(),
+                ),
+            };
+
+            bits.push(style.paint(icon));
             bits.push(style.paint(" ".repeat(spaces_count as usize)));
         }
 
@@ -518,5 +531,5 @@ pub trait Colours: FiletypeColours {
 
     fn colour_file(&self, file: &File<'_>) -> Style;
 
-    fn icon_override(&self, file: &File<'_>) -> Option<char>;
+    fn icon_style(&self, file: &File<'_>) -> Option<IconStyle>;
 }

+ 1 - 1
src/theme/default_theme.rs

@@ -130,7 +130,7 @@ impl Default for UiStyles {
             broken_symlink: Some(Red.normal()),
             broken_path_overlay: Some(Style::default().underline()),
 
-            icon_overrides: None,
+            icons: None,
         }
     }
 }

+ 6 - 6
src/theme/mod.rs

@@ -385,18 +385,18 @@ impl FileNameColours for Theme {
             .unwrap_or(self.ui.filekinds.unwrap_or_default().normal())
     }
 
-    fn icon_override(&self, file: &File<'_>) -> Option<char> {
-        if let Some(ref overrides) = self.ui.icon_overrides {
+    fn icon_style(&self, file: &File<'_>) -> Option<IconStyle> {
+        if let Some(ref overrides) = self.ui.icons {
             if let Some(ref name_overrides) = overrides.filenames {
-                if let Some(icon) = name_overrides.get(&file.name) {
-                    return Some(*icon);
+                if let Some(icon_override) = name_overrides.get(&file.name) {
+                    return Some(*icon_override);
                 }
             }
 
             if let Some(ref ext_overrides) = overrides.extensions {
                 if let Some(ext) = file.ext.clone() {
-                    if let Some(icon) = ext_overrides.get(&ext) {
-                        return Some(*icon);
+                    if let Some(icon_override) = ext_overrides.get(&ext) {
+                        return Some(*icon_override);
                     }
                 }
             }

+ 11 - 6
src/theme/ui_styles.rs

@@ -4,11 +4,16 @@ use serde::{Deserialize, Serialize};
 use std::collections::HashMap;
 use std::default::Default;
 
-#[rustfmt::skip]
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
+pub struct IconStyle {
+    pub icon: Option<char>,
+    pub style: Option<Style>,
+}
+
 #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
-pub struct IconOverrides {
-    pub filenames: Option<HashMap<String, char>>,
-    pub extensions: Option<HashMap<String, char>>,
+pub struct IconStyles {
+    pub filenames: Option<HashMap<String, IconStyle>>,
+    pub extensions: Option<HashMap<String, IconStyle>>,
 }
 
 #[rustfmt::skip]
@@ -40,7 +45,7 @@ pub struct UiStyles {
     pub broken_symlink:       Option<Style>,  // or
     pub broken_path_overlay:  Option<Style>,  // bO
 
-    pub icon_overrides: Option<IconOverrides>,
+    pub icons: Option<IconStyles>,
 }
 // Macro to generate .unwrap_or_default getters for each field to cut down boilerplate
 macro_rules! field_accessors {
@@ -485,7 +490,7 @@ impl UiStyles {
             broken_symlink: Some(Style::default()),
             broken_path_overlay: Some(Style::default()),
 
-            icon_overrides: None,
+            icons: None,
         }
     }
 }

+ 6 - 4
themes/theme.yml

@@ -42,9 +42,11 @@ extensions:
   # Change the icon glyph and color
   nix: {icon: {glyph: ❄, style: {foreground: White}}}
 icon_overrides:
+icons:
   filenames:
-    Cargo.toml: 🦀
-    Cargo.lock: 🦀
+    Cargo.toml: {icon: 🦀}
+    Cargo.lock: {icon: 🦀}
   extensions:
-    rs: 🦀
-    nix: ❄
+    rs: {icon: 🦀}
+    nix: 
+      icon: ❄