makepad_widgets/
debug_view.rs

1use crate::makepad_draw::*;
2
3
4live_design!{
5    use makepad_draw::shader::std::*;
6    
7    DrawRect = {{DrawRect}} {
8        fn pixel(self) -> vec4 {
9            let sdf = Sdf2d::viewport(self.pos * self.rect_size)
10            sdf.rect(0., 0., self.rect_size.x, self.rect_size.y);
11            sdf.stroke(self.color, 1.0);
12            return sdf.result;
13            //return vec4(self.color.xyz * self.color.w, self.color.w)
14        }
15    }
16    
17    DebugView = {{DebugView}} {  
18        label: {
19            text_style: {
20                font_size: 6
21            },
22            color: #a
23        }
24    }
25}
26
27#[derive(Live, LiveHook, LiveRegister)]
28#[repr(C)]
29pub struct DrawRect {
30    #[deref] draw_super: DrawQuad,
31    #[live] color: Vec4,
32}
33
34
35#[derive(Live, LiveHook, LiveRegister)]
36pub struct DebugView {
37    #[live] draw_list: DrawList2d,
38    #[live] rect: DrawRect,
39    #[live] label: DrawText
40}
41
42impl DebugView {
43    pub fn handle_event(&mut self, cx: &mut Cx, _event: &Event) {
44        if cx.debug.has_data() {
45            self.draw_list.redraw(cx);
46        }
47    }
48    
49    pub fn draw(&mut self, cx: &mut Cx2d) {
50        if cx.debug.has_data() {
51            self.draw_list.redraw(cx);
52            self.draw_list.begin_always(cx);
53        }
54        else{
55            if !self.draw_list.begin(cx, Walk::default()).is_redrawing() {
56                return
57            }
58        }
59        let debug = cx.debug.clone();
60        let rects = debug.take_rects();
61        for (rect, color) in rects {
62            self.rect.color = color;
63            self.rect.draw_abs(cx, rect);
64        }
65        
66        let points = debug.take_points();
67        let point_size = dvec2(1.0, 1.0);
68        for (point, color) in points {
69            self.rect.color = color;
70            let rect = Rect {pos: point - 0.5 * point_size, size: point_size};
71            self.rect.draw_abs(cx, rect);
72        }
73        
74        let labels = debug.take_labels();
75        let point_size = dvec2(1.0, 1.0);
76        for (point, color, label) in labels {
77            self.rect.color = color;
78            let rect = Rect {pos: point - 0.5 * point_size, size: point_size};
79            self.rect.draw_abs(cx, rect);
80            self.label.draw_abs(cx, point, &label);
81        }
82        
83        let debug = cx.debug.clone();
84        let areas = debug.take_areas();
85        for (area, tl, br, color) in areas {
86            self.rect.color = color;
87            let rect = area.rect(cx);
88            let rect = Rect{pos: rect.pos - tl, size: rect.size + tl + br};
89            self.rect.draw_abs(cx, rect);
90        }
91        
92        self.draw_list.end(cx);
93        
94    }
95}
96