fui_controls/controls/
shadow.rs1use 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#[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}