synd_term/ui/
mod.rs

1use std::{str::FromStr, sync::OnceLock};
2
3use ratatui::style::{Color, Modifier};
4use synd_feed::types::{Category, Requirement};
5
6use crate::{
7    application::{InFlight, TerminalFocus},
8    config::{Categories, Icon, IconColor},
9    types::Time,
10    ui::{components::tabs::Tab, theme::Theme},
11};
12
13pub mod components;
14pub mod extension;
15pub mod theme;
16pub mod widgets;
17
18mod icon;
19pub(crate) use icon::icon;
20
21pub const UNKNOWN_SYMBOL: &str = "-";
22pub const TABLE_HIGHLIGHT_SYMBOL: &str = " ";
23pub const DEFAULT_REQUIREMNET: Requirement = Requirement::Should;
24
25pub fn default_category() -> &'static Category<'static> {
26    static DEFAULT_CATEGORY: OnceLock<Category<'static>> = OnceLock::new();
27
28    DEFAULT_CATEGORY.get_or_init(|| Category::new("default").unwrap())
29}
30
31pub fn default_icon() -> &'static Icon {
32    static DEFAULT_ICON: OnceLock<Icon> = OnceLock::new();
33
34    DEFAULT_ICON.get_or_init(|| {
35        Icon::new("󰎞").with_color(IconColor::new(Color::from_str("dark gray").unwrap()))
36    })
37}
38
39pub struct Context<'a> {
40    pub theme: &'a Theme,
41    pub in_flight: &'a InFlight,
42    pub categories: &'a Categories,
43    pub(crate) now: Time,
44    pub(crate) focus: TerminalFocus,
45    pub(crate) tab: Tab,
46}
47
48impl Context<'_> {
49    fn table_highlight_modifier(&self) -> Modifier {
50        match self.focus {
51            TerminalFocus::Gained => Modifier::empty(),
52            TerminalFocus::Lost => Modifier::DIM,
53        }
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn default_icon_is_not_empty() {
63        assert!(!default_icon().symbol().is_empty());
64    }
65}