diff options
Diffstat (limited to 'lazy/src')
| -rw-r--r-- | lazy/src/component.rs | 35 | ||||
| -rw-r--r-- | lazy/src/responsive.rs | 6 | 
2 files changed, 39 insertions, 2 deletions
| diff --git a/lazy/src/component.rs b/lazy/src/component.rs index ad15d69d..d8f21f8a 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -46,6 +46,16 @@ 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) +    /// +    /// By default, it does nothing. +    fn operate( +        &self, +        _state: &mut Self::State, +        _operation: &mut dyn widget::Operation<Message>, +    ) { +    }  }  /// Turns an implementor of [`Component`] into an [`Element`] that can be @@ -106,6 +116,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 +267,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>,          } diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index 945c935a..52badda2 100644 --- a/lazy/src/responsive.rs +++ b/lazy/src/responsive.rs @@ -280,12 +280,14 @@ where                  );                  let Content { -                    element, layout, .. +                    element, +                    layout: content_layout, +                    ..                  } = content.deref_mut();                  let content_layout = Layout::with_offset(                      layout.bounds().position() - Point::ORIGIN, -                    layout, +                    content_layout,                  );                  element | 
