Skip to main content

kimun_notes/settings/
icons.rs

1/// All icon strings used across the UI, resolved once from the `use_nerd_fonts` setting.
2///
3/// Build with [`Icons::new`] after loading settings, then pass `&Icons` (or a clone)
4/// wherever an icon is needed — no `use_nerd_fonts` checks at render time.
5#[derive(Clone)]
6pub struct Icons {
7    // File-list entry icons
8    pub directory: &'static str,
9    pub directory_up: &'static str,
10    pub note: &'static str,
11    pub journal: &'static str,
12    pub attachment: &'static str,
13    // UI chrome icons
14    pub info: &'static str,
15    pub workspace: &'static str,
16    /// Prompt/chevron glyph marking an Ask turn's question line.
17    pub question_prompt: &'static str,
18    // Activity-rail glyphs (one per drawer view)
19    pub rail_files: &'static str,
20    pub rail_find: &'static str,
21    pub rail_tags: &'static str,
22    pub rail_links: &'static str,
23    pub rail_outline: &'static str,
24    pub rail_config: &'static str,
25}
26
27impl Icons {
28    pub fn new(use_nerd_fonts: bool) -> Self {
29        if use_nerd_fonts {
30            Self {
31                directory: "󰉋",
32                directory_up: "󰁝",
33                note: "󰈙",
34                journal: "󰃭",
35                attachment: "",
36                info: "󰋽",
37                workspace: "⊙",
38                question_prompt: "❯",
39                rail_files: "▤",
40                rail_find: "⌕",
41                rail_tags: "#",
42                rail_links: "↩",
43                rail_outline: "≡",
44                rail_config: "",
45            }
46        } else {
47            Self {
48                directory: "[D]",
49                directory_up: "[^]",
50                note: "[-]",
51                journal: "[J]",
52                attachment: "[@]",
53                info: "(i)",
54                workspace: "W",
55                question_prompt: ">",
56                rail_files: "=",
57                rail_find: "?",
58                rail_tags: "#",
59                rail_links: "<",
60                rail_outline: "-",
61                rail_config: "*",
62            }
63        }
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn nerd_fonts_info_icon_is_not_ascii() {
73        let icons = Icons::new(true);
74        assert!(!icons.info.is_ascii());
75    }
76
77    #[test]
78    fn plain_icons_are_ascii() {
79        let icons = Icons::new(false);
80        assert!(icons.info.is_ascii());
81        assert!(icons.directory.is_ascii());
82        assert!(icons.directory_up.is_ascii());
83        assert!(icons.note.is_ascii());
84        assert!(icons.journal.is_ascii());
85    }
86}