blockworx_editor/widget/
display.rs1use crate::theme::Style;
2use blockworx_paint::{Interaction, Renderer};
3
4use crate::{
5 grid::{HIT_RADIUS, px_point},
6 shape::ShapeId,
7 state::RenderMode,
8 theme::Role,
9 widget::drawing::Drawing,
10};
11
12#[tracing::instrument(level = "info", skip_all)]
17pub fn render(data: &Drawing, painter: &mut Style<'_, impl Renderer>) {
18 crate::widget::DrawingPasses::new(data).draw(painter);
19}
20
21pub fn render_selected(data: &Drawing, selected: ShapeId, painter: &mut Style<'_, impl Renderer>) {
26 let authoring = data.authoring_of(selected);
27 crate::widget::DrawingPasses::new(data)
28 .shape_mode(move |id| {
29 if id == selected {
30 RenderMode::Selected { authoring }
31 } else {
32 RenderMode::Normal
33 }
34 })
35 .draw(painter);
36}
37
38pub fn widget(data: &Drawing, _interaction: &Interaction, painter: &mut Style<'_, impl Renderer>) {
39 render(data, painter);
40}
41
42pub fn render_hidden(data: &Drawing, hidden: ShapeId, painter: &mut Style<'_, impl Renderer>) {
46 crate::widget::DrawingPasses::new(data)
47 .shape_mode(move |id| {
48 if id == hidden {
49 RenderMode::Hidden
50 } else {
51 RenderMode::Normal
52 }
53 })
54 .draw(painter);
55}
56
57pub fn draw_foreground(
62 data: &Drawing,
63 foreground: &crate::widget::foreground::Foreground,
64 painter: &mut Style<'_, impl Renderer>,
65) {
66 for id in foreground.shapes() {
67 let Some(shape) = data.shape(id) else {
68 continue;
69 };
70 painter.rect(
71 shape.gui_rect().expand(HIT_RADIUS.get()),
72 blockworx_geom::WorldPx::ZERO,
73 Role::Transparent,
74 (1.5, Role::DebugMark),
75 );
76 }
77 for id in foreground.routes() {
78 let Some(geometry) = data.route_geometry(id) else {
79 continue;
80 };
81 for (_, edge) in geometry.iter_edges() {
82 painter.line_segment(
83 [px_point(edge.start), px_point(edge.end)],
84 (3.0, Role::DebugMark),
85 );
86 }
87 }
88}