layout_context.rs

 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}