mirror of https://github.com/linebender/xilem
Reserve ability to create Pod to ViewCtx (#597)
This is another intermediary PR for the "restrict widget creation to Mutate pass" feature. The basic idea is that, in the near future, it will be impossible to create a WidgetPod without a handle to the arena. In my current WIP code, that handle is passed through ViewCtx. Therefore, this PR changes all the sites in xilem that create a Pod and has them use a ViewCtx method instead. I've tested most xilem examples and they all worked (except for variable_clock, which currently panics in the last main commit).
This commit is contained in:
parent
6c91b74e97
commit
25218291d0
|
@ -25,12 +25,12 @@ use crate::{Pod, ViewCtx};
|
||||||
pub type AnyWidgetView<State, Action = ()> =
|
pub type AnyWidgetView<State, Action = ()> =
|
||||||
dyn AnyView<State, Action, ViewCtx, Pod<DynWidget>> + Send + Sync;
|
dyn AnyView<State, Action, ViewCtx, Pod<DynWidget>> + Send + Sync;
|
||||||
|
|
||||||
impl<W: Widget> SuperElement<Pod<W>> for Pod<DynWidget> {
|
impl<W: Widget> SuperElement<Pod<W>, ViewCtx> for Pod<DynWidget> {
|
||||||
fn upcast(child: Pod<W>) -> Self {
|
fn upcast(ctx: &mut ViewCtx, child: Pod<W>) -> Self {
|
||||||
WidgetPod::new(DynWidget {
|
let boxed_pod = ctx.boxed_pod(child);
|
||||||
inner: child.inner.boxed(),
|
ctx.new_pod(DynWidget {
|
||||||
|
inner: boxed_pod.inner.boxed(),
|
||||||
})
|
})
|
||||||
.into()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_downcast_val<R>(
|
fn with_downcast_val<R>(
|
||||||
|
@ -47,7 +47,7 @@ impl<W: Widget> SuperElement<Pod<W>> for Pod<DynWidget> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> AnyElement<Pod<W>> for Pod<DynWidget> {
|
impl<W: Widget> AnyElement<Pod<W>, ViewCtx> for Pod<DynWidget> {
|
||||||
fn replace_inner(mut this: Self::Mut<'_>, child: Pod<W>) -> Self::Mut<'_> {
|
fn replace_inner(mut this: Self::Mut<'_>, child: Pod<W>) -> Self::Mut<'_> {
|
||||||
DynWidget::replace_inner(&mut this, child.inner.boxed());
|
DynWidget::replace_inner(&mut this, child.inner.boxed());
|
||||||
this
|
this
|
||||||
|
|
|
@ -156,26 +156,13 @@ pub struct Pod<W: Widget> {
|
||||||
pub inner: WidgetPod<W>,
|
pub inner: WidgetPod<W>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> Pod<W> {
|
|
||||||
/// Create a new `Pod` for `inner`.
|
|
||||||
pub fn new(inner: W) -> Self {
|
|
||||||
Self::from(WidgetPod::new(inner))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<W: Widget> From<WidgetPod<W>> for Pod<W> {
|
|
||||||
fn from(inner: WidgetPod<W>) -> Self {
|
|
||||||
Pod { inner }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<W: Widget> ViewElement for Pod<W> {
|
impl<W: Widget> ViewElement for Pod<W> {
|
||||||
type Mut<'a> = WidgetMut<'a, W>;
|
type Mut<'a> = WidgetMut<'a, W>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> SuperElement<Pod<W>> for Pod<Box<dyn Widget>> {
|
impl<W: Widget> SuperElement<Pod<W>, ViewCtx> for Pod<Box<dyn Widget>> {
|
||||||
fn upcast(child: Pod<W>) -> Self {
|
fn upcast(ctx: &mut ViewCtx, child: Pod<W>) -> Self {
|
||||||
child.inner.boxed().into()
|
ctx.boxed_pod(child)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_downcast_val<R>(
|
fn with_downcast_val<R>(
|
||||||
|
@ -274,6 +261,18 @@ impl ViewPathTracker for ViewCtx {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ViewCtx {
|
impl ViewCtx {
|
||||||
|
pub fn new_pod<W: Widget>(&mut self, widget: W) -> Pod<W> {
|
||||||
|
Pod {
|
||||||
|
inner: WidgetPod::new(widget),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn boxed_pod<W: Widget>(&mut self, pod: Pod<W>) -> Pod<Box<dyn Widget>> {
|
||||||
|
Pod {
|
||||||
|
inner: pod.inner.boxed(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mark_changed(&mut self) {
|
pub fn mark_changed(&mut self) {
|
||||||
if cfg!(debug_assertions) {
|
if cfg!(debug_assertions) {
|
||||||
self.view_tree_changed = true;
|
self.view_tree_changed = true;
|
||||||
|
|
|
@ -120,6 +120,7 @@ impl<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn upcast_one_of_element(
|
fn upcast_one_of_element(
|
||||||
|
&mut self,
|
||||||
elem: xilem_core::one_of::OneOf<
|
elem: xilem_core::one_of::OneOf<
|
||||||
Pod<A>,
|
Pod<A>,
|
||||||
Pod<B>,
|
Pod<B>,
|
||||||
|
@ -133,15 +134,15 @@ impl<
|
||||||
>,
|
>,
|
||||||
) -> Self::OneOfElement {
|
) -> Self::OneOfElement {
|
||||||
match elem {
|
match elem {
|
||||||
xilem_core::one_of::OneOf::A(w) => Pod::new(OneOfWidget::A(w.inner)),
|
xilem_core::one_of::OneOf::A(w) => self.new_pod(OneOfWidget::A(w.inner)),
|
||||||
xilem_core::one_of::OneOf::B(w) => Pod::new(OneOfWidget::B(w.inner)),
|
xilem_core::one_of::OneOf::B(w) => self.new_pod(OneOfWidget::B(w.inner)),
|
||||||
xilem_core::one_of::OneOf::C(w) => Pod::new(OneOfWidget::C(w.inner)),
|
xilem_core::one_of::OneOf::C(w) => self.new_pod(OneOfWidget::C(w.inner)),
|
||||||
xilem_core::one_of::OneOf::D(w) => Pod::new(OneOfWidget::D(w.inner)),
|
xilem_core::one_of::OneOf::D(w) => self.new_pod(OneOfWidget::D(w.inner)),
|
||||||
xilem_core::one_of::OneOf::E(w) => Pod::new(OneOfWidget::E(w.inner)),
|
xilem_core::one_of::OneOf::E(w) => self.new_pod(OneOfWidget::E(w.inner)),
|
||||||
xilem_core::one_of::OneOf::F(w) => Pod::new(OneOfWidget::F(w.inner)),
|
xilem_core::one_of::OneOf::F(w) => self.new_pod(OneOfWidget::F(w.inner)),
|
||||||
xilem_core::one_of::OneOf::G(w) => Pod::new(OneOfWidget::G(w.inner)),
|
xilem_core::one_of::OneOf::G(w) => self.new_pod(OneOfWidget::G(w.inner)),
|
||||||
xilem_core::one_of::OneOf::H(w) => Pod::new(OneOfWidget::H(w.inner)),
|
xilem_core::one_of::OneOf::H(w) => self.new_pod(OneOfWidget::H(w.inner)),
|
||||||
xilem_core::one_of::OneOf::I(w) => Pod::new(OneOfWidget::I(w.inner)),
|
xilem_core::one_of::OneOf::I(w) => self.new_pod(OneOfWidget::I(w.inner)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ where
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
ctx.with_leaf_action_widget(|_| Pod::new(widget::Button::new(self.label.clone())))
|
ctx.with_leaf_action_widget(|ctx| ctx.new_pod(widget::Button::new(self.label.clone())))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -36,8 +36,8 @@ where
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
ctx.with_leaf_action_widget(|_| {
|
ctx.with_leaf_action_widget(|ctx| {
|
||||||
Pod::new(masonry::widget::Checkbox::new(
|
ctx.new_pod(masonry::widget::Checkbox::new(
|
||||||
self.checked,
|
self.checked,
|
||||||
self.label.clone(),
|
self.label.clone(),
|
||||||
))
|
))
|
||||||
|
|
|
@ -115,7 +115,7 @@ where
|
||||||
FlexElement::FlexSpacer(flex) => widget.with_flex_spacer(flex),
|
FlexElement::FlexSpacer(flex) => widget.with_flex_spacer(flex),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Pod::new(widget), seq_state)
|
(ctx.new_pod(widget), seq_state)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
@ -209,8 +209,8 @@ impl ViewElement for FlexElement {
|
||||||
type Mut<'w> = FlexElementMut<'w>;
|
type Mut<'w> = FlexElementMut<'w>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SuperElement<FlexElement> for FlexElement {
|
impl SuperElement<FlexElement, ViewCtx> for FlexElement {
|
||||||
fn upcast(child: FlexElement) -> Self {
|
fn upcast(_ctx: &mut ViewCtx, child: FlexElement) -> Self {
|
||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,9 +230,9 @@ impl SuperElement<FlexElement> for FlexElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> SuperElement<Pod<W>> for FlexElement {
|
impl<W: Widget> SuperElement<Pod<W>, ViewCtx> for FlexElement {
|
||||||
fn upcast(child: Pod<W>) -> Self {
|
fn upcast(ctx: &mut ViewCtx, child: Pod<W>) -> Self {
|
||||||
FlexElement::Child(child.inner.boxed().into(), FlexParams::default())
|
FlexElement::Child(ctx.boxed_pod(child), FlexParams::default())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_downcast_val<R>(
|
fn with_downcast_val<R>(
|
||||||
|
@ -450,10 +450,7 @@ where
|
||||||
|
|
||||||
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
let (pod, state) = self.view.build(ctx);
|
let (pod, state) = self.view.build(ctx);
|
||||||
(
|
(FlexElement::Child(ctx.boxed_pod(pod), self.params), state)
|
||||||
FlexElement::Child(pod.inner.boxed().into(), self.params),
|
|
||||||
state,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -74,7 +74,7 @@ where
|
||||||
GridElement::Child(child, params) => widget.with_child_pod(child.inner, params),
|
GridElement::Child(child, params) => widget.with_child_pod(child.inner, params),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Pod::new(widget), seq_state)
|
(ctx.new_pod(widget), seq_state)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
@ -133,8 +133,8 @@ impl ViewElement for GridElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used to allow the item to be used as a generic item in ViewSequence.
|
// Used to allow the item to be used as a generic item in ViewSequence.
|
||||||
impl SuperElement<GridElement> for GridElement {
|
impl SuperElement<GridElement, ViewCtx> for GridElement {
|
||||||
fn upcast(child: GridElement) -> Self {
|
fn upcast(_ctx: &mut ViewCtx, child: GridElement) -> Self {
|
||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,14 +154,14 @@ impl SuperElement<GridElement> for GridElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> SuperElement<Pod<W>> for GridElement {
|
impl<W: Widget> SuperElement<Pod<W>, ViewCtx> for GridElement {
|
||||||
fn upcast(child: Pod<W>) -> Self {
|
fn upcast(ctx: &mut ViewCtx, child: Pod<W>) -> Self {
|
||||||
// Getting here means that the widget didn't use .grid_item or .grid_pos.
|
// Getting here means that the widget didn't use .grid_item or .grid_pos.
|
||||||
// This currently places the widget in the top left cell.
|
// This currently places the widget in the top left cell.
|
||||||
// There is not much else, beyond purposefully failing, that can be done here,
|
// There is not much else, beyond purposefully failing, that can be done here,
|
||||||
// because there isn't enough information to determine an appropriate spot
|
// because there isn't enough information to determine an appropriate spot
|
||||||
// for the widget.
|
// for the widget.
|
||||||
GridElement::Child(child.inner.boxed().into(), GridParams::new(1, 1, 1, 1))
|
GridElement::Child(ctx.boxed_pod(child), GridParams::new(1, 1, 1, 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_downcast_val<R>(
|
fn with_downcast_val<R>(
|
||||||
|
@ -362,12 +362,9 @@ where
|
||||||
|
|
||||||
type ViewState = V::ViewState;
|
type ViewState = V::ViewState;
|
||||||
|
|
||||||
fn build(&self, cx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
let (pod, state) = self.view.build(cx);
|
let (pod, state) = self.view.build(ctx);
|
||||||
(
|
(GridElement::Child(ctx.boxed_pod(pod), self.params), state)
|
||||||
GridElement::Child(pod.inner.boxed().into(), self.params),
|
|
||||||
state,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -49,8 +49,8 @@ impl<State, Action> View<State, Action, ViewCtx> for Image {
|
||||||
type Element = Pod<widget::Image>;
|
type Element = Pod<widget::Image>;
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, _: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
(Pod::new(widget::Image::new(self.image.clone())), ())
|
(ctx.new_pod(widget::Image::new(self.image.clone())), ())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -48,8 +48,8 @@ impl<State, Action> View<State, Action, ViewCtx> for Label {
|
||||||
type Element = Pod<widget::Label>;
|
type Element = Pod<widget::Label>;
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
let widget_pod = Pod::new(
|
let widget_pod = ctx.new_pod(
|
||||||
widget::Label::new(self.label.clone())
|
widget::Label::new(self.label.clone())
|
||||||
.with_text_brush(self.text_brush.clone())
|
.with_text_brush(self.text_brush.clone())
|
||||||
.with_text_alignment(self.alignment)
|
.with_text_alignment(self.alignment)
|
||||||
|
|
|
@ -40,7 +40,7 @@ where
|
||||||
// The Portal `View` doesn't get any messages directly (yet - scroll events?), so doesn't need to
|
// The Portal `View` doesn't get any messages directly (yet - scroll events?), so doesn't need to
|
||||||
// use ctx.with_id.
|
// use ctx.with_id.
|
||||||
let (child, child_state) = self.child.build(ctx);
|
let (child, child_state) = self.child.build(ctx);
|
||||||
let widget_pod = Pod::new(widget::Portal::new_pod(child.inner));
|
let widget_pod = ctx.new_pod(widget::Portal::new_pod(child.inner));
|
||||||
(widget_pod, child_state)
|
(widget_pod, child_state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,9 @@ impl<State, Action> View<State, Action, ViewCtx> for ProgressBar {
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
ctx.with_leaf_action_widget(|_| Pod::new(masonry::widget::ProgressBar::new(self.progress)))
|
ctx.with_leaf_action_widget(|ctx| {
|
||||||
|
ctx.new_pod(masonry::widget::ProgressBar::new(self.progress))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -49,8 +49,8 @@ impl<State, Action> View<State, Action, ViewCtx> for Prose {
|
||||||
type Element = Pod<widget::Prose>;
|
type Element = Pod<widget::Prose>;
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
let widget_pod = Pod::new(
|
let widget_pod = ctx.new_pod(
|
||||||
widget::Prose::new(self.content.clone())
|
widget::Prose::new(self.content.clone())
|
||||||
.with_text_brush(self.text_brush.clone())
|
.with_text_brush(self.text_brush.clone())
|
||||||
.with_text_alignment(self.alignment)
|
.with_text_alignment(self.alignment)
|
||||||
|
|
|
@ -135,7 +135,7 @@ where
|
||||||
if let Some(border) = &self.border {
|
if let Some(border) = &self.border {
|
||||||
widget = widget.border(border.color, border.width);
|
widget = widget.border(border.color, border.width);
|
||||||
}
|
}
|
||||||
(Pod::new(widget), child_state)
|
(ctx.new_pod(widget), child_state)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -55,8 +55,8 @@ impl<State, Action> View<State, Action, ViewCtx> for Spinner {
|
||||||
type Element = Pod<widget::Spinner>;
|
type Element = Pod<widget::Spinner>;
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, _: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
(Pod::new(widget::Spinner::new()), ())
|
(ctx.new_pod(widget::Spinner::new()), ())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rebuild<'el>(
|
fn rebuild<'el>(
|
||||||
|
|
|
@ -69,8 +69,8 @@ impl<State: 'static, Action: 'static> View<State, Action, ViewCtx> for Textbox<S
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
ctx.with_leaf_action_widget(|_| {
|
ctx.with_leaf_action_widget(|ctx| {
|
||||||
Pod::new(
|
ctx.new_pod(
|
||||||
masonry::widget::Textbox::new(self.contents.clone())
|
masonry::widget::Textbox::new(self.contents.clone())
|
||||||
.with_text_brush(self.text_brush.clone())
|
.with_text_brush(self.text_brush.clone())
|
||||||
.with_text_alignment(self.alignment),
|
.with_text_alignment(self.alignment),
|
||||||
|
|
|
@ -100,8 +100,8 @@ impl<State, Action> View<State, Action, ViewCtx> for VariableLabel {
|
||||||
type Element = Pod<widget::VariableLabel>;
|
type Element = Pod<widget::VariableLabel>;
|
||||||
type ViewState = ();
|
type ViewState = ();
|
||||||
|
|
||||||
fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) {
|
||||||
let widget_pod = Pod::new(
|
let widget_pod = ctx.new_pod(
|
||||||
widget::VariableLabel::new(self.label.clone())
|
widget::VariableLabel::new(self.label.clone())
|
||||||
.with_text_brush(self.text_brush.clone())
|
.with_text_brush(self.text_brush.clone())
|
||||||
.with_line_break_mode(widget::LineBreaking::WordWrap)
|
.with_line_break_mode(widget::LineBreaking::WordWrap)
|
||||||
|
|
|
@ -98,8 +98,8 @@ impl<V, State, Action> FileView<State, Action> for V where
|
||||||
|
|
||||||
type DynFileView<State, Action = ()> = Box<dyn AnyView<State, Action, ViewCtx, FsPath>>;
|
type DynFileView<State, Action = ()> = Box<dyn AnyView<State, Action, ViewCtx, FsPath>>;
|
||||||
|
|
||||||
impl SuperElement<FsPath> for FsPath {
|
impl SuperElement<FsPath, ViewCtx> for FsPath {
|
||||||
fn upcast(child: FsPath) -> Self {
|
fn upcast(_ctx: &mut ViewCtx, child: FsPath) -> Self {
|
||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ impl SuperElement<FsPath> for FsPath {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AnyElement<FsPath> for FsPath {
|
impl AnyElement<FsPath, ViewCtx> for FsPath {
|
||||||
fn replace_inner(this: Self::Mut<'_>, child: FsPath) -> Self::Mut<'_> {
|
fn replace_inner(this: Self::Mut<'_>, child: FsPath) -> Self::Mut<'_> {
|
||||||
*this = child.0;
|
*this = child.0;
|
||||||
this
|
this
|
||||||
|
|
|
@ -99,8 +99,8 @@ impl Widget for ButtonWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: Widget> SuperElement<WidgetPod<W>> for WidgetPod<Box<dyn Widget>> {
|
impl<W: Widget> SuperElement<WidgetPod<W>, ViewCtx> for WidgetPod<Box<dyn Widget>> {
|
||||||
fn upcast(child: WidgetPod<W>) -> Self {
|
fn upcast(_ctx: &mut ViewCtx, child: WidgetPod<W>) -> Self {
|
||||||
WidgetPod {
|
WidgetPod {
|
||||||
widget: Box::new(child.widget),
|
widget: Box::new(child.widget),
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ pub trait AnyView<State, Action, Context, Element: ViewElement, Message = DynMes
|
||||||
impl<State, Action, Context, DynamicElement, Message, V>
|
impl<State, Action, Context, DynamicElement, Message, V>
|
||||||
AnyView<State, Action, Context, DynamicElement, Message> for V
|
AnyView<State, Action, Context, DynamicElement, Message> for V
|
||||||
where
|
where
|
||||||
DynamicElement: AnyElement<V::Element>,
|
DynamicElement: AnyElement<V::Element, Context>,
|
||||||
Context: ViewPathTracker,
|
Context: ViewPathTracker,
|
||||||
V: View<State, Action, Context, Message> + 'static,
|
V: View<State, Action, Context, Message> + 'static,
|
||||||
V::ViewState: 'static,
|
V::ViewState: 'static,
|
||||||
|
@ -80,7 +80,7 @@ where
|
||||||
let generation = 0;
|
let generation = 0;
|
||||||
let (element, view_state) = ctx.with_id(ViewId::new(generation), |ctx| self.build(ctx));
|
let (element, view_state) = ctx.with_id(ViewId::new(generation), |ctx| self.build(ctx));
|
||||||
(
|
(
|
||||||
DynamicElement::upcast(element),
|
DynamicElement::upcast(ctx, element),
|
||||||
AnyViewState {
|
AnyViewState {
|
||||||
inner_state: Box::new(view_state),
|
inner_state: Box::new(view_state),
|
||||||
generation,
|
generation,
|
||||||
|
|
|
@ -42,12 +42,12 @@ pub type Mut<'el, E> = <E as ViewElement>::Mut<'el>;
|
||||||
///
|
///
|
||||||
/// [`AnyView`]: crate::AnyView
|
/// [`AnyView`]: crate::AnyView
|
||||||
/// [`ViewSequence`]: crate::ViewSequence
|
/// [`ViewSequence`]: crate::ViewSequence
|
||||||
pub trait SuperElement<Child>: ViewElement
|
pub trait SuperElement<Child, Context>: ViewElement
|
||||||
where
|
where
|
||||||
Child: ViewElement,
|
Child: ViewElement,
|
||||||
{
|
{
|
||||||
/// Convert from the child to this element type.
|
/// Convert from the child to this element type.
|
||||||
fn upcast(child: Child) -> Self;
|
fn upcast(ctx: &mut Context, child: Child) -> Self;
|
||||||
|
|
||||||
/// Perform a reborrowing downcast to the child reference type.
|
/// Perform a reborrowing downcast to the child reference type.
|
||||||
///
|
///
|
||||||
|
@ -75,7 +75,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An element which can be used for an [`AnyView`](crate::AnyView) containing `Child`.
|
/// An element which can be used for an [`AnyView`](crate::AnyView) containing `Child`.
|
||||||
pub trait AnyElement<Child>: SuperElement<Child>
|
pub trait AnyElement<Child, Context>: SuperElement<Child, Context>
|
||||||
where
|
where
|
||||||
Child: ViewElement,
|
Child: ViewElement,
|
||||||
{
|
{
|
||||||
|
@ -95,8 +95,8 @@ impl ViewElement for NoElement {
|
||||||
type Mut<'a> = ();
|
type Mut<'a> = ();
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SuperElement<NoElement> for NoElement {
|
impl<Context> SuperElement<NoElement, Context> for NoElement {
|
||||||
fn upcast(child: NoElement) -> Self {
|
fn upcast(_ctx: &mut Context, child: NoElement) -> Self {
|
||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -150,14 +150,14 @@ impl<State, Action, Context, V, Element, Message>
|
||||||
where
|
where
|
||||||
Context: ViewPathTracker,
|
Context: ViewPathTracker,
|
||||||
V: View<State, Action, Context, Message> + ViewMarker,
|
V: View<State, Action, Context, Message> + ViewMarker,
|
||||||
Element: SuperElement<V::Element>,
|
Element: SuperElement<V::Element, Context>,
|
||||||
V::Element: ViewElement,
|
V::Element: ViewElement,
|
||||||
{
|
{
|
||||||
type SeqState = V::ViewState;
|
type SeqState = V::ViewState;
|
||||||
|
|
||||||
fn seq_build(&self, ctx: &mut Context, elements: &mut AppendVec<Element>) -> Self::SeqState {
|
fn seq_build(&self, ctx: &mut Context, elements: &mut AppendVec<Element>) -> Self::SeqState {
|
||||||
let (element, view_state) = self.build(ctx);
|
let (element, view_state) = self.build(ctx);
|
||||||
elements.push(Element::upcast(element));
|
elements.push(Element::upcast(ctx, element));
|
||||||
view_state
|
view_state
|
||||||
}
|
}
|
||||||
fn seq_rebuild(
|
fn seq_rebuild(
|
||||||
|
|
|
@ -137,7 +137,10 @@ pub trait OneOfCtx<
|
||||||
fn with_downcast_i(elem: &mut Mut<'_, Self::OneOfElement>, f: impl FnOnce(Mut<'_, I>));
|
fn with_downcast_i(elem: &mut Mut<'_, Self::OneOfElement>, f: impl FnOnce(Mut<'_, I>));
|
||||||
|
|
||||||
/// Creates the wrapping element, this is used in `View::build` to wrap the inner view element variant
|
/// Creates the wrapping element, this is used in `View::build` to wrap the inner view element variant
|
||||||
fn upcast_one_of_element(elem: OneOf<A, B, C, D, E, F, G, H, I>) -> Self::OneOfElement;
|
fn upcast_one_of_element(
|
||||||
|
&mut self,
|
||||||
|
elem: OneOf<A, B, C, D, E, F, G, H, I>,
|
||||||
|
) -> Self::OneOfElement;
|
||||||
|
|
||||||
/// When the variant of the inner view element has changed, the wrapping element needs to be updated, this is used in `View::rebuild`
|
/// When the variant of the inner view element has changed, the wrapping element needs to be updated, this is used in `View::rebuild`
|
||||||
fn update_one_of_element_mut(
|
fn update_one_of_element_mut(
|
||||||
|
@ -233,7 +236,7 @@ where
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
(
|
(
|
||||||
Context::upcast_one_of_element(element),
|
ctx.upcast_one_of_element(element),
|
||||||
OneOfState {
|
OneOfState {
|
||||||
generation,
|
generation,
|
||||||
inner_state: state,
|
inner_state: state,
|
||||||
|
|
|
@ -210,8 +210,8 @@ impl<const N: u32> View<(), Action, TestCtx> for OperationView<N> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SuperElement<TestElement> for TestElement {
|
impl SuperElement<TestElement, TestCtx> for TestElement {
|
||||||
fn upcast(child: TestElement) -> Self {
|
fn upcast(_ctx: &mut TestCtx, child: TestElement) -> Self {
|
||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ impl SuperElement<TestElement> for TestElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AnyElement<TestElement> for TestElement {
|
impl AnyElement<TestElement, TestCtx> for TestElement {
|
||||||
fn replace_inner(this: Self::Mut<'_>, child: TestElement) -> Self::Mut<'_> {
|
fn replace_inner(this: Self::Mut<'_>, child: TestElement) -> Self::Mut<'_> {
|
||||||
assert_eq!(child.operations.len(), 1);
|
assert_eq!(child.operations.len(), 1);
|
||||||
let Operation::Build(child_id) = child.operations.first().unwrap() else {
|
let Operation::Build(child_id) = child.operations.first().unwrap() else {
|
||||||
|
|
|
@ -41,6 +41,7 @@ impl
|
||||||
type OneOfElement = TestElement;
|
type OneOfElement = TestElement;
|
||||||
|
|
||||||
fn upcast_one_of_element(
|
fn upcast_one_of_element(
|
||||||
|
&mut self,
|
||||||
elem: OneOf<
|
elem: OneOf<
|
||||||
TestElement,
|
TestElement,
|
||||||
TestElement,
|
TestElement,
|
||||||
|
|
|
@ -269,8 +269,8 @@ impl<E: DomNode<P>, P: 'static> ViewElement for Pod<E, P> {
|
||||||
type Mut<'a> = PodMut<'a, E, P>;
|
type Mut<'a> = PodMut<'a, E, P>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E: DomNode<P>, P: 'static> SuperElement<Pod<E, P>> for AnyPod {
|
impl<E: DomNode<P>, P: 'static> SuperElement<Pod<E, P>, ViewCtx> for AnyPod {
|
||||||
fn upcast(child: Pod<E, P>) -> Self {
|
fn upcast(_ctx: &mut ViewCtx, child: Pod<E, P>) -> Self {
|
||||||
Pod::into_dyn_node(child.node, child.props)
|
Pod::into_dyn_node(child.node, child.props)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ impl<E: DomNode<P>, P: 'static> SuperElement<Pod<E, P>> for AnyPod {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E: DomNode<P>, P: 'static> AnyElement<Pod<E, P>> for AnyPod {
|
impl<E: DomNode<P>, P: 'static> AnyElement<Pod<E, P>, ViewCtx> for AnyPod {
|
||||||
fn replace_inner(mut this: Self::Mut<'_>, child: Pod<E, P>) -> Self::Mut<'_> {
|
fn replace_inner(mut this: Self::Mut<'_>, child: Pod<E, P>) -> Self::Mut<'_> {
|
||||||
Pod::replace_inner(&mut this, child);
|
Pod::replace_inner(&mut this, child);
|
||||||
this
|
this
|
||||||
|
|
|
@ -50,6 +50,7 @@ where
|
||||||
Pod<OneOf<N1, N2, N3, N4, N5, N6, N7, N8, N9>, OneOf<P1, P2, P3, P4, P5, P6, P7, P8, P9>>;
|
Pod<OneOf<N1, N2, N3, N4, N5, N6, N7, N8, N9>, OneOf<P1, P2, P3, P4, P5, P6, P7, P8, P9>>;
|
||||||
|
|
||||||
fn upcast_one_of_element(
|
fn upcast_one_of_element(
|
||||||
|
&mut self,
|
||||||
elem: OneOf<
|
elem: OneOf<
|
||||||
Pod<N1, P1>,
|
Pod<N1, P1>,
|
||||||
Pod<N2, P2>,
|
Pod<N2, P2>,
|
||||||
|
|
Loading…
Reference in New Issue