makepad_widget/
scrollshadow.rs1use 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 { 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}