fui_controls/controls/
shadow.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4use drawing::primitive::Primitive;
5use fui_core::*;
6use typed_builder::TypedBuilder;
7
8use crate::style::*;
9
10#[derive(TypedBuilder)]
11pub struct Shadow {}
12
13impl Shadow {
14    pub fn to_view(
15        self,
16        style: Option<Box<dyn Style<Self>>>,
17        context: ViewContext,
18    ) -> Rc<RefCell<dyn ControlObject>> {
19        StyledControl::new(
20            self,
21            style.unwrap_or_else(|| {
22                Box::new(DefaultShadowStyle::new(
23                    DefaultShadowStyleParams::builder().build(),
24                ))
25            }),
26            context,
27        )
28    }
29}
30
31//
32// Default Shadow Style
33//
34
35#[derive(TypedBuilder)]
36pub struct DefaultShadowStyleParams {
37    #[builder(default = 6.0f32)]
38    size: f32,
39}
40
41pub struct DefaultShadowStyle {
42    params: DefaultShadowStyleParams,
43}
44
45impl DefaultShadowStyle {
46    pub fn new(params: DefaultShadowStyleParams) -> Self {
47        DefaultShadowStyle { params }
48    }
49}
50
51impl Style<Shadow> for DefaultShadowStyle {
52    fn setup(&mut self, _data: &mut Shadow, _control_context: &mut ControlContext) {}
53
54    fn handle_event(
55        &mut self,
56        _data: &mut Shadow,
57        _control_context: &mut ControlContext,
58        _drawing_context: &mut dyn DrawingContext,
59        _event_context: &mut dyn EventContext,
60        _event: ControlEvent,
61    ) {
62    }
63
64    fn measure(
65        &mut self,
66        _data: &mut Shadow,
67        control_context: &mut ControlContext,
68        drawing_context: &mut dyn DrawingContext,
69        size: Size,
70    ) -> Size {
71        let children = control_context.get_children();
72
73        if let Some(ref content) = children.into_iter().next() {
74            content.borrow_mut().measure(drawing_context, size);
75            let rect = content.borrow().get_rect();
76            Size::new(rect.width, rect.height)
77        } else {
78            Size::new(0f32, 0f32)
79        }
80    }
81
82    fn set_rect(
83        &mut self,
84        _data: &mut Shadow,
85        control_context: &mut ControlContext,
86        drawing_context: &mut dyn DrawingContext,
87        rect: Rect,
88    ) {
89        let children = control_context.get_children();
90        if let Some(ref content) = children.into_iter().next() {
91            content.borrow_mut().set_rect(drawing_context, rect);
92        }
93    }
94
95    fn hit_test(
96        &self,
97        _data: &Shadow,
98        control_context: &ControlContext,
99        point: Point,
100    ) -> Option<Rc<RefCell<dyn ControlObject>>> {
101        if point.is_inside(&control_context.get_rect()) {
102            let children = control_context.get_children();
103            if let Some(ref content) = children.into_iter().next() {
104                let c = content.borrow();
105                let rect = c.get_rect();
106                if point.is_inside(&rect) {
107                    let child_hit_test = c.hit_test(point);
108                    if child_hit_test.is_some() {
109                        return child_hit_test;
110                    }
111                }
112            }
113            Some(control_context.get_self_rc())
114        } else {
115            None
116        }
117    }
118
119    fn to_primitives(
120        &self,
121        _data: &Shadow,
122        control_context: &ControlContext,
123        drawing_context: &mut dyn DrawingContext,
124    ) -> (Vec<Primitive>, Vec<Primitive>) {
125        let mut vec = Vec::new();
126        let mut overlay = Vec::new();
127        let rect = control_context.get_rect();
128
129        let x = rect.x;
130        let y = rect.y;
131        let width = rect.width;
132        let height = rect.height;
133
134        default_theme::shadow_under_rect(&mut vec, x, y, width, height, self.params.size);
135
136        let children = control_context.get_children();
137        if let Some(ref content) = children.into_iter().next() {
138            let (mut vec2, mut overlay2) = content.borrow_mut().to_primitives(drawing_context);
139            vec.append(&mut vec2);
140            overlay.append(&mut overlay2);
141        }
142
143        (vec, overlay)
144    }
145}