From 8d5fba8a1f09e9b5f6796618cfe9da4154a0dcbd Mon Sep 17 00:00:00 2001 From: Nick Senger Date: Fri, 30 Dec 2022 13:10:53 -0800 Subject: Add `operate` method to `Component` trait --- lazy/src/component.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'lazy/src/component.rs') 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 { /// 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, + ) { + } } /// 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, + ) { + 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( &self, f: impl FnOnce(&Element<'_, Event, Renderer>) -> T, @@ -237,6 +265,11 @@ where renderer: &Renderer, operation: &mut dyn widget::Operation, ) { + self.rebuild_element_with_operation( + tree.state.downcast_mut(), + operation, + ); + struct MapOperation<'a, B> { operation: &'a mut dyn widget::Operation, } -- cgit