1use crate::*;
2use std::any::Any;
3
4pub struct Geom<V, F> {
6 child: V,
7 func: F,
8}
9
10impl<V, F> View for Geom<V, F>
11where
12 V: View,
13 F: Fn(&mut Context, LocalSize, LocalToWorld) + 'static,
14{
15 fn process(
16 &self,
17 event: &Event,
18 id: ViewId,
19 cx: &mut Context,
20 actions: &mut Vec<Box<dyn Any>>,
21 ) {
22 self.child.process(event, id.child(&0), cx, actions);
23 }
24
25 fn draw(&self, id: ViewId, args: &mut DrawArgs) {
26 let rect = args.cx.layout[&id].rect;
27 (self.func)(args.cx, rect.size, args.vger.current_transform());
28 self.child.draw(id.child(&0), args);
29 }
30
31 fn layout(&self, id: ViewId, args: &mut LayoutArgs) -> LocalSize {
32 let sz = self.child.layout(id.child(&0), args);
33
34 args.cx.layout.insert(
35 id,
36 LayoutBox {
37 rect: LocalRect::new(LocalPoint::zero(), sz),
38 offset: LocalOffset::zero(),
39 },
40 );
41
42 sz
43 }
44
45 fn dirty(&self, id: ViewId, xform: LocalToWorld, cx: &mut Context) {
46 self.child.dirty(id.child(&0), xform, cx);
47 }
48
49 fn hittest(&self, id: ViewId, pt: LocalPoint, cx: &mut Context) -> Option<ViewId> {
50 self.child.hittest(id.child(&0), pt, cx)
51 }
52
53 fn commands(&self, id: ViewId, cx: &mut Context, cmds: &mut Vec<CommandInfo>) {
54 self.child.commands(id.child(&0), cx, cmds)
55 }
56
57 fn gc(&self, id: ViewId, cx: &mut Context, map: &mut Vec<ViewId>) {
58 map.push(id);
59 self.child.gc(id.child(&0), cx, map)
60 }
61
62 fn access(
63 &self,
64 id: ViewId,
65 cx: &mut Context,
66 nodes: &mut Vec<(accesskit::NodeId, accesskit::Node)>,
67 ) -> Option<accesskit::NodeId> {
68 self.child.access(id.child(&0), cx, nodes)
69 }
70}
71
72impl<V, F> private::Sealed for Geom<V, F> {}
73
74impl<V, F> Geom<V, F>
75where
76 V: View,
77 F: Fn(&mut Context, LocalSize, LocalToWorld) + 'static,
78{
79 pub fn new(child: V, f: F) -> Self {
80 Self { child, func: f }
81 }
82}