layout_context.rs

 1use crate::{element::LayoutId, style::Style};
 2use anyhow::{anyhow, Result};
 3use derive_more::{Deref, DerefMut};
 4use gpui::{geometry::Size, MeasureParams};
 5pub use gpui::{taffy::tree::NodeId, LayoutContext as LegacyLayoutContext};
 6
 7#[derive(Deref, DerefMut)]
 8pub struct LayoutContext<'a, 'b, 'c, 'd, V> {
 9    #[deref]
10    #[deref_mut]
11    pub(crate) legacy_cx: &'d mut LegacyLayoutContext<'a, 'b, 'c, V>,
12}
13
14impl<'a, 'b, 'c, 'd, V: 'static> LayoutContext<'a, 'b, 'c, 'd, V> {
15    pub fn new(legacy_cx: &'d mut LegacyLayoutContext<'a, 'b, 'c, V>) -> Self {
16        Self { legacy_cx }
17    }
18
19    pub fn add_layout_node(
20        &mut self,
21        style: Style,
22        children: impl IntoIterator<Item = NodeId>,
23    ) -> Result<LayoutId> {
24        let rem_size = self.rem_size();
25        let id = self
26            .legacy_cx
27            .layout_engine()
28            .ok_or_else(|| anyhow!("no layout engine"))?
29            .add_node(style.to_taffy(rem_size), children)?;
30
31        Ok(id)
32    }
33
34    pub fn add_measured_layout_node<F>(&mut self, style: Style, measure: F) -> Result<LayoutId>
35    where
36        F: Fn(MeasureParams) -> Size<f32> + Sync + Send + 'static,
37    {
38        let rem_size = self.rem_size();
39        let layout_id = self
40            .layout_engine()
41            .ok_or_else(|| anyhow!("no layout engine"))?
42            .add_measured_node(style.to_taffy(rem_size), measure)?;
43
44        Ok(layout_id)
45    }
46}