makepad_widget/
codeicon.rs1use 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 { df_viewport(pos * vec2(10., 10.)); 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 { df_viewport(pos * vec2(10., 10.)); 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 { df_viewport(pos * vec2(10., 10.)); 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 { df_viewport(pos * vec2(10., 10.)); 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 { df_viewport(pos * vec2(10., 10.)); 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 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}