2023-01-11 00:28:54 +01:00
|
|
|
use std::default::Default;
|
|
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
|
buffer::BufferView,
|
|
|
|
|
color::Color,
|
|
|
|
|
fonts::FontMap,
|
2023-02-02 23:52:59 +01:00
|
|
|
event::Event,
|
2023-01-11 00:28:54 +01:00
|
|
|
widgets::{Geometry, Widget},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
use chrono::{Local, Timelike};
|
|
|
|
|
|
|
|
|
|
pub struct Clock {
|
2023-01-13 21:53:07 +01:00
|
|
|
font: &'static str,
|
|
|
|
|
size: f32,
|
2023-01-11 00:28:54 +01:00
|
|
|
dirty: bool,
|
|
|
|
|
geometry: Geometry,
|
|
|
|
|
digit_width: u32,
|
|
|
|
|
colon_width: u32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'a> Clock {
|
2023-02-02 23:52:59 +01:00
|
|
|
pub fn new(fm: &mut FontMap, font: &'static str, size: f32) -> Clock {
|
|
|
|
|
fm.queue_font(font, size, "0123456789: ");
|
2023-01-11 00:28:54 +01:00
|
|
|
Clock {
|
2023-01-16 00:25:34 +01:00
|
|
|
font,
|
|
|
|
|
size,
|
2023-01-11 00:28:54 +01:00
|
|
|
dirty: true,
|
|
|
|
|
geometry: Default::default(),
|
|
|
|
|
digit_width: 0,
|
|
|
|
|
colon_width: 0,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'a> Widget for Clock {
|
|
|
|
|
fn get_dirty(&self) -> bool {
|
|
|
|
|
self.dirty
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn geometry(&self) -> Geometry {
|
|
|
|
|
self.geometry
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-16 00:25:34 +01:00
|
|
|
fn event(&mut self, event: &Event) {
|
|
|
|
|
match event {
|
|
|
|
|
Event::NewMinute => {
|
|
|
|
|
self.dirty = true;
|
|
|
|
|
}
|
|
|
|
|
_ => (),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-11 00:28:54 +01:00
|
|
|
fn draw(&mut self, fonts: &mut FontMap, view: &mut BufferView) -> Geometry {
|
|
|
|
|
let time = Local::now().naive_local();
|
2023-02-02 23:52:59 +01:00
|
|
|
let fg = Color::WHITE;
|
2023-01-11 00:28:54 +01:00
|
|
|
|
|
|
|
|
let digit = self.digit_width;
|
|
|
|
|
let colon = self.colon_width;
|
2023-01-13 21:53:07 +01:00
|
|
|
let font = fonts.get_font(self.font, self.size);
|
2023-01-11 00:28:54 +01:00
|
|
|
font.draw_text_fixed_width(
|
|
|
|
|
view,
|
2023-02-02 23:52:59 +01:00
|
|
|
fg,
|
2023-01-11 00:28:54 +01:00
|
|
|
&[digit, digit, colon, digit, digit],
|
|
|
|
|
&format!("{:02}:{:02}", time.hour(), time.minute()),
|
|
|
|
|
)
|
|
|
|
|
.unwrap();
|
2023-01-16 00:25:34 +01:00
|
|
|
self.dirty = false;
|
2023-01-11 00:28:54 +01:00
|
|
|
self.geometry
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn geometry_update(&mut self, fonts: &mut FontMap, geometry: &Geometry) -> Geometry {
|
2023-01-13 21:53:07 +01:00
|
|
|
let font = fonts.get_font(self.font, self.size);
|
2023-01-11 00:28:54 +01:00
|
|
|
self.digit_width = font.auto_widest("0123456789").unwrap();
|
|
|
|
|
self.colon_width = font.auto_widest(":").unwrap();
|
|
|
|
|
self.geometry = Geometry {
|
|
|
|
|
x: geometry.x,
|
|
|
|
|
y: geometry.y,
|
|
|
|
|
width: self.digit_width * 4 + self.colon_width,
|
2023-01-13 21:53:07 +01:00
|
|
|
height: self.size.ceil() as u32,
|
2023-01-11 00:28:54 +01:00
|
|
|
};
|
|
|
|
|
self.geometry
|
|
|
|
|
}
|
|
|
|
|
}
|