diff options
Diffstat (limited to 'lazy')
| -rw-r--r-- | lazy/src/component.rs | 33 | 
1 files changed, 33 insertions, 0 deletions
| diff --git a/lazy/src/component.rs b/lazy/src/component.rs index ad15d69d..a39cd020 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -46,6 +46,14 @@ pub trait Component<Message, Renderer> {      /// Produces the widgets of the [`Component`], which may trigger an [`Event`](Component::Event)      /// on user interaction.      fn view(&self, state: &Self::State) -> Element<'_, Self::Event, Renderer>; + +    /// Update the [`Component`] state based on the provided [`Operation`](widget::Operation) +    fn operate( +        &self, +        #[allow(unused)] state: &mut Self::State, +        #[allow(unused)] operation: &mut dyn widget::Operation<Message>, +    ) { +    }  }  /// Turns an implementor of [`Component`] into an [`Element`] that can be @@ -106,6 +114,26 @@ where          );      } +    fn rebuild_element_with_operation( +        &self, +        state: &mut S, +        operation: &mut dyn widget::Operation<Message>, +    ) { +        let heads = self.state.borrow_mut().take().unwrap().into_heads(); + +        heads.component.operate(state, operation); + +        *self.state.borrow_mut() = Some( +            StateBuilder { +                component: heads.component, +                message: PhantomData, +                state: PhantomData, +                element_builder: |component| Some(component.view(state)), +            } +            .build(), +        ); +    } +      fn with_element<T>(          &self,          f: impl FnOnce(&Element<'_, Event, Renderer>) -> T, @@ -237,6 +265,11 @@ where          renderer: &Renderer,          operation: &mut dyn widget::Operation<Message>,      ) { +        self.rebuild_element_with_operation( +            tree.state.downcast_mut(), +            operation, +        ); +          struct MapOperation<'a, B> {              operation: &'a mut dyn widget::Operation<B>,          } | 
