makepad_widget/
scrollshadow.rs

1use makepad_render::*;
2use crate::widgetstyle::*;
3
4#[derive(Clone)]
5pub struct ScrollShadow {
6    pub bg: Quad,
7    pub z: f32,
8}
9
10impl ScrollShadow {
11    pub fn proto(cx: &mut Cx) -> Self {
12        Self {
13            bg: Quad ::proto(cx),
14            z: 10.,
15        }
16    }
17    
18    pub fn shadow_size() -> FloatId {uid!()}
19    pub fn shadow_top() -> InstanceFloat {uid!()}
20    pub fn shader_bg() -> ShaderId {uid!()}
21    
22    pub fn style(cx: &mut Cx, _opt: &StyleOptions) {
23        
24        Self::shadow_size().set(cx, 4.0);
25        
26        Self::shader_bg().set(cx, Quad::def_quad_shader().compose(shader_ast !({
27            let is_viz: float<Varying>;
28            let shadow_top: Self::shadow_top();
29            fn scroll() -> vec2 {
30                if shadow_top > 0.5 {
31                    is_viz = clamp(draw_scroll.w*0.1,0.,1.)
32                }
33                else {
34                    is_viz = clamp(draw_scroll.z*0.1,0.,1.)
35                }
36                return draw_scroll.xy;
37            }
38            
39            fn pixel() -> vec4 { // TODO make the corner overlap properly with a distance field eq.
40                if shadow_top > 0.5{
41                    return mix(vec4(0., 0., 0., is_viz), vec4(0., 0., 0., 0.), pow(geom.y, 0.5));
42                }
43                return mix(vec4(0., 0., 0., is_viz), vec4(0., 0., 0., 0.), pow(geom.x, 0.5));
44            }
45        })));
46    }
47    
48    pub fn draw_shadow_top(&mut self, cx:&mut Cx){
49        self.draw_shadow_top_at(cx, Rect {
50            x: 0.,
51            y: 0.,
52            w: cx.get_width_total(),
53            h: 0.
54        });
55    }
56    
57    pub fn draw_shadow_top_at(&mut self, cx:&mut Cx, rect:Rect){
58        self.bg.shader = Self::shader_bg().get(cx);
59        self.bg.z = self.z;
60        let inst = self.bg.draw_quad_rel(cx, Rect{h:ScrollShadow::shadow_size().get(cx),..rect});
61        inst.set_do_scroll(cx, false, false);
62        inst.push_float(cx, 1.0);
63    }
64
65    pub fn draw_shadow_left(&mut self, cx:&mut Cx){
66        self.draw_shadow_left_at(cx, Rect {
67            x: 0.,
68            y: 0.,
69            w: 0.,
70            h: cx.get_height_total()
71        });
72    } 
73
74    pub fn draw_shadow_left_at(&mut self, cx:&mut Cx, rect:Rect){
75        self.bg.shader = Self::shader_bg().get(cx);
76        self.bg.z = self.z;
77        let inst = self.bg.draw_quad_rel(cx, Rect{w:ScrollShadow::shadow_size().get(cx),..rect});
78        inst.set_do_scroll(cx, false, false);
79        inst.push_float(cx, 0.0);
80    }
81    
82}