cadmus_core/view/
image.rs

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