Allow converting from a WeakView<V> to an AnyWeakView
This commit is contained in:
parent
6fc7b17259
commit
bed10b433a
1 changed files with 57 additions and 27 deletions
|
@ -1,7 +1,7 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
private::Sealed, AnyBox, AnyElement, AnyModel, AnyWeakModel, AppContext, AvailableSpace,
|
private::Sealed, AnyBox, AnyElement, AnyModel, AnyWeakModel, AppContext, AvailableSpace,
|
||||||
BorrowWindow, Bounds, Component, Element, ElementId, Entity, EntityId, Flatten, LayoutId,
|
Bounds, Component, Element, ElementId, Entity, EntityId, Flatten, LayoutId, Model, Pixels,
|
||||||
Model, Pixels, Size, ViewContext, VisualContext, WeakModel, WindowContext,
|
Size, ViewContext, VisualContext, WeakModel, WindowContext,
|
||||||
};
|
};
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -196,31 +196,9 @@ impl<V: Render> From<View<V>> for AnyView {
|
||||||
fn from(value: View<V>) -> Self {
|
fn from(value: View<V>) -> Self {
|
||||||
AnyView {
|
AnyView {
|
||||||
model: value.model.into_any(),
|
model: value.model.into_any(),
|
||||||
initialize: |view, cx| {
|
initialize: any_view::initialize::<V>,
|
||||||
cx.with_element_id(view.model.entity_id, |_, cx| {
|
layout: any_view::layout::<V>,
|
||||||
let view = view.clone().downcast::<V>().unwrap();
|
paint: any_view::paint::<V>,
|
||||||
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::<V>().unwrap();
|
|
||||||
let element = element.downcast_mut::<AnyElement<V>>().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::<V>().unwrap();
|
|
||||||
let element = element.downcast_mut::<AnyElement<V>>().unwrap();
|
|
||||||
view.update(cx, |view, cx| element.paint(view, cx))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,6 +258,17 @@ impl AnyWeakView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<V: Render> From<WeakView<V>> for AnyWeakView {
|
||||||
|
fn from(view: WeakView<V>) -> Self {
|
||||||
|
Self {
|
||||||
|
model: view.model.into(),
|
||||||
|
initialize: any_view::initialize::<V>,
|
||||||
|
layout: any_view::layout::<V>,
|
||||||
|
paint: any_view::paint::<V>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T, E> Render for T
|
impl<T, E> Render for T
|
||||||
where
|
where
|
||||||
T: 'static + FnMut(&mut WindowContext) -> E,
|
T: 'static + FnMut(&mut WindowContext) -> E,
|
||||||
|
@ -291,3 +280,44 @@ where
|
||||||
(self)(cx)
|
(self)(cx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod any_view {
|
||||||
|
use crate::{AnyElement, AnyView, BorrowWindow, LayoutId, Render, WindowContext};
|
||||||
|
use std::any::Any;
|
||||||
|
|
||||||
|
pub(crate) fn initialize<V: Render>(view: &AnyView, cx: &mut WindowContext) -> Box<dyn Any> {
|
||||||
|
cx.with_element_id(view.model.entity_id, |_, cx| {
|
||||||
|
let view = view.clone().downcast::<V>().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<V: Render>(
|
||||||
|
view: &AnyView,
|
||||||
|
element: &mut Box<dyn Any>,
|
||||||
|
cx: &mut WindowContext,
|
||||||
|
) -> LayoutId {
|
||||||
|
cx.with_element_id(view.model.entity_id, |_, cx| {
|
||||||
|
let view = view.clone().downcast::<V>().unwrap();
|
||||||
|
let element = element.downcast_mut::<AnyElement<V>>().unwrap();
|
||||||
|
view.update(cx, |view, cx| element.layout(view, cx))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn paint<V: Render>(
|
||||||
|
view: &AnyView,
|
||||||
|
element: &mut Box<dyn Any>,
|
||||||
|
cx: &mut WindowContext,
|
||||||
|
) {
|
||||||
|
cx.with_element_id(view.model.entity_id, |_, cx| {
|
||||||
|
let view = view.clone().downcast::<V>().unwrap();
|
||||||
|
let element = element.downcast_mut::<AnyElement<V>>().unwrap();
|
||||||
|
view.update(cx, |view, cx| element.paint(view, cx))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue