Skip to main content

blockworx_editor/shape/
image.rs

1use crate::theme::Style;
2use blockworx_geom::{Rect, Vec2};
3use blockworx_paint::Renderer;
4
5use blockworx_doc::block_model::Asset;
6
7use crate::{
8    render::draw_block_image,
9    shape::{BaseShape, block::resize_rect},
10    state::RenderMode,
11};
12
13/// Artwork ready to draw: the free-pixel box it fills, and the bytes behind
14/// the content hash the document stores. Both a placed
15/// [`Image`](blockworx_doc::block_model::Image) and a block's atomic
16/// [`Icon`](blockworx_doc::block_model::Icon) arrive here — they are the same
17/// pair — with `asset` resolved by the caller that holds the document's asset
18/// table, and `None` for the zero icon's null hash.
19#[derive(Clone, Copy)]
20pub struct Artwork<'a> {
21    pub rect: Rect,
22    pub asset: Option<&'a Asset>,
23}
24
25impl BaseShape for Artwork<'_> {
26    fn gui_rect(&self) -> Rect {
27        self.rect
28    }
29
30    fn constrain_resize_delta(&self, delta: Vec2) -> Vec2 {
31        delta
32    }
33
34    fn resizable(&self) -> bool {
35        true
36    }
37
38    fn render_ng<R: Renderer>(&self, mode: RenderMode, painter: &mut Style<'_, R>) {
39        let bbox = self.rect;
40        match mode {
41            RenderMode::Moving { delta } => {
42                draw_block_image(bbox.translate(delta), self.asset, painter);
43            }
44            RenderMode::Selected { .. } => {
45                draw_block_image(bbox, self.asset, painter);
46                crate::render::draw_selection_frame(bbox, None, painter);
47            }
48            RenderMode::Resizing { mode, delta } => {
49                let resized = resize_rect(&bbox, mode, delta);
50                draw_block_image(resized, self.asset, painter);
51                crate::render::draw_selection_frame(resized, Some(mode), painter);
52            }
53            // Images have no pins, title, or tag, so every other mode renders the
54            // same as `Normal`: just the image.
55            _ => draw_block_image(bbox, self.asset, painter),
56        }
57    }
58}