use crate::{BoxedValue, FerroObject, StyledElement, TypeInfo};
use std::cell::RefCell;
crate::ferro_thread_local! {
static PROVIDER_TYPES: RefCell<Vec<&'static TypeInfo>> = const { RefCell::new(Vec::new()) };
}
pub trait IDataContextProvider {
fn data_context(&self) -> Option<BoxedValue>;
fn set_data_context(&self, value: Option<BoxedValue>);
}
impl dyn IDataContextProvider {
pub fn register_type(type_: &'static TypeInfo) {
PROVIDER_TYPES.with_borrow_mut(|types| {
if !types.iter().any(|t| std::ptr::eq(*t, type_)) {
types.push(type_);
}
});
}
pub fn is_implemented_by(object: &FerroObject) -> bool {
if object.is::<StyledElement>() {
return true;
}
let type_ = object.get_type();
PROVIDER_TYPES.with_borrow(|types| types.iter().any(|t| t.is_assignable_from(type_)))
}
}
impl IDataContextProvider for StyledElement {
fn data_context(&self) -> Option<BoxedValue> {
StyledElement::data_context(self)
}
fn set_data_context(&self, value: Option<BoxedValue>) {
StyledElement::set_data_context(self, value)
}
}