add AnyViewPort
This commit is contained in:
parent
a1b95c5892
commit
1448f31cf4
1 changed files with 69 additions and 0 deletions
|
@ -158,3 +158,72 @@ where V::Msg: Clone {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct AnyViewPort {
|
||||||
|
view: Arc<dyn Any + Send + Sync + 'static>,
|
||||||
|
observers: Arc<dyn Any + Send + Sync + 'static>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AnyViewPort {
|
||||||
|
pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<ViewPort<V>, AnyViewPort> {
|
||||||
|
match (
|
||||||
|
self.view.clone().downcast::<RwLock<Option<Arc<V>>>>(),
|
||||||
|
self.observers.clone().downcast::<RwLock<ObserverBroadcast<V>>>()
|
||||||
|
) {
|
||||||
|
(Ok(view), Ok(observers)) => Ok(ViewPort{view, observers}),
|
||||||
|
_ => Err(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<V: View + ?Sized + 'static> From<ViewPort<V>> for AnyViewPort {
|
||||||
|
fn from(port: ViewPort<V>) -> Self {
|
||||||
|
AnyViewPort {
|
||||||
|
view: port.view as Arc<dyn Any + Send + Sync + 'static>,
|
||||||
|
observers: port.observers as Arc<dyn Any + Send + Sync + 'static>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct AnyOuterViewPort(AnyViewPort);
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct AnyInnerViewPort(AnyViewPort);
|
||||||
|
|
||||||
|
impl AnyOuterViewPort {
|
||||||
|
pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<OuterViewPort<V>, AnyViewPort> {
|
||||||
|
Ok(OuterViewPort(self.0.downcast::<V>()?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<V: View + ?Sized + 'static> From<OuterViewPort<V>> for AnyOuterViewPort {
|
||||||
|
fn from(port: OuterViewPort<V>) -> Self {
|
||||||
|
AnyOuterViewPort(AnyViewPort{
|
||||||
|
view: port.0.view as Arc<dyn Any + Send + Sync + 'static>,
|
||||||
|
observers: port.0.observers as Arc<dyn Any + Send + Sync + 'static>
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AnyInnerViewPort {
|
||||||
|
pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<InnerViewPort<V>, AnyViewPort> {
|
||||||
|
Ok(InnerViewPort(self.0.downcast::<V>()?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<V: View + ?Sized + 'static> From<InnerViewPort<V>> for AnyInnerViewPort {
|
||||||
|
fn from(port: InnerViewPort<V>) -> Self {
|
||||||
|
AnyInnerViewPort(AnyViewPort{
|
||||||
|
view: port.0.view as Arc<dyn Any + Send + Sync + 'static>,
|
||||||
|
observers: port.0.observers as Arc<dyn Any + Send + Sync + 'static>
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue