makepad_widgets/
icon.rs

1use crate::{
2    makepad_derive_widget::*,
3    makepad_draw::*,
4    widget::*
5};
6
7live_design! {
8    link widgets
9    pub IconBase = {{Icon}} {}
10
11    pub Icon = <IconBase> {
12        width: Fit,
13        height: Fit,
14        
15        icon_walk: {
16            width: 17.5,
17            height: Fit,
18        }
19        
20        draw_bg: {
21            uniform color: #0000,
22            fn pixel(self) -> vec4 {
23                return self.color;
24            }
25        }
26
27        draw_icon: {
28            uniform color: #f00
29            fn get_color(self) -> vec4 {
30                return self.color
31            }
32        }
33    }
34
35    pub IconGradientX = <Icon> {
36        draw_icon: {
37            uniform color_1: (#f00)
38            uniform color_2: (#00f)
39            fn get_color(self) -> vec4 {
40                return mix(self.color_1, self.color_2, self.pos.x);
41            }
42        }
43    }
44
45    pub IconGradientY = <IconGradientX> {
46        draw_icon: {
47            color_1: (#f00)
48            color_2: (#00f)
49            fn get_color(self) -> vec4 {
50                return mix(self.color_1, self.color_2, self.pos.y);
51            }
52        }
53    }
54
55}
56
57#[derive(Live, LiveHook, Widget)]
58pub struct Icon {
59    #[redraw]
60    #[live]
61    draw_bg: DrawQuad,
62    #[live]
63    draw_icon: DrawIcon,
64    #[live]
65    icon_walk: Walk,
66    #[walk]
67    walk: Walk,
68    #[layout]
69    layout: Layout,
70}
71
72impl Widget for Icon {
73    fn handle_event(&mut self, _cx: &mut Cx, _event: &Event, _scope: &mut Scope) {
74    }
75
76    fn draw_walk(&mut self, cx: &mut Cx2d, _scope: &mut Scope, walk: Walk) -> DrawStep {
77        self.draw_bg.begin(cx, walk, self.layout);
78        self.draw_icon.draw_walk(cx, self.icon_walk);
79        self.draw_bg.end(cx);
80        DrawStep::done()
81    }
82}