use crate::ui::*;
pub trait Controller<T, W: Widget<T>> {
fn event(
&mut self,
child: &mut W,
event: &WidgetEvent,
ctx: &Context<'_>,
data: &mut T,
) -> ControlFlow<()> {
child.event(event, ctx, data)
}
fn lifecycle(
&mut self,
child: &mut W,
lifecycle: &WidgetLifecycle<'_>,
ctx: &Context<'_>,
data: &T,
env: &Env,
) {
child.lifecycle(lifecycle, ctx, data, env)
}
fn update(&mut self, child: &mut W, ctx: &Context<'_>, data: &T) {
child.update(ctx, data)
}
fn frame(&mut self, child: &mut W, surfaces: &Surfaces, data: &mut T) {
child.frame(surfaces, data)
}
}
pub struct Control<W, C> {
widget: W,
controller: C,
}
impl<W, C> Control<W, C> {
pub fn new(widget: W, controller: C) -> Control<W, C> {
Control { widget, controller }
}
}
impl<T, W: Widget<T>, C: Controller<T, W>> Widget<T> for Control<W, C> {
fn layout(&mut self, parent: Size, ctx: &LayoutCtx<'_>, data: &T, env: &Env) -> Size {
self.widget.layout(parent, ctx, data, env)
}
fn paint(&mut self, canvas: Canvas<'_>, data: &T) {
self.widget.paint(canvas, data)
}
fn contains(&self, point: Point) -> bool {
self.widget.contains(point)
}
fn update(&mut self, ctx: &Context<'_>, data: &T) {
self.controller.update(&mut self.widget, ctx, data)
}
fn event(&mut self, event: &WidgetEvent, ctx: &Context<'_>, data: &mut T) -> ControlFlow<()> {
self.controller.event(&mut self.widget, event, ctx, data)
}
fn lifecycle(
&mut self,
lifecycle: &WidgetLifecycle<'_>,
ctx: &Context<'_>,
data: &T,
env: &Env,
) {
self.controller
.lifecycle(&mut self.widget, lifecycle, ctx, data, env)
}
fn frame(&mut self, surfaces: &Surfaces, data: &mut T) {
self.controller.frame(&mut self.widget, surfaces, data)
}
fn display(&self) -> String {
format!("Control({})", self.widget.display())
}
}