use crate::ViewContext; use gpui::{geometry::rect::RectF, LayoutEngine, LayoutId}; use util::ResultExt; /// Makes a new, gpui2-style element into a legacy element. pub struct AdapterElement(pub(crate) crate::element::AnyElement); impl gpui::Element for AdapterElement { type LayoutState = Option<(LayoutEngine, LayoutId)>; type PaintState = (); fn layout( &mut self, constraint: gpui::SizeConstraint, view: &mut V, cx: &mut gpui::ViewContext, ) -> (gpui::geometry::vector::Vector2F, Self::LayoutState) { cx.push_layout_engine(LayoutEngine::new()); let mut cx = ViewContext::new(cx); let layout_id = self.0.layout(view, &mut cx).log_err(); if let Some(layout_id) = layout_id { cx.layout_engine() .unwrap() .compute_layout(layout_id, constraint.max) .log_err(); } let layout_engine = cx.pop_layout_engine(); debug_assert!(layout_engine.is_some(), "unexpected layout stack state. is there an unmatched pop_layout_engine in the called code?" ); (constraint.max, layout_engine.zip(layout_id)) } fn paint( &mut self, bounds: RectF, _visible_bounds: RectF, layout_data: &mut Option<(LayoutEngine, LayoutId)>, view: &mut V, cx: &mut gpui::ViewContext, ) -> Self::PaintState { let (layout_engine, layout_id) = layout_data.take().unwrap(); cx.push_layout_engine(layout_engine); self.0 .paint(view, bounds.origin(), &mut ViewContext::new(cx)); *layout_data = cx.pop_layout_engine().zip(Some(layout_id)); debug_assert!(layout_data.is_some()); } fn rect_for_text_range( &self, _range_utf16: std::ops::Range, _bounds: RectF, _visible_bounds: RectF, _layout: &Self::LayoutState, _paint: &Self::PaintState, _view: &V, _cx: &gpui::ViewContext, ) -> Option { todo!("implement before merging to main") } fn debug( &self, _bounds: RectF, _layout: &Self::LayoutState, _paint: &Self::PaintState, _view: &V, _cx: &gpui::ViewContext, ) -> gpui::serde_json::Value { todo!("implement before merging to main") } }