Files
wldash/src/widgets/clock.rs
T

85 lines
2.0 KiB
Rust
Raw Normal View History

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
}
}