embedded_ui/style/
monochrome.rs

1use embedded_graphics::pixelcolor::BinaryColor;
2
3use crate::kit::{
4    button::{ButtonStyle, ButtonStyler},
5    checkbox::{CheckboxStyle, CheckboxStyler},
6    knob::{KnobStyle, KnobStyler},
7    select::{SelectStyle, SelectStyler},
8    slider::{SliderStatus, SliderStyle, SliderStyler},
9};
10
11use super::Styler;
12
13#[derive(Default)]
14pub struct Monochrome;
15
16#[derive(Clone, Copy)]
17pub enum BinaryClass {
18    Raw,
19    Inverted,
20}
21
22impl Styler<BinaryColor> for Monochrome {}
23
24impl ButtonStyler<BinaryColor> for Monochrome {
25    type Class<'a> = BinaryClass;
26
27    fn default<'a>() -> Self::Class<'a> {
28        BinaryClass::Raw
29    }
30
31    fn style(
32        &self,
33        _class: &Self::Class<'_>,
34        status: crate::kit::button::ButtonStatus,
35    ) -> crate::kit::button::ButtonStyle<BinaryColor> {
36        match status {
37            crate::kit::button::ButtonStatus::Normal => ButtonStyle::new()
38                .background(BinaryColor::Off)
39                .border_color(BinaryColor::Off)
40                .border_width(1)
41                .border_radius(0),
42            crate::kit::button::ButtonStatus::Focused => ButtonStyle::new()
43                .background(BinaryColor::Off)
44                .border_color(BinaryColor::On)
45                .border_width(1)
46                .border_radius(3),
47            crate::kit::button::ButtonStatus::Pressed => ButtonStyle::new()
48                .background(BinaryColor::Off)
49                .border_color(BinaryColor::On)
50                .border_width(2)
51                .border_radius(5),
52        }
53    }
54}
55
56impl SelectStyler<BinaryColor> for Monochrome {
57    type Class<'a> = BinaryClass;
58
59    fn default<'a>() -> Self::Class<'a> {
60        BinaryClass::Raw
61    }
62
63    fn style(
64        &self,
65        _class: &Self::Class<'_>,
66        status: crate::kit::select::SelectStatus,
67    ) -> crate::kit::select::SelectStyle<BinaryColor> {
68        match status {
69            crate::kit::select::SelectStatus::Normal => SelectStyle::new()
70                .background(BinaryColor::Off)
71                .border_color(BinaryColor::Off)
72                .border_width(1)
73                .border_radius(0),
74            crate::kit::select::SelectStatus::Pressed
75            | crate::kit::select::SelectStatus::Focused => SelectStyle::new()
76                .background(BinaryColor::Off)
77                .border_color(BinaryColor::On)
78                .border_width(1)
79                .border_radius(0),
80            crate::kit::select::SelectStatus::Active => SelectStyle::new()
81                .background(BinaryColor::Off)
82                .border_color(BinaryColor::On)
83                .border_width(1)
84                .border_radius(5),
85        }
86    }
87}
88
89impl SliderStyler<BinaryColor> for Monochrome {
90    type Class<'a> = BinaryClass;
91
92    fn default<'a>() -> Self::Class<'a> {
93        BinaryClass::Raw
94    }
95
96    fn style(&self, _class: &Self::Class<'_>, status: SliderStatus) -> SliderStyle<BinaryColor> {
97        match status {
98            SliderStatus::Normal => SliderStyle::new()
99                .background(BinaryColor::Off)
100                .border_color(BinaryColor::Off)
101                .border_width(1)
102                .border_radius(0),
103            SliderStatus::Focused => SliderStyle::new()
104                .background(BinaryColor::Off)
105                .border_color(BinaryColor::On)
106                .border_width(1)
107                .border_radius(5),
108            SliderStatus::Active => SliderStyle::new()
109                .background(BinaryColor::Off)
110                .border_color(BinaryColor::Off)
111                .border_width(1)
112                .border_radius(0),
113            SliderStatus::Pressed => SliderStyle::new()
114                .background(BinaryColor::Off)
115                .border_color(BinaryColor::On)
116                .border_width(2)
117                .border_radius(5),
118        }
119    }
120}
121
122impl CheckboxStyler<BinaryColor> for Monochrome {
123    type Class<'a> = BinaryClass;
124
125    fn default<'a>() -> Self::Class<'a> {
126        BinaryClass::Raw
127    }
128
129    fn style(
130        &self,
131        _class: &Self::Class<'_>,
132        status: crate::kit::checkbox::CheckboxStatus,
133    ) -> CheckboxStyle<BinaryColor> {
134        match status {
135            crate::kit::checkbox::CheckboxStatus::Normal => CheckboxStyle::new()
136                .background(BinaryColor::Off)
137                .border_color(BinaryColor::On)
138                .border_width(1)
139                .border_radius(0),
140            crate::kit::checkbox::CheckboxStatus::Pressed => CheckboxStyle::new()
141                .background(BinaryColor::Off)
142                .border_color(BinaryColor::On)
143                .border_width(2)
144                .border_radius(5),
145            crate::kit::checkbox::CheckboxStatus::Focused => CheckboxStyle::new()
146                .background(BinaryColor::Off)
147                .border_color(BinaryColor::On)
148                .border_width(1)
149                .border_radius(3),
150            crate::kit::checkbox::CheckboxStatus::Checked => CheckboxStyle::new()
151                .background(BinaryColor::Off)
152                .border_color(BinaryColor::On)
153                .border_width(1)
154                .border_radius(0),
155        }
156    }
157}
158
159impl KnobStyler<BinaryColor> for Monochrome {
160    type Class<'a> = BinaryClass;
161
162    fn default<'a>() -> Self::Class<'a> {
163        BinaryClass::Raw
164    }
165
166    fn style(
167        &self,
168        _class: &Self::Class<'_>,
169        status: crate::kit::knob::KnobStatus,
170    ) -> crate::kit::knob::KnobStyle<BinaryColor> {
171        match status {
172            crate::kit::knob::KnobStatus::Normal => KnobStyle::new()
173                .center_color(BinaryColor::On)
174                .color(BinaryColor::On)
175                .track_color(BinaryColor::Off)
176                .track_width(3),
177            crate::kit::knob::KnobStatus::Focused => KnobStyle::new()
178                .center_color(BinaryColor::On)
179                .color(BinaryColor::On)
180                .track_color(BinaryColor::Off)
181                .track_width(4),
182            crate::kit::knob::KnobStatus::Pressed => KnobStyle::new()
183                .center_color(BinaryColor::On)
184                .color(BinaryColor::On)
185                .track_color(BinaryColor::Off)
186                .track_width(3),
187            crate::kit::knob::KnobStatus::Active => KnobStyle::new()
188                .center_color(BinaryColor::On)
189                .color(BinaryColor::On)
190                .track_color(BinaryColor::Off)
191                .track_width(3),
192        }
193    }
194}