pub mod id; pub mod input_handling; pub mod tick; pub mod velocity; pub use id::*; pub use input_handling::*; pub use tick::*; pub use velocity::*; use std::{ any::{type_name, Any}, fmt::Debug, sync::{Arc, Mutex}, }; use crate::{ render_scope::RenderScope, widget::{Component, Widget}, Screen, }; pub trait Extension { fn init(&mut self, _screen: Arc) {} fn on_close(&mut self, _screen: Arc) {} fn render_widget(&mut self, _scope: &mut RenderScope, _widget: &Arc) {} } pub trait Event: Send + Sync { fn as_any(&self) -> &dyn Any; } #[derive(Clone)] pub struct Handler(Arc, &E) + Send + Sync>>); impl Component for Handler { fn as_any(&self) -> &dyn Any { self } fn as_any_mut(&mut self) -> &mut dyn Any { self } } impl Handler { pub fn new, &E) + Send + Sync + 'static>(f: F) -> Handler { Handler(Arc::new(Mutex::new(f))) } pub fn call(&self, w: &Arc, e: &E) { (self.0.lock().unwrap())(w, e) } } impl Debug for Handler { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Handler({})", type_name::()) } } impl<'a> dyn Event + 'a { pub fn get(&self) -> Option<&T> { self.as_any().downcast_ref() } }