Skip to main content

ansiq_widgets/
sparkline.rs

1use ansiq_core::{Element, ElementKind, Layout, Length, SparklineDirection, SparklineProps, Style};
2
3pub struct Sparkline<Message = ()> {
4    element: Element<Message>,
5}
6
7impl<Message> Sparkline<Message> {
8    pub fn new() -> Self {
9        Self {
10            element: Element::new(ElementKind::Sparkline(SparklineProps {
11                values: Vec::new(),
12                max: None,
13                direction: SparklineDirection::LeftToRight,
14                absent_value_symbol: 'ยท',
15                absent_value_style: Style::default(),
16            }))
17            .with_layout(Layout {
18                width: Length::Fill,
19                height: Length::Fixed(1),
20            }),
21        }
22    }
23
24    pub fn value(mut self, value: u64) -> Self {
25        if let ElementKind::Sparkline(props) = &mut self.element.kind {
26            props.values.push(Some(value));
27        }
28        self
29    }
30
31    pub fn values<I>(mut self, values: I) -> Self
32    where
33        I: IntoIterator<Item = u64>,
34    {
35        if let ElementKind::Sparkline(props) = &mut self.element.kind {
36            props.values.extend(values.into_iter().map(Some));
37        }
38        self
39    }
40
41    pub fn value_opt(mut self, value: Option<u64>) -> Self {
42        if let ElementKind::Sparkline(props) = &mut self.element.kind {
43            props.values.push(value);
44        }
45        self
46    }
47
48    pub fn values_opt<I>(mut self, values: I) -> Self
49    where
50        I: IntoIterator<Item = Option<u64>>,
51    {
52        if let ElementKind::Sparkline(props) = &mut self.element.kind {
53            props.values.extend(values);
54        }
55        self
56    }
57
58    pub fn max(mut self, max: u64) -> Self {
59        if let ElementKind::Sparkline(props) = &mut self.element.kind {
60            props.max = Some(max);
61        }
62        self
63    }
64
65    pub fn direction(mut self, direction: SparklineDirection) -> Self {
66        if let ElementKind::Sparkline(props) = &mut self.element.kind {
67            props.direction = direction;
68        }
69        self
70    }
71
72    pub fn absent_symbol(mut self, symbol: char) -> Self {
73        if let ElementKind::Sparkline(props) = &mut self.element.kind {
74            props.absent_value_symbol = symbol;
75        }
76        self
77    }
78
79    pub fn absent_style(mut self, style: Style) -> Self {
80        if let ElementKind::Sparkline(props) = &mut self.element.kind {
81            props.absent_value_style = style;
82        }
83        self
84    }
85
86    pub fn layout(mut self, layout: Layout) -> Self {
87        self.element.layout = layout;
88        self
89    }
90
91    pub fn style(mut self, style: Style) -> Self {
92        self.element.style = style;
93        self
94    }
95
96    pub fn build(self) -> Element<Message> {
97        self.element
98    }
99}