From c6f60a9dae0f37ca24a75578e82a4f94da1ffa4b Mon Sep 17 00:00:00 2001 From: Olivier FAURE Date: Wed, 18 Sep 2024 13:15:16 +0200 Subject: [PATCH] Reserve ability to create Pod to ViewCtx --- xilem/src/any_view.rs | 12 +++++------ xilem/src/lib.rs | 31 +++++++++++++-------------- xilem/src/one_of.rs | 19 ++++++++-------- xilem/src/view/button.rs | 2 +- xilem/src/view/checkbox.rs | 4 ++-- xilem/src/view/flex.rs | 17 ++++++--------- xilem/src/view/grid.rs | 21 ++++++++---------- xilem/src/view/image.rs | 4 ++-- xilem/src/view/label.rs | 4 ++-- xilem/src/view/portal.rs | 2 +- xilem/src/view/progress_bar.rs | 4 +++- xilem/src/view/prose.rs | 4 ++-- xilem/src/view/sized_box.rs | 2 +- xilem/src/view/spinner.rs | 4 ++-- xilem/src/view/textbox.rs | 4 ++-- xilem/src/view/variable_label.rs | 4 ++-- xilem_core/examples/filesystem.rs | 6 +++--- xilem_core/examples/user_interface.rs | 4 ++-- xilem_core/src/any_view.rs | 4 ++-- xilem_core/src/element.rs | 10 ++++----- xilem_core/src/sequence.rs | 4 ++-- xilem_core/src/views/one_of.rs | 7 ++++-- xilem_core/tests/common/mod.rs | 6 +++--- xilem_core/tests/one_of.rs | 1 + xilem_web/src/lib.rs | 6 +++--- xilem_web/src/one_of.rs | 1 + 26 files changed, 94 insertions(+), 93 deletions(-) diff --git a/xilem/src/any_view.rs b/xilem/src/any_view.rs index 8431cb9dd..070db4599 100644 --- a/xilem/src/any_view.rs +++ b/xilem/src/any_view.rs @@ -25,12 +25,12 @@ use crate::{Pod, ViewCtx}; pub type AnyWidgetView = dyn AnyView> + Send + Sync; -impl SuperElement> for Pod { - fn upcast(child: Pod) -> Self { - WidgetPod::new(DynWidget { - inner: child.inner.boxed(), +impl SuperElement, ViewCtx> for Pod { + fn upcast(ctx: &mut ViewCtx, child: Pod) -> Self { + let boxed_pod = ctx.boxed_pod(child); + ctx.new_pod(DynWidget { + inner: boxed_pod.inner.boxed(), }) - .into() } fn with_downcast_val( @@ -47,7 +47,7 @@ impl SuperElement> for Pod { } } -impl AnyElement> for Pod { +impl AnyElement, ViewCtx> for Pod { fn replace_inner(mut this: Self::Mut<'_>, child: Pod) -> Self::Mut<'_> { DynWidget::replace_inner(&mut this, child.inner.boxed()); this diff --git a/xilem/src/lib.rs b/xilem/src/lib.rs index 5cb2134c8..c9f4bf9c7 100644 --- a/xilem/src/lib.rs +++ b/xilem/src/lib.rs @@ -156,26 +156,13 @@ pub struct Pod { pub inner: WidgetPod, } -impl Pod { - /// Create a new `Pod` for `inner`. - pub fn new(inner: W) -> Self { - Self::from(WidgetPod::new(inner)) - } -} - -impl From> for Pod { - fn from(inner: WidgetPod) -> Self { - Pod { inner } - } -} - impl ViewElement for Pod { type Mut<'a> = WidgetMut<'a, W>; } -impl SuperElement> for Pod> { - fn upcast(child: Pod) -> Self { - child.inner.boxed().into() +impl SuperElement, ViewCtx> for Pod> { + fn upcast(ctx: &mut ViewCtx, child: Pod) -> Self { + ctx.boxed_pod(child) } fn with_downcast_val( @@ -274,6 +261,18 @@ impl ViewPathTracker for ViewCtx { } impl ViewCtx { + pub fn new_pod(&mut self, widget: W) -> Pod { + Pod { + inner: WidgetPod::new(widget), + } + } + + pub fn boxed_pod(&mut self, pod: Pod) -> Pod> { + Pod { + inner: pod.inner.boxed(), + } + } + pub fn mark_changed(&mut self) { if cfg!(debug_assertions) { self.view_tree_changed = true; diff --git a/xilem/src/one_of.rs b/xilem/src/one_of.rs index ed797c701..a805530ae 100644 --- a/xilem/src/one_of.rs +++ b/xilem/src/one_of.rs @@ -120,6 +120,7 @@ impl< } } fn upcast_one_of_element( + &mut self, elem: xilem_core::one_of::OneOf< Pod, Pod, @@ -133,15 +134,15 @@ impl< >, ) -> Self::OneOfElement { match elem { - xilem_core::one_of::OneOf::A(w) => Pod::new(OneOfWidget::A(w.inner)), - xilem_core::one_of::OneOf::B(w) => Pod::new(OneOfWidget::B(w.inner)), - xilem_core::one_of::OneOf::C(w) => Pod::new(OneOfWidget::C(w.inner)), - xilem_core::one_of::OneOf::D(w) => Pod::new(OneOfWidget::D(w.inner)), - xilem_core::one_of::OneOf::E(w) => Pod::new(OneOfWidget::E(w.inner)), - xilem_core::one_of::OneOf::F(w) => Pod::new(OneOfWidget::F(w.inner)), - xilem_core::one_of::OneOf::G(w) => Pod::new(OneOfWidget::G(w.inner)), - xilem_core::one_of::OneOf::H(w) => Pod::new(OneOfWidget::H(w.inner)), - xilem_core::one_of::OneOf::I(w) => Pod::new(OneOfWidget::I(w.inner)), + xilem_core::one_of::OneOf::A(w) => self.new_pod(OneOfWidget::A(w.inner)), + xilem_core::one_of::OneOf::B(w) => self.new_pod(OneOfWidget::B(w.inner)), + xilem_core::one_of::OneOf::C(w) => self.new_pod(OneOfWidget::C(w.inner)), + xilem_core::one_of::OneOf::D(w) => self.new_pod(OneOfWidget::D(w.inner)), + xilem_core::one_of::OneOf::E(w) => self.new_pod(OneOfWidget::E(w.inner)), + xilem_core::one_of::OneOf::F(w) => self.new_pod(OneOfWidget::F(w.inner)), + xilem_core::one_of::OneOf::G(w) => self.new_pod(OneOfWidget::G(w.inner)), + xilem_core::one_of::OneOf::H(w) => self.new_pod(OneOfWidget::H(w.inner)), + xilem_core::one_of::OneOf::I(w) => self.new_pod(OneOfWidget::I(w.inner)), } } diff --git a/xilem/src/view/button.rs b/xilem/src/view/button.rs index 20d43bd46..31428b9c5 100644 --- a/xilem/src/view/button.rs +++ b/xilem/src/view/button.rs @@ -50,7 +50,7 @@ where type 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>( diff --git a/xilem/src/view/checkbox.rs b/xilem/src/view/checkbox.rs index 755bd1786..dd75d2495 100644 --- a/xilem/src/view/checkbox.rs +++ b/xilem/src/view/checkbox.rs @@ -36,8 +36,8 @@ where type ViewState = (); fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - ctx.with_leaf_action_widget(|_| { - Pod::new(masonry::widget::Checkbox::new( + ctx.with_leaf_action_widget(|ctx| { + ctx.new_pod(masonry::widget::Checkbox::new( self.checked, self.label.clone(), )) diff --git a/xilem/src/view/flex.rs b/xilem/src/view/flex.rs index ceb7d79ad..c709bd431 100644 --- a/xilem/src/view/flex.rs +++ b/xilem/src/view/flex.rs @@ -115,7 +115,7 @@ where FlexElement::FlexSpacer(flex) => widget.with_flex_spacer(flex), } } - (Pod::new(widget), seq_state) + (ctx.new_pod(widget), seq_state) } fn rebuild<'el>( @@ -209,8 +209,8 @@ impl ViewElement for FlexElement { type Mut<'w> = FlexElementMut<'w>; } -impl SuperElement for FlexElement { - fn upcast(child: FlexElement) -> Self { +impl SuperElement for FlexElement { + fn upcast(_ctx: &mut ViewCtx, child: FlexElement) -> Self { child } @@ -230,9 +230,9 @@ impl SuperElement for FlexElement { } } -impl SuperElement> for FlexElement { - fn upcast(child: Pod) -> Self { - FlexElement::Child(child.inner.boxed().into(), FlexParams::default()) +impl SuperElement, ViewCtx> for FlexElement { + fn upcast(ctx: &mut ViewCtx, child: Pod) -> Self { + FlexElement::Child(ctx.boxed_pod(child), FlexParams::default()) } fn with_downcast_val( @@ -450,10 +450,7 @@ where fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { let (pod, state) = self.view.build(ctx); - ( - FlexElement::Child(pod.inner.boxed().into(), self.params), - state, - ) + (FlexElement::Child(ctx.boxed_pod(pod), self.params), state) } fn rebuild<'el>( diff --git a/xilem/src/view/grid.rs b/xilem/src/view/grid.rs index 44ea99b64..3fda96856 100644 --- a/xilem/src/view/grid.rs +++ b/xilem/src/view/grid.rs @@ -74,7 +74,7 @@ where 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>( @@ -133,8 +133,8 @@ impl ViewElement for GridElement { } // Used to allow the item to be used as a generic item in ViewSequence. -impl SuperElement for GridElement { - fn upcast(child: GridElement) -> Self { +impl SuperElement for GridElement { + fn upcast(_ctx: &mut ViewCtx, child: GridElement) -> Self { child } @@ -154,14 +154,14 @@ impl SuperElement for GridElement { } } -impl SuperElement> for GridElement { - fn upcast(child: Pod) -> Self { +impl SuperElement, ViewCtx> for GridElement { + fn upcast(ctx: &mut ViewCtx, child: Pod) -> Self { // Getting here means that the widget didn't use .grid_item or .grid_pos. // This currently places the widget in the top left cell. // There is not much else, beyond purposefully failing, that can be done here, // because there isn't enough information to determine an appropriate spot // 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( @@ -362,12 +362,9 @@ where type ViewState = V::ViewState; - fn build(&self, cx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - let (pod, state) = self.view.build(cx); - ( - GridElement::Child(pod.inner.boxed().into(), self.params), - state, - ) + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + let (pod, state) = self.view.build(ctx); + (GridElement::Child(ctx.boxed_pod(pod), self.params), state) } fn rebuild<'el>( diff --git a/xilem/src/view/image.rs b/xilem/src/view/image.rs index f114fb70d..26b41dbeb 100644 --- a/xilem/src/view/image.rs +++ b/xilem/src/view/image.rs @@ -49,8 +49,8 @@ impl View for Image { type Element = Pod; type ViewState = (); - fn build(&self, _: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - (Pod::new(widget::Image::new(self.image.clone())), ()) + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + (ctx.new_pod(widget::Image::new(self.image.clone())), ()) } fn rebuild<'el>( diff --git a/xilem/src/view/label.rs b/xilem/src/view/label.rs index a859c80c7..fb74da9a3 100644 --- a/xilem/src/view/label.rs +++ b/xilem/src/view/label.rs @@ -48,8 +48,8 @@ impl View for Label { type Element = Pod; type ViewState = (); - fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - let widget_pod = Pod::new( + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + let widget_pod = ctx.new_pod( widget::Label::new(self.label.clone()) .with_text_brush(self.text_brush.clone()) .with_text_alignment(self.alignment) diff --git a/xilem/src/view/portal.rs b/xilem/src/view/portal.rs index 910776843..a8a059f03 100644 --- a/xilem/src/view/portal.rs +++ b/xilem/src/view/portal.rs @@ -40,7 +40,7 @@ where // The Portal `View` doesn't get any messages directly (yet - scroll events?), so doesn't need to // use ctx.with_id. 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) } diff --git a/xilem/src/view/progress_bar.rs b/xilem/src/view/progress_bar.rs index 85c88f9b1..a0306b093 100644 --- a/xilem/src/view/progress_bar.rs +++ b/xilem/src/view/progress_bar.rs @@ -20,7 +20,9 @@ impl View for ProgressBar { type 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>( diff --git a/xilem/src/view/prose.rs b/xilem/src/view/prose.rs index 0bd66615a..66835840b 100644 --- a/xilem/src/view/prose.rs +++ b/xilem/src/view/prose.rs @@ -49,8 +49,8 @@ impl View for Prose { type Element = Pod; type ViewState = (); - fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - let widget_pod = Pod::new( + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + let widget_pod = ctx.new_pod( widget::Prose::new(self.content.clone()) .with_text_brush(self.text_brush.clone()) .with_text_alignment(self.alignment) diff --git a/xilem/src/view/sized_box.rs b/xilem/src/view/sized_box.rs index 6575723f1..e4bde87cb 100644 --- a/xilem/src/view/sized_box.rs +++ b/xilem/src/view/sized_box.rs @@ -135,7 +135,7 @@ where if let Some(border) = &self.border { widget = widget.border(border.color, border.width); } - (Pod::new(widget), child_state) + (ctx.new_pod(widget), child_state) } fn rebuild<'el>( diff --git a/xilem/src/view/spinner.rs b/xilem/src/view/spinner.rs index e6def95fe..8aad5b39e 100644 --- a/xilem/src/view/spinner.rs +++ b/xilem/src/view/spinner.rs @@ -55,8 +55,8 @@ impl View for Spinner { type Element = Pod; type ViewState = (); - fn build(&self, _: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - (Pod::new(widget::Spinner::new()), ()) + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + (ctx.new_pod(widget::Spinner::new()), ()) } fn rebuild<'el>( diff --git a/xilem/src/view/textbox.rs b/xilem/src/view/textbox.rs index b029a60c4..6fcc26c72 100644 --- a/xilem/src/view/textbox.rs +++ b/xilem/src/view/textbox.rs @@ -69,8 +69,8 @@ impl View for Textbox (Self::Element, Self::ViewState) { - ctx.with_leaf_action_widget(|_| { - Pod::new( + ctx.with_leaf_action_widget(|ctx| { + ctx.new_pod( masonry::widget::Textbox::new(self.contents.clone()) .with_text_brush(self.text_brush.clone()) .with_text_alignment(self.alignment), diff --git a/xilem/src/view/variable_label.rs b/xilem/src/view/variable_label.rs index 9da324d6b..fb9af3ad4 100644 --- a/xilem/src/view/variable_label.rs +++ b/xilem/src/view/variable_label.rs @@ -100,8 +100,8 @@ impl View for VariableLabel { type Element = Pod; type ViewState = (); - fn build(&self, _ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { - let widget_pod = Pod::new( + fn build(&self, ctx: &mut ViewCtx) -> (Self::Element, Self::ViewState) { + let widget_pod = ctx.new_pod( widget::VariableLabel::new(self.label.clone()) .with_text_brush(self.text_brush.clone()) .with_line_break_mode(widget::LineBreaking::WordWrap) diff --git a/xilem_core/examples/filesystem.rs b/xilem_core/examples/filesystem.rs index 67408c428..4546016c2 100644 --- a/xilem_core/examples/filesystem.rs +++ b/xilem_core/examples/filesystem.rs @@ -98,8 +98,8 @@ impl FileView for V where type DynFileView = Box>; -impl SuperElement for FsPath { - fn upcast(child: FsPath) -> Self { +impl SuperElement for FsPath { + fn upcast(_ctx: &mut ViewCtx, child: FsPath) -> Self { child } @@ -112,7 +112,7 @@ impl SuperElement for FsPath { } } -impl AnyElement for FsPath { +impl AnyElement for FsPath { fn replace_inner(this: Self::Mut<'_>, child: FsPath) -> Self::Mut<'_> { *this = child.0; this diff --git a/xilem_core/examples/user_interface.rs b/xilem_core/examples/user_interface.rs index 41eb6b362..0c0dc3d90 100644 --- a/xilem_core/examples/user_interface.rs +++ b/xilem_core/examples/user_interface.rs @@ -99,8 +99,8 @@ impl Widget for ButtonWidget { } } -impl SuperElement> for WidgetPod> { - fn upcast(child: WidgetPod) -> Self { +impl SuperElement, ViewCtx> for WidgetPod> { + fn upcast(_ctx: &mut ViewCtx, child: WidgetPod) -> Self { WidgetPod { widget: Box::new(child.widget), } diff --git a/xilem_core/src/any_view.rs b/xilem_core/src/any_view.rs index 97796240a..456830956 100644 --- a/xilem_core/src/any_view.rs +++ b/xilem_core/src/any_view.rs @@ -66,7 +66,7 @@ pub trait AnyView AnyView for V where - DynamicElement: AnyElement, + DynamicElement: AnyElement, Context: ViewPathTracker, V: View + 'static, V::ViewState: 'static, @@ -80,7 +80,7 @@ where let generation = 0; let (element, view_state) = ctx.with_id(ViewId::new(generation), |ctx| self.build(ctx)); ( - DynamicElement::upcast(element), + DynamicElement::upcast(ctx, element), AnyViewState { inner_state: Box::new(view_state), generation, diff --git a/xilem_core/src/element.rs b/xilem_core/src/element.rs index 22d4da790..79a230095 100644 --- a/xilem_core/src/element.rs +++ b/xilem_core/src/element.rs @@ -42,12 +42,12 @@ pub type Mut<'el, E> = ::Mut<'el>; /// /// [`AnyView`]: crate::AnyView /// [`ViewSequence`]: crate::ViewSequence -pub trait SuperElement: ViewElement +pub trait SuperElement: ViewElement where Child: ViewElement, { /// 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. /// @@ -75,7 +75,7 @@ where } /// An element which can be used for an [`AnyView`](crate::AnyView) containing `Child`. -pub trait AnyElement: SuperElement +pub trait AnyElement: SuperElement where Child: ViewElement, { @@ -95,8 +95,8 @@ impl ViewElement for NoElement { type Mut<'a> = (); } -impl SuperElement for NoElement { - fn upcast(child: NoElement) -> Self { +impl SuperElement for NoElement { + fn upcast(_ctx: &mut Context, child: NoElement) -> Self { child } diff --git a/xilem_core/src/sequence.rs b/xilem_core/src/sequence.rs index dec7dc648..a6b1fb404 100644 --- a/xilem_core/src/sequence.rs +++ b/xilem_core/src/sequence.rs @@ -150,14 +150,14 @@ impl where Context: ViewPathTracker, V: View + ViewMarker, - Element: SuperElement, + Element: SuperElement, V::Element: ViewElement, { type SeqState = V::ViewState; fn seq_build(&self, ctx: &mut Context, elements: &mut AppendVec) -> Self::SeqState { let (element, view_state) = self.build(ctx); - elements.push(Element::upcast(element)); + elements.push(Element::upcast(ctx, element)); view_state } fn seq_rebuild( diff --git a/xilem_core/src/views/one_of.rs b/xilem_core/src/views/one_of.rs index 0b38b53c6..aed81fe30 100644 --- a/xilem_core/src/views/one_of.rs +++ b/xilem_core/src/views/one_of.rs @@ -137,7 +137,10 @@ pub trait OneOfCtx< 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 - fn upcast_one_of_element(elem: OneOf) -> Self::OneOfElement; + fn upcast_one_of_element( + &mut self, + elem: OneOf, + ) -> 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` fn update_one_of_element_mut( @@ -233,7 +236,7 @@ where } }); ( - Context::upcast_one_of_element(element), + ctx.upcast_one_of_element(element), OneOfState { generation, inner_state: state, diff --git a/xilem_core/tests/common/mod.rs b/xilem_core/tests/common/mod.rs index 31afc3a78..17a7af15e 100644 --- a/xilem_core/tests/common/mod.rs +++ b/xilem_core/tests/common/mod.rs @@ -210,8 +210,8 @@ impl View<(), Action, TestCtx> for OperationView { } } -impl SuperElement for TestElement { - fn upcast(child: TestElement) -> Self { +impl SuperElement for TestElement { + fn upcast(_ctx: &mut TestCtx, child: TestElement) -> Self { child } @@ -224,7 +224,7 @@ impl SuperElement for TestElement { } } -impl AnyElement for TestElement { +impl AnyElement for TestElement { fn replace_inner(this: Self::Mut<'_>, child: TestElement) -> Self::Mut<'_> { assert_eq!(child.operations.len(), 1); let Operation::Build(child_id) = child.operations.first().unwrap() else { diff --git a/xilem_core/tests/one_of.rs b/xilem_core/tests/one_of.rs index 588b35a7e..f7547a777 100644 --- a/xilem_core/tests/one_of.rs +++ b/xilem_core/tests/one_of.rs @@ -41,6 +41,7 @@ impl type OneOfElement = TestElement; fn upcast_one_of_element( + &mut self, elem: OneOf< TestElement, TestElement, diff --git a/xilem_web/src/lib.rs b/xilem_web/src/lib.rs index f8396bcf7..e9e9dabe8 100644 --- a/xilem_web/src/lib.rs +++ b/xilem_web/src/lib.rs @@ -269,8 +269,8 @@ impl, P: 'static> ViewElement for Pod { type Mut<'a> = PodMut<'a, E, P>; } -impl, P: 'static> SuperElement> for AnyPod { - fn upcast(child: Pod) -> Self { +impl, P: 'static> SuperElement, ViewCtx> for AnyPod { + fn upcast(_ctx: &mut ViewCtx, child: Pod) -> Self { Pod::into_dyn_node(child.node, child.props) } @@ -284,7 +284,7 @@ impl, P: 'static> SuperElement> for AnyPod { } } -impl, P: 'static> AnyElement> for AnyPod { +impl, P: 'static> AnyElement, ViewCtx> for AnyPod { fn replace_inner(mut this: Self::Mut<'_>, child: Pod) -> Self::Mut<'_> { Pod::replace_inner(&mut this, child); this diff --git a/xilem_web/src/one_of.rs b/xilem_web/src/one_of.rs index b4ddbd0bc..a51866e93 100644 --- a/xilem_web/src/one_of.rs +++ b/xilem_web/src/one_of.rs @@ -50,6 +50,7 @@ where Pod, OneOf>; fn upcast_one_of_element( + &mut self, elem: OneOf< Pod, Pod,