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, ViewContext as LegacyViewContext};
6
7#[derive(Deref, DerefMut)]
8pub struct ViewContext<'a, 'b, 'c, V> {
9 #[deref]
10 #[deref_mut]
11 pub(crate) legacy_cx: &'c mut LegacyViewContext<'a, 'b, V>,
12}
13
14impl<'a, 'b, 'c, V: 'static> ViewContext<'a, 'b, 'c, V> {
15 pub fn new(legacy_cx: &'c mut LegacyViewContext<'a, 'b, 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 style = style.to_taffy(rem_size);
26 let id = self
27 .legacy_cx
28 .layout_engine()
29 .ok_or_else(|| anyhow!("no layout engine"))?
30 .add_node(style, children)?;
31
32 Ok(id)
33 }
34
35 pub fn add_measured_layout_node<F>(&mut self, style: Style, measure: F) -> Result<LayoutId>
36 where
37 F: Fn(MeasureParams) -> Size<f32> + Sync + Send + 'static,
38 {
39 let rem_size = self.rem_size();
40 let layout_id = self
41 .layout_engine()
42 .ok_or_else(|| anyhow!("no layout engine"))?
43 .add_measured_node(style.to_taffy(rem_size), measure)?;
44
45 Ok(layout_id)
46 }
47}