1use anyhow::{anyhow, Result};
2use derive_more::{Deref, DerefMut};
3pub use gpui::LayoutContext as LegacyLayoutContext;
4use gpui::{RenderContext, ViewContext};
5pub use taffy::tree::NodeId;
6
7use crate::{element::Layout, style::Style};
8
9#[derive(Deref, DerefMut)]
10pub struct LayoutContext<'a, 'b, 'c, 'd, V> {
11 #[deref]
12 #[deref_mut]
13 pub(crate) legacy_cx: &'d mut LegacyLayoutContext<'a, 'b, 'c, V>,
14}
15
16impl<'a, 'b, V> RenderContext<'a, 'b, V> for LayoutContext<'a, 'b, '_, '_, V> {
17 fn text_style(&self) -> gpui::fonts::TextStyle {
18 self.legacy_cx.text_style()
19 }
20
21 fn push_text_style(&mut self, style: gpui::fonts::TextStyle) {
22 self.legacy_cx.push_text_style(style)
23 }
24
25 fn pop_text_style(&mut self) {
26 self.legacy_cx.pop_text_style()
27 }
28
29 fn as_view_context(&mut self) -> &mut ViewContext<'a, 'b, V> {
30 &mut self.view_context
31 }
32}
33
34impl<'a, 'b, 'c, 'd, V: 'static> LayoutContext<'a, 'b, 'c, 'd, V> {
35 pub fn new(legacy_cx: &'d mut LegacyLayoutContext<'a, 'b, 'c, V>) -> Self {
36 Self { legacy_cx }
37 }
38
39 pub fn add_layout_node<D>(
40 &mut self,
41 style: Style,
42 element_data: D,
43 children: impl IntoIterator<Item = NodeId>,
44 ) -> Result<Layout<V, D>> {
45 let rem_size = self.rem_pixels();
46 let id = self
47 .legacy_cx
48 .layout_engine()
49 .ok_or_else(|| anyhow!("no layout engine"))?
50 .add_node(style.to_taffy(rem_size), children)?;
51
52 Ok(Layout::new(id, element_data))
53 }
54}