makepad_widgets/
scroll_shadow.rs1use 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 { 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 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}