use crate::prelude::*; pub type FnRenderComponent = fn(component: &C, cx: &mut Context) -> Option; pub struct RenderComponent { f: FnRenderComponent, theme_type_id: Option, referer_type_id: Option, } impl ActionTrait for RenderComponent { fn theme_type_id(&self) -> Option { self.theme_type_id } fn referer_type_id(&self) -> Option { self.referer_type_id } } impl RenderComponent { pub fn new(theme: ThemeRef, f: FnRenderComponent) -> Self { RenderComponent { f, theme_type_id: Some(theme.type_id()), referer_type_id: Some(TypeId::of::()), } } #[inline(always)] #[allow(clippy::inline_always)] pub(crate) fn dispatch(component: &C, cx: &mut Context) -> Option { let mut render_component: Option = None; dispatch_actions( &ActionKey::new( TypeId::of::(), Some(cx.theme().type_id()), Some(TypeId::of::()), None, ), |action: &Self| { if render_component.is_none() { render_component = (action.f)(component, cx); } }, ); render_component } }