feather_ui/layout/
domain_write.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2025 Fundament Research Institute <https://fundament.institute>
3
4use 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
11// A DomainWrite layout spawns a renderable that writes it's area to the target cross-reference domain
12pub 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}