add chromachron
Getty Ritter
2 years ago
1 | use chrono::Timelike; | |
2 | ||
3 | pub use crate::widgets::widget::{Drawing, Located, Size, Widget}; | |
4 | ||
5 | const COLORS: [(f64, f64, f64); 12] = [ | |
6 | // yellow | |
7 | (0.9882352941176471,0.9450980392156862,0.043137254901960784), | |
8 | // orange | |
9 | (1.0, 0.5843137254901961, 0.011764705882352941), | |
10 | // white | |
11 | (1.0, 1.0, 1.0), | |
12 | // red | |
13 | (0.9607843137254902, 0.00392156862745098, 0.00392156862745098), | |
14 | // pink | |
15 | (0.9725490196078431, 0.011764705882352941, 0.48627450980392156), | |
16 | // purple | |
17 | (0.6784313725490196, 0.00392156862745098, 0.4666666666666667), | |
18 | // blue | |
19 | (0.0, 0.00392156862745098, 0.8470588235294118), | |
20 | // aqua | |
21 | (0.0196078431372549, 0.615686274509804, 0.4666666666666667), | |
22 | // goluboy | |
23 | (0.03529411764705882, 0.7764705882352941, 0.792156862745098), | |
24 | // deep orange | |
25 | (0.8117647058823529, 0.2, 0.00784313725490196), | |
26 | // light orange | |
27 | (0.9450980392156862, 0.4980392156862745, 0.00784313725490196), | |
28 | // peach | |
29 | (0.9921568627450981, 0.7098039215686275, 0.16862745098039217), | |
30 | ]; | |
31 | ||
32 | #[derive(Debug)] | |
33 | pub struct Chromachron; | |
34 | ||
35 | impl Widget for Chromachron { | |
36 | fn draw(&self, d: &Drawing, loc: Located) -> i32 { | |
37 | // get the current time | |
38 | let now = chrono::Local::now(); | |
39 | let hour = (now.hour() % 12) as usize; | |
40 | ||
41 | let progress = now.minute() as f64 / 60.0; | |
42 | ||
43 | let (lr, lg, lb) = if hour == 0 { | |
44 | COLORS[11] | |
45 | } else { | |
46 | COLORS[hour - 1] | |
47 | }; | |
48 | let (nr, ng, nb) = COLORS[hour % 12]; | |
49 | ||
50 | let sz = d.size.ht - (d.buffer as i32 * 2); | |
51 | let offset = sz as f64 * progress; | |
52 | ||
53 | let x = loc.target_x(d, sz); | |
54 | d.ctx.set_source_rgb(nr, ng, nb); | |
55 | d.ctx.rectangle(x, d.buffer, sz as f64 - offset, sz as f64); | |
56 | d.ctx.fill(); | |
57 | ||
58 | d.ctx.set_source_rgb(lr, lg, lb); | |
59 | d.ctx.rectangle(x + (sz as f64 - offset), d.buffer, offset, sz as f64); | |
60 | d.ctx.fill(); | |
61 | sz | |
62 | } | |
63 | } |