pub mod create;
pub mod dom_events;
pub mod element;
mod enclose;
pub mod entity;
pub mod events;
pub mod hierarchy;
pub mod prelude;
pub mod query;
mod racy_cell;
pub mod resource;
pub mod signals_ext;
mod storage;
mod style_storage;
pub mod web_str;
mod world;
pub use web_sys;
use crate::prelude::*;
#[doc(hidden)] pub use discard;
pub use element::{AsElement, Element};
pub use entity::AsEntity;
pub use futures_signals as signals;
pub use hobo_css as css;
use owning_ref::{OwningRef, OwningRefMut};
#[doc(hidden)] pub use paste;
pub use prelude::{Children, Parent};
use std::{
any::TypeId,
cell::{Ref, RefMut},
};
use style_storage::{StyleStorage, STYLE_STORAGE};
use sugars::hash;
#[doc(hidden)] pub use world::World;
pub use owning_ref;
#[cfg(debug_assertions)]
pub mod backtrace {
use super::*;
use std::{
collections::{HashMap, BTreeMap},
cell::RefCell,
panic::Location,
};
use once_cell::sync::Lazy;
use shrinkwraprs::Shrinkwrap;
pub static STORAGE_MAP: Lazy<BacktraceStorage> = Lazy::new(Default::default);
#[repr(transparent)]
#[derive(Debug, Default)]
pub struct BacktraceStorage<'a>(pub RefCell<HashMap<TypeId, LocationMap<'a>>>);
unsafe impl Send for BacktraceStorage<'_> {}
unsafe impl Sync for BacktraceStorage<'_> {}
#[repr(transparent)]
#[derive(Debug, Default, Shrinkwrap)]
#[shrinkwrap(mutable)]
pub struct LocationMap<'a>(pub BTreeMap<Location<'a>, bool>);
impl<'a> std::fmt::Display for LocationMap<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for (location, mutable) in self.iter().rev() {
writeln!(f, "{:>5} {}", if *mutable { "(mut)" } else { "" }, location)?;
};
Ok(())
}
}
}
pub type StorageRef<'a, Component> = OwningRef<Ref<'a, Box<dyn storage::DynStorage>>, Storage<Component>>;
pub type StorageRefMut<'a, Component> = OwningRefMut<RefMut<'a, Box<dyn storage::DynStorage>>, Storage<Component>>;
pub fn register_window(window: &web_sys::Window, window_name: String) {
let style_storage = unsafe { &mut *STYLE_STORAGE.get() as &mut StyleStorage };
style_storage.register_window(window, window_name);
}
pub fn unregister_window(window_name: &str) {
let style_storage = unsafe { &mut *STYLE_STORAGE.get() as &mut StyleStorage };
style_storage.unregister_window(window_name);
}
#[doc(hidden)]
#[extend::ext(pub, name = MarkClassString)]
impl<T: 'static> T {
fn mark_class_string() -> String {
format!("t-{:x}", hash!(TypeId::of::<Self>()))
}
}
pub fn find<Q: query::Query>() -> Vec<Q::Fetch> {
let mut entities = None;
Q::filter(&WORLD, &mut entities);
entities.unwrap_or_default().into_iter().map(|entity| Q::fetch(&WORLD, entity)).collect::<Vec<_>>()
}
pub fn try_find_one<Q: query::Query>() -> Option<Q::Fetch> {
let mut entities = None;
Q::filter(&WORLD, &mut entities);
entities.unwrap_or_default().into_iter().next().map(|entity| Q::fetch(&WORLD, entity))
}
pub fn find_one<Q: query::Query>() -> Q::Fetch { try_find_one::<Q>().unwrap() }