36 lines
908 B
Rust
36 lines
908 B
Rust
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<TypeId, Box<dyn UiModule>>,
|
|
}
|
|
|
|
impl Modules {
|
|
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut (dyn UiModule + 'static)> {
|
|
self.map.values_mut().map(|m| m.as_mut())
|
|
}
|
|
|
|
pub fn get_mut<M: UiModule + Default>(&mut self) -> &mut M {
|
|
let rf = self
|
|
.map
|
|
.entry(TypeId::of::<M>())
|
|
.or_insert_with(|| Box::new(M::default()))
|
|
.as_mut();
|
|
let any: &mut dyn Any = &mut *rf;
|
|
any.downcast_mut().unwrap()
|
|
}
|
|
}
|