gdritter repos knurling / master
add chromachron Getty Ritter 2 years ago
1 changed file(s) with 63 addition(s) and 0 deletion(s). Collapse all Expand all
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 }