makepad_widget/
codeicon.rs

1use makepad_render::*;
2use crate::widgetstyle::*;
3
4#[derive(Clone)]
5pub struct CodeIcon {
6    pub quad: Quad,
7}
8
9pub enum CodeIconType {
10    Panic,
11    Warning,
12    Error,
13    Ok,
14    Wait
15}
16
17impl CodeIconType {
18    fn shader_float(&self) -> f32 {
19        match self {
20            CodeIconType::Panic => 1.,
21            CodeIconType::Warning => 2.,
22            CodeIconType::Error => 3.,
23            CodeIconType::Ok => 4.,
24            CodeIconType::Wait => 5.,
25        }
26    }
27}
28
29impl CodeIcon {
30    pub fn proto(cx: &mut Cx) -> Self {
31        Self {
32            quad: Quad {
33                shader: cx.add_shader(Self::def_code_icon_shader(), "CodeIcon"),
34                ..Quad::proto(cx)
35            }
36        }
37    }
38    
39    pub fn walk()->WalkId{uid!()}
40    
41    pub fn style(cx:&mut Cx, opt:&StyleOptions){
42        Self::walk().set(cx, Walk{
43            width: Width::Fix(14.0*opt.scale),
44            height: Height::Fix(14.0*opt.scale),
45            margin: Margin {l: 0., t: 0.5, r: 4., b: 0.},
46        })
47    }
48    
49    pub fn instance_icon_id()->InstanceFloat{uid!()}
50    
51    pub fn def_code_icon_shader() -> ShaderGen {
52        Quad::def_quad_shader().compose(shader_ast!({
53            let icon_id: Self::instance_icon_id();
54            
55            fn pixel() -> vec4 {
56                let col = color;
57                if abs(icon_id - 5.) < 0.1 { //Wait
58                    df_viewport(pos * vec2(10., 10.)); // * vec2(w, h));
59                    df_circle(5., 5., 4.);
60                    df_fill_keep(color("orange"));
61                    df_stroke(color("gray"), 0.5);
62                    df_move_to(3., 5.);
63                    df_line_to(3., 5.);
64                    df_move_to(5., 5.);
65                    df_line_to(5., 5.);
66                    df_move_to(7., 5.);
67                    df_line_to(7., 5.);
68                    df_stroke(color("black"), 0.8);
69                    return df_result;
70                }
71                if abs(icon_id - 4.) < 0.1 { //OK
72                    df_viewport(pos * vec2(10., 10.)); // * vec2(w, h));
73                    df_circle(5., 5., 4.);
74                    df_fill_keep(color("#555"));
75                    df_stroke(color("#555"), 0.5);
76                    let sz = 1.;
77                    df_move_to(5., 5.);
78                    df_line_to(5., 5.);
79                    df_stroke(color("#aaa"), 0.8);
80                    return df_result;
81                }
82                else if abs(icon_id - 3.) < 0.1 { // Error
83                    df_viewport(pos * vec2(10., 10.)); // * vec2(w, h));
84                    df_circle(5., 5., 4.);
85                    df_fill_keep(color("#c00"));
86                    df_stroke(color("gray"), 0.5);
87                    let sz = 1.;
88                    df_move_to(5. - sz, 5. - sz);
89                    df_line_to(5. + sz, 5. + sz);
90                    df_move_to(5. - sz, 5. + sz);
91                    df_line_to(5. + sz, 5. - sz);
92                    df_stroke(color("black"), 0.8);
93                    return df_result;
94                }
95                else if abs(icon_id - 2.) < 0.1 { // Warning
96                    df_viewport(pos * vec2(10., 10.)); // * vec2(w, h));
97                    df_move_to(5., 1.);
98                    df_line_to(9., 9.);
99                    df_line_to(1., 9.);
100                    df_close_path();
101                    df_fill_keep(vec4(253.0 / 255.0, 205.0 / 255.0, 59.0 / 255.0, 1.0));
102                    df_stroke(color("gray"), 0.5);
103                    df_move_to(5., 3.5);
104                    df_line_to(5., 5.25);
105                    df_stroke(color("black"), 0.8);
106                    df_move_to(5., 7.25);
107                    df_line_to(5., 7.5);
108                    df_stroke(color("black"), 0.8);
109                    return df_result;
110                }
111                else { // Panic
112                    df_viewport(pos * vec2(10., 10.)); // * vec2(w, h));
113                    df_move_to(5., 1.);
114                    df_line_to(9., 9.);
115                    df_line_to(1., 9.);
116                    df_close_path();
117                    df_fill_keep(color("#c00"));
118                    df_stroke(color("gray"), 0.5);
119                    let sz = 1.;
120                    df_move_to(5. - sz, 6.25 - sz);
121                    df_line_to(5. + sz, 6.25 + sz);
122                    df_move_to(5. - sz, 6.25 + sz);
123                    df_line_to(5. + sz, 6.25 - sz);
124                    df_stroke(color("white"), 0.8);
125
126                    return df_result;
127                }
128            }
129        }))
130    }
131    /*
132    pub fn draw_icon_abs(&mut self, cx: &mut Cx, x: f32, y: f32, icon_type: CodeIconType) -> InstanceArea {
133        let inst = self.quad.draw_quad_abs(cx, Rect {x: x, y: y, w: self.width, h: self.height});
134        inst.push_float(cx, icon_type.shader_float());
135        inst
136    }*/
137    
138    pub fn draw_icon(&mut self, cx: &mut Cx, icon_type: CodeIconType) -> InstanceArea {
139        
140        let inst = self.quad.draw_quad(cx, Self::walk().get(cx));
141        inst.push_float(cx, icon_type.shader_float());
142        inst
143    }
144    
145}