showbits/showbits-thermal-printer/src/drawer.rs
2024-05-13 13:02:26 +02:00

66 lines
1.4 KiB
Rust

mod calendar;
mod cells;
mod chat_message;
mod egg;
mod image;
mod photo;
mod text;
mod tictactoe;
mod typst;
use showbits_common::widgets::{FontStuff, HasFontStuff};
use tokio::sync::mpsc;
use crate::printer::Printer;
pub use self::{
calendar::CalendarDrawing, cells::CellsDrawing, chat_message::ChatMessageDrawing,
egg::EggDrawing, image::ImageDrawing, photo::PhotoDrawing, text::TextDrawing,
tictactoe::TicTacToeDrawing, typst::TypstDrawing,
};
#[derive(Default)]
pub struct Context {
font_stuff: FontStuff,
}
pub trait Drawing {
fn draw(&self, printer: &mut Printer, ctx: &mut Context) -> anyhow::Result<()>;
}
pub struct Command(Box<dyn Drawing + Send>);
impl Command {
pub fn draw<D: Drawing + Send + 'static>(drawing: D) -> Self {
Self(Box::new(drawing))
}
}
impl HasFontStuff for Context {
fn font_stuff(&mut self) -> &mut FontStuff {
&mut self.font_stuff
}
}
pub struct Drawer {
rx: mpsc::Receiver<Command>,
printer: Printer,
ctx: Context,
}
impl Drawer {
pub fn new(rx: mpsc::Receiver<Command>, printer: Printer) -> Self {
Self {
rx,
printer,
ctx: Context::default(),
}
}
pub fn run(&mut self) -> anyhow::Result<()> {
while let Some(command) = self.rx.blocking_recv() {
command.0.draw(&mut self.printer, &mut self.ctx)?;
}
Ok(())
}
}