Files
wldash/src/widgets/clock.rs
T

93 lines
2.6 KiB
Rust
Raw Normal View History

2019-09-06 21:54:04 +02:00
use crate::color::Color;
2020-06-03 21:06:06 +02:00
use crate::draw::Font;
use crate::{
fonts::FontRef,
widget::{DrawContext, DrawReport, KeyState, ModifiersState, WaitContext, Widget},
};
2019-09-06 21:54:04 +02:00
2020-04-22 00:52:08 +02:00
use chrono::{Duration, NaiveDateTime, Timelike};
2019-09-06 21:54:04 +02:00
2020-06-03 21:06:06 +02:00
pub struct Clock<'a> {
2020-04-22 00:52:08 +02:00
cur_time: NaiveDateTime,
2020-06-03 21:06:06 +02:00
clock_cache: Font<'a>,
2019-09-06 21:54:04 +02:00
size: f32,
2020-06-14 15:32:11 +02:00
digit: u32,
colon: u32,
2019-09-06 21:54:04 +02:00
}
2020-06-03 21:06:06 +02:00
impl<'a> Clock<'a> {
2020-06-14 15:32:11 +02:00
pub fn new(time: NaiveDateTime, font: FontRef, size: f32) -> ::std::io::Result<Box<Clock>> {
2020-06-03 21:06:06 +02:00
let mut clock_cache = Font::new(font, size);
2019-09-06 21:54:04 +02:00
clock_cache.add_str_to_cache("0123456789:");
2020-06-14 15:32:11 +02:00
let digit = clock_cache.auto_widest("123456789")?;
let colon = (clock_cache.auto_widest(":")? as f32 * 1.25) as u32;
Ok(Box::new(Clock {
2020-04-22 01:31:22 +02:00
cur_time: time,
clock_cache,
size,
2020-06-14 15:32:11 +02:00
digit,
colon,
}))
2019-09-06 21:54:04 +02:00
}
}
2020-06-03 21:06:06 +02:00
impl<'a> Widget for Clock<'a> {
2019-10-05 21:41:09 +02:00
fn wait(&mut self, ctx: &mut WaitContext) {
2019-10-05 00:50:10 +02:00
let target = (self.cur_time + Duration::seconds(60))
.with_second(0)
.unwrap()
.with_nanosecond(0)
.unwrap();
ctx.set_time(target);
}
2019-10-02 14:05:35 +02:00
fn enter(&mut self) {}
fn leave(&mut self) {}
2019-09-06 21:54:04 +02:00
fn size(&self) -> (u32, u32) {
2020-06-14 15:32:11 +02:00
(self.digit * 4 + self.colon, self.size.ceil() as u32)
2019-09-06 21:54:04 +02:00
}
fn draw(
&mut self,
ctx: &mut DrawContext,
pos: (u32, u32),
_expansion: (u32, u32),
2019-09-06 21:54:04 +02:00
) -> Result<DrawReport, ::std::io::Error> {
let (width, height) = self.size();
if !(ctx.time.date() != self.cur_time.date()
|| ctx.time.hour() != self.cur_time.hour()
|| ctx.time.minute() != self.cur_time.minute()
|| ctx.force)
{
return Ok(DrawReport::empty(width, height));
}
2020-04-22 01:31:22 +02:00
self.cur_time = ctx.time;
2019-09-06 21:54:04 +02:00
let buf = &mut ctx.buf.subdimensions((pos.0, pos.1, width, height))?;
buf.memset(ctx.bg);
2020-06-14 15:32:11 +02:00
let digit = self.digit;
let colon = self.colon;
2019-09-06 21:54:04 +02:00
self.clock_cache.draw_text_fixed_width(
buf,
ctx.bg,
&Color::new(1.0, 1.0, 1.0, 1.0),
&[digit, digit, colon, digit, digit],
&format!("{:02}:{:02}", ctx.time.hour(), ctx.time.minute()),
)?;
Ok(DrawReport {
2020-04-22 01:31:22 +02:00
width,
height,
2019-09-06 21:54:04 +02:00
damage: vec![(pos.0 as i32, pos.1 as i32, width as i32, height as i32)],
full_damage: false,
})
}
fn keyboard_input(&mut self, _: u32, _: ModifiersState, _: KeyState, _: Option<String>) {}
fn mouse_click(&mut self, _: u32, _: (u32, u32)) {}
fn mouse_scroll(&mut self, _: (f64, f64), _: (u32, u32)) {}
}