ansiq_widgets/
sparkline.rs1use 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}