use crate::debug_state::DebugState;
use crate::widget::prelude::*;
use crate::widget::{Axis, WidgetWrapper};
pub trait Controller<T, W: Widget<T>> {
fn event(&mut self, child: &mut W, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {
child.event(ctx, event, data, env)
}
fn lifecycle(
&mut self,
child: &mut W,
ctx: &mut LifeCycleCtx,
event: &LifeCycle,
data: &T,
env: &Env,
) {
child.lifecycle(ctx, event, data, env)
}
fn update(&mut self, child: &mut W, ctx: &mut UpdateCtx, old_data: &T, data: &T, env: &Env) {
child.update(ctx, old_data, data, env)
}
}
pub struct ControllerHost<W, C> {
widget: W,
controller: C,
}
impl<W, C> ControllerHost<W, C> {
pub fn new(widget: W, controller: C) -> ControllerHost<W, C> {
ControllerHost { widget, controller }
}
}
impl<T, W: Widget<T>, C: Controller<T, W>> Widget<T> for ControllerHost<W, C> {
fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {
self.controller
.event(&mut self.widget, ctx, event, data, env)
}
fn lifecycle(&mut self, ctx: &mut LifeCycleCtx, event: &LifeCycle, data: &T, env: &Env) {
self.controller
.lifecycle(&mut self.widget, ctx, event, data, env)
}
fn update(&mut self, ctx: &mut UpdateCtx, old_data: &T, data: &T, env: &Env) {
self.controller
.update(&mut self.widget, ctx, old_data, data, env)
}
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &T, env: &Env) -> Size {
self.widget.layout(ctx, bc, data, env)
}
fn paint(&mut self, ctx: &mut PaintCtx, data: &T, env: &Env) {
self.widget.paint(ctx, data, env)
}
fn id(&self) -> Option<WidgetId> {
self.widget.id()
}
fn debug_state(&self, data: &T) -> DebugState {
DebugState {
display_name: self.short_type_name().to_string(),
children: vec![self.widget.debug_state(data)],
..Default::default()
}
}
fn compute_max_intrinsic(
&mut self,
axis: Axis,
ctx: &mut LayoutCtx,
bc: &BoxConstraints,
data: &T,
env: &Env,
) -> f64 {
self.widget.compute_max_intrinsic(axis, ctx, bc, data, env)
}
}
impl<W, C> WidgetWrapper for ControllerHost<W, C> {
widget_wrapper_body!(W, widget);
}