use crate::widget::Controller;
use crate::{Data, Env, LifeCycleCtx, Widget};
use tracing::{instrument, trace};
pub struct Added<T, W> {
action: Box<dyn Fn(&mut W, &mut LifeCycleCtx, &T, &Env)>,
}
impl<T: Data, W: Widget<T>> Added<T, W> {
pub fn new(action: impl Fn(&mut W, &mut LifeCycleCtx, &T, &Env) + 'static) -> Self {
Self {
action: Box::new(action),
}
}
}
impl<T: Data, W: Widget<T>> Controller<T, W> for Added<T, W> {
#[instrument(
name = "Added",
level = "trace",
skip(self, child, ctx, event, data, env)
)]
fn lifecycle(
&mut self,
child: &mut W,
ctx: &mut LifeCycleCtx,
event: &crate::LifeCycle,
data: &T,
env: &Env,
) {
if let crate::LifeCycle::WidgetAdded = event {
trace!("Widget added");
(self.action)(child, ctx, data, env);
}
child.lifecycle(ctx, event, data, env)
}
}