cadmus_core/view/
image.rs1use crate::color::WHITE;
2use crate::context::Context;
3use crate::font::Fonts;
4use crate::framebuffer::{Framebuffer, Pixmap, UpdateMode};
5use crate::geom::Rectangle;
6use crate::view::{Bus, Event, Hub, Id, RenderData, RenderQueue, View, ID_FEEDER};
7
8pub struct Image {
9 id: Id,
10 rect: Rectangle,
11 children: Vec<Box<dyn View>>,
12 pixmap: Pixmap,
13}
14
15impl Image {
16 pub fn new(rect: Rectangle, pixmap: Pixmap) -> Image {
17 Image {
18 id: ID_FEEDER.next(),
19 rect,
20 children: Vec::new(),
21 pixmap,
22 }
23 }
24
25 pub fn update(&mut self, pixmap: Pixmap, rq: &mut RenderQueue) {
26 self.pixmap = pixmap;
27 rq.add(RenderData::new(self.id, self.rect, UpdateMode::Gui));
28 }
29}
30
31impl View for Image {
32 #[cfg_attr(feature = "otel", tracing::instrument(skip(self, _evt, _hub, _bus, _rq, _context), fields(event = ?_evt), ret(level=tracing::Level::TRACE)))]
33 fn handle_event(
34 &mut self,
35 _evt: &Event,
36 _hub: &Hub,
37 _bus: &mut Bus,
38 _rq: &mut RenderQueue,
39 _context: &mut Context,
40 ) -> bool {
41 false
42 }
43
44 #[cfg_attr(feature = "otel", tracing::instrument(skip(self, fb, _fonts), fields(rect = ?rect)))]
45 fn render(&self, fb: &mut dyn Framebuffer, rect: Rectangle, _fonts: &mut Fonts) {
46 let x0 = self.rect.min.x + (self.rect.width() - self.pixmap.width) as i32 / 2;
47 let y0 = self.rect.min.y + (self.rect.height() - self.pixmap.height) as i32 / 2;
48 let x1 = x0 + self.pixmap.width as i32;
49 let y1 = y0 + self.pixmap.height as i32;
50 if let Some(r) = rect![self.rect.min, pt!(x1, y0)].intersection(&rect) {
51 fb.draw_rectangle(&r, WHITE);
52 }
53 if let Some(r) = rect![self.rect.min.x, y0, x0, self.rect.max.y].intersection(&rect) {
54 fb.draw_rectangle(&r, WHITE);
55 }
56 if let Some(r) = rect![pt!(x0, y1), self.rect.max].intersection(&rect) {
57 fb.draw_rectangle(&r, WHITE);
58 }
59 if let Some(r) = rect![x1, self.rect.min.y, self.rect.max.x, y1].intersection(&rect) {
60 fb.draw_rectangle(&r, WHITE);
61 }
62 if let Some(r) = rect![x0, y0, x1, y1].intersection(&rect) {
63 let frame = r - pt!(x0, y0);
64 fb.draw_framed_pixmap(&self.pixmap, &frame, r.min);
65 }
66 }
67
68 fn render_rect(&self, rect: &Rectangle) -> Rectangle {
69 rect.intersection(&self.rect).unwrap_or(self.rect)
70 }
71
72 fn rect(&self) -> &Rectangle {
73 &self.rect
74 }
75
76 fn rect_mut(&mut self) -> &mut Rectangle {
77 &mut self.rect
78 }
79
80 fn children(&self) -> &Vec<Box<dyn View>> {
81 &self.children
82 }
83
84 fn children_mut(&mut self) -> &mut Vec<Box<dyn View>> {
85 &mut self.children
86 }
87
88 fn id(&self) -> Id {
89 self.id
90 }
91}