From 06bff418183ced84e9b6315874e4d68e25fa8207 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 25 Oct 2023 21:08:34 +0200 Subject: [PATCH] WIP: ElementRenderer --- crates/ui2/src/components/panes.rs | 80 +++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/crates/ui2/src/components/panes.rs b/crates/ui2/src/components/panes.rs index 77b6817d89..e44056138b 100644 --- a/crates/ui2/src/components/panes.rs +++ b/crates/ui2/src/components/panes.rs @@ -12,7 +12,7 @@ pub enum SplitDirection { Vertical, } -#[derive(Element)] +// #[derive(Element)] pub struct Pane { id: ElementId, state_type: PhantomData, @@ -21,6 +21,84 @@ pub struct Pane { children: SmallVec<[AnyElement; 2]>, } +impl IntoAnyElement for Pane { + fn into_any(self) -> AnyElement { + ElementRenderer { + id: Some(self.id), + render: Some(move |view_state, cx| self.render(view_state, cx)), + view_type: PhantomData, + element_type: PhantomData, + } + } +} + +struct ElementRenderer +where + E: IntoAnyElement, + F: FnOnce(&mut V, &mut ViewContext) -> E, +{ + id: Option, + render: Option, + view_type: PhantomData, + element_type: PhantomData, +} + +impl Element for ElementRenderer +where + V: 'static, + E: IntoAnyElement, + F: FnOnce(&mut V, &mut ViewContext) -> E, +{ + type ViewState = V; + type ElementState = AnyElement; + + fn id(&self) -> Option { + self.id + } + + fn initialize( + &mut self, + view_state: &mut Self::ViewState, + rendered_element: Option, + cx: &mut ViewContext, + ) -> Self::ElementState { + rendered_element.unwrap_or_else(|| { + let render = self.render.take().unwrap(); + (render)(view_state, cx) + }) + } + + fn layout( + &mut self, + view_state: &mut Self::ViewState, + rendered_element: &mut Self::ElementState, + cx: &mut ViewContext, + ) -> gpui2::LayoutId { + rendered_element.layout(view_state, cx) + } + + fn paint( + &mut self, + bounds: gpui2::Bounds, + view_state: &mut Self::ViewState, + rendered_element: &mut Self::ElementState, + cx: &mut ViewContext, + ) { + rendered_element.paint(view_state, cx) + } +} + +impl IntoAnyElement for ElementRenderer +where + V: 'static, + E: IntoAnyElement, + F: FnOnce(&mut V, &mut ViewContext) -> E, +{ + fn into_any(self) -> AnyElement { + self + } +} + impl Pane { pub fn new(id: impl Into, size: Size) -> Self { // Fill is only here for debugging purposes, remove before release