use masonry::core::{FromDynWidget, NewWidget, Widget, WidgetMut};
use crate::ViewCtx;
use crate::core::{Mut, SuperElement, ViewElement};
#[expect(missing_docs, reason = "TODO - Document these items")]
pub struct Pod<W: Widget + FromDynWidget + ?Sized> {
pub new_widget: NewWidget<W>,
}
impl<W: Widget + FromDynWidget> Pod<W> {
pub fn new(widget: W) -> Self {
Self {
new_widget: NewWidget::new(widget),
}
}
}
impl<W: Widget + FromDynWidget + ?Sized> Pod<W> {
pub fn erased(self) -> Pod<dyn Widget> {
Pod {
new_widget: self.new_widget.erased(),
}
}
}
impl<W: Widget + FromDynWidget + ?Sized> ViewElement for Pod<W> {
type Mut<'a> = WidgetMut<'a, W>;
}
impl<W: Widget + FromDynWidget + ?Sized> SuperElement<Pod<W>, ViewCtx> for Pod<dyn Widget> {
fn upcast(_: &mut ViewCtx, child: Pod<W>) -> Self {
child.erased()
}
fn with_downcast_val<R>(
mut this: Self::Mut<'_>,
f: impl FnOnce(Mut<'_, Pod<W>>) -> R,
) -> (Self::Mut<'_>, R) {
let downcast = this.downcast();
let ret = f(downcast);
(this, ret)
}
}