use std::any::{Any, TypeId}; use crate::{ layout::WidgetInstance, util::{HashMap, Id}, }; #[allow(unused_variables)] pub trait UiModule: Any { fn on_draw(&mut self, inst: &WidgetInstance) {} fn on_undraw(&mut self, inst: &WidgetInstance) {} fn on_remove(&mut self, id: &Id) {} fn on_move(&mut self, inst: &WidgetInstance) {} } #[derive(Default)] pub struct Modules { map: HashMap>, } impl Modules { pub fn iter_mut(&mut self) -> impl Iterator { self.map.values_mut().map(|m| m.as_mut()) } pub fn get_mut(&mut self) -> &mut M { let rf = self .map .entry(TypeId::of::()) .or_insert_with(|| Box::new(M::default())) .as_mut(); let any: &mut dyn Any = &mut *rf; any.downcast_mut().unwrap() } }