Skip to content

Commit

Permalink
Merge pull request #1628 from nicksenger/feat/component-operations
Browse files Browse the repository at this point in the history
Add `operate` method to `Component` trait
  • Loading branch information
hecrj authored Jan 2, 2023
2 parents 7594e48 + cec28e2 commit fd2ddfa
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions lazy/src/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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>,
}
Expand Down

0 comments on commit fd2ddfa

Please sign in to comment.