From bed10b433acc786121da3e512b42ce78618c13a0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 3 Nov 2023 11:36:18 +0100 Subject: [PATCH] Allow converting from a WeakView to an AnyWeakView --- crates/gpui2/src/view.rs | 84 +++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/crates/gpui2/src/view.rs b/crates/gpui2/src/view.rs index d81df5b21c..d12d84f43b 100644 --- a/crates/gpui2/src/view.rs +++ b/crates/gpui2/src/view.rs @@ -1,7 +1,7 @@ use crate::{ private::Sealed, AnyBox, AnyElement, AnyModel, AnyWeakModel, AppContext, AvailableSpace, - BorrowWindow, Bounds, Component, Element, ElementId, Entity, EntityId, Flatten, LayoutId, - Model, Pixels, Size, ViewContext, VisualContext, WeakModel, WindowContext, + Bounds, Component, Element, ElementId, Entity, EntityId, Flatten, LayoutId, Model, Pixels, + Size, ViewContext, VisualContext, WeakModel, WindowContext, }; use anyhow::{Context, Result}; use std::{ @@ -196,31 +196,9 @@ impl From> for AnyView { fn from(value: View) -> Self { AnyView { model: value.model.into_any(), - initialize: |view, cx| { - cx.with_element_id(view.model.entity_id, |_, cx| { - let view = view.clone().downcast::().unwrap(); - let element = view.update(cx, |view, cx| { - let mut element = AnyElement::new(view.render(cx)); - element.initialize(view, cx); - element - }); - Box::new(element) - }) - }, - layout: |view, element, cx| { - cx.with_element_id(view.model.entity_id, |_, cx| { - let view = view.clone().downcast::().unwrap(); - let element = element.downcast_mut::>().unwrap(); - view.update(cx, |view, cx| element.layout(view, cx)) - }) - }, - paint: |view, element, cx| { - cx.with_element_id(view.model.entity_id, |_, cx| { - let view = view.clone().downcast::().unwrap(); - let element = element.downcast_mut::>().unwrap(); - view.update(cx, |view, cx| element.paint(view, cx)) - }) - }, + initialize: any_view::initialize::, + layout: any_view::layout::, + paint: any_view::paint::, } } } @@ -280,6 +258,17 @@ impl AnyWeakView { } } +impl From> for AnyWeakView { + fn from(view: WeakView) -> Self { + Self { + model: view.model.into(), + initialize: any_view::initialize::, + layout: any_view::layout::, + paint: any_view::paint::, + } + } +} + impl Render for T where T: 'static + FnMut(&mut WindowContext) -> E, @@ -291,3 +280,44 @@ where (self)(cx) } } + +mod any_view { + use crate::{AnyElement, AnyView, BorrowWindow, LayoutId, Render, WindowContext}; + use std::any::Any; + + pub(crate) fn initialize(view: &AnyView, cx: &mut WindowContext) -> Box { + cx.with_element_id(view.model.entity_id, |_, cx| { + let view = view.clone().downcast::().unwrap(); + let element = view.update(cx, |view, cx| { + let mut element = AnyElement::new(view.render(cx)); + element.initialize(view, cx); + element + }); + Box::new(element) + }) + } + + pub(crate) fn layout( + view: &AnyView, + element: &mut Box, + cx: &mut WindowContext, + ) -> LayoutId { + cx.with_element_id(view.model.entity_id, |_, cx| { + let view = view.clone().downcast::().unwrap(); + let element = element.downcast_mut::>().unwrap(); + view.update(cx, |view, cx| element.layout(view, cx)) + }) + } + + pub(crate) fn paint( + view: &AnyView, + element: &mut Box, + cx: &mut WindowContext, + ) { + cx.with_element_id(view.model.entity_id, |_, cx| { + let view = view.clone().downcast::().unwrap(); + let element = element.downcast_mut::>().unwrap(); + view.update(cx, |view, cx| element.paint(view, cx)) + }) + } +}