use std::rc::Rc; use crate::{ any::AnyTrait, event::{CallbackDataCommon, EventListenerID}, }; pub mod button; pub mod checkbox; pub mod slider; pub mod tooltip; pub struct InitData<'a> { pub common: &'a mut CallbackDataCommon<'a>, } // common component data #[derive(Default)] pub struct ComponentBase { #[allow(dead_code)] lhandles: Vec, } pub trait ComponentTrait: AnyTrait { fn base(&mut self) -> &mut ComponentBase; fn init(&self, data: &mut InitData); } #[derive(Clone)] pub struct Component(pub Rc); pub type ComponentWeak = std::rc::Weak; impl Component { pub fn weak(&self) -> ComponentWeak { Rc::downgrade(&self.0) } pub fn try_cast(&self) -> anyhow::Result> { if !(*self.0).as_any().is::() { anyhow::bail!("try_cast: type not matching"); } // safety: we already checked it above, should be safe to directly cast it unsafe { Ok(Rc::from_raw(Rc::into_raw(self.0.clone()).cast())) } } }