makepad_widgets/
scroll_shadow.rs

1use crate::makepad_draw::*;
2
3live_design!{
4    link widgets;
5    use link::theme::*;
6    use makepad_draw::shader::std::*;
7    
8    DrawScrollShadowBase = {{DrawScrollShadow}} {}
9    
10    DrawScrollShadow = <DrawScrollShadowBase> {
11        
12        shadow_size: 4.0,
13        
14        fn pixel(self) -> vec4 { // TODO: make the corner overlap properly with a distance field eq.
15            let is_viz = clamp(self.scroll * 0.1, 0., 1.);
16            let pos = self.pos;
17            let base = THEME_COLOR_BG_CONTAINER.xyz;
18            let alpha = 0.0;
19            if self.shadow_is_top > 0.5 {
20                alpha = pow(pos.y, 0.5);
21            }
22            else {
23                alpha = pow(pos.x, 0.5);
24            }
25            //turn vec4(base,is_viz);
26            return Pal::premul(mix(vec4(#000.xyz, is_viz), vec4(base, 0.), alpha));
27        }
28    }
29}
30
31#[derive(Live, LiveHook, LiveRegister)]
32#[repr(C)]
33pub struct DrawScrollShadow {
34    #[live] shadow_size: f32,
35    #[deref] draw_super: DrawQuad,
36    #[live] shadow_is_top: f32,
37    #[live] scroll: f32,
38}
39
40impl DrawScrollShadow {
41    pub fn draw(&mut self, cx: &mut Cx2d, offset: DVec2) {
42        let shadow_size = self.shadow_size as f64;
43        let rect = cx.turtle().rect();
44        let scroll = cx.turtle().scroll();
45        
46        self.shadow_is_top = 0.0;
47        self.scroll = scroll.x as f32;
48        self.draw_abs(cx, Rect {
49            pos: rect.pos + dvec2(offset.x, 0.0) + scroll,
50            size: dvec2(shadow_size, rect.size.y)
51        });
52        
53        self.shadow_is_top = 1.0;
54        self.scroll = scroll.y  as f32;
55        self.draw_abs(cx, Rect {
56            pos: rect.pos + dvec2(0., offset.y) + scroll,
57            size: dvec2(rect.size.x, shadow_size)
58        });
59    }
60}