use super::{Component, Event, EventCtx}; use crate::ui::{geometry::Rect, shape::Renderer}; pub struct MsgMap { inner: T, func: F, } impl MsgMap { pub fn new(inner: T, func: F) -> Self { Self { inner, func } } } impl Component for MsgMap where T: Component, F: Fn(T::Msg) -> Option, { type Msg = U; fn place(&mut self, bounds: Rect) -> Rect { self.inner.place(bounds) } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { self.inner.event(ctx, event).and_then(&self.func) } fn paint(&mut self) { self.inner.paint() } fn render<'s>(&'s self, target: &mut impl Renderer<'s>) { self.inner.render(target); } #[cfg(feature = "ui_bounds")] fn bounds(&self, sink: &mut dyn FnMut(Rect)) { self.inner.bounds(sink); } } #[cfg(feature = "ui_debug")] impl crate::trace::Trace for MsgMap where T: Component + crate::trace::Trace, { fn trace(&self, t: &mut dyn crate::trace::Tracer) { self.inner.trace(t) } }