feather_ui/layout/
domain_write.rs1use super::base::{Empty, RLimits};
5use super::{Concrete, Desc, Layout, Renderable, Staged};
6use crate::{CrossReferenceDomain, SourceID, render, rtree};
7use std::marker::PhantomData;
8use std::rc::Rc;
9use std::sync::Arc;
10
11pub trait Prop {
13 fn domain(&self) -> Arc<CrossReferenceDomain>;
14}
15
16crate::gen_from_to_dyn!(Prop);
17
18impl Prop for Arc<CrossReferenceDomain> {
19 fn domain(&self) -> Arc<CrossReferenceDomain> {
20 self.clone()
21 }
22}
23
24impl Empty for Arc<CrossReferenceDomain> {}
25impl RLimits for Arc<CrossReferenceDomain> {}
26impl super::fixed::Child for Arc<CrossReferenceDomain> {}
27
28impl Desc for dyn Prop {
29 type Props = dyn Prop;
30 type Child = dyn Empty;
31 type Children = PhantomData<dyn Layout<Self::Child>>;
32
33 fn stage<'a>(
34 props: &Self::Props,
35 mut outer_area: crate::PxRect,
36 outer_limits: crate::PxLimits,
37 _: &Self::Children,
38 id: std::sync::Weak<SourceID>,
39 renderable: Option<Rc<dyn Renderable>>,
40 window: &mut crate::component::window::WindowState,
41 ) -> Box<dyn Staged + 'a> {
42 outer_area = super::nuetralize_unsized(outer_area);
43 outer_area = super::limit_area(outer_area, outer_limits);
44
45 Box::new(Concrete {
46 area: outer_area,
47 renderable: Some(Rc::new(render::domain::Write {
48 id: id.clone(),
49 domain: props.domain().clone(),
50 base: renderable,
51 })),
52 rtree: rtree::Node::new(
53 outer_area.to_untyped(),
54 None,
55 Default::default(),
56 id,
57 window,
58 ),
59 children: Default::default(),
60 layer: None,
61 })
62 }
63}