use std::sync::{
Arc,
Mutex,
};
use dioxus_core::AttributeValue;
use dioxus_hooks::{
use_memo,
use_reactive,
Dependency,
};
use dioxus_signals::{
Memo,
Readable,
};
use freya_core::custom_attributes::{
CanvasReference,
CanvasRunner,
CanvasRunnerContext,
CustomAttributeValues,
};
#[derive(PartialEq, Clone)]
pub struct UseCanvas {
runner: Memo<UseCanvasRunner>,
}
#[derive(Clone)]
pub struct UseCanvasRunner(pub Arc<Mutex<CanvasRunner>>);
impl PartialEq for UseCanvasRunner {
fn eq(&self, other: &Self) -> bool {
Arc::ptr_eq(&self.0, &other.0)
}
}
impl UseCanvas {
pub fn attribute(&self) -> AttributeValue {
AttributeValue::any_value(CustomAttributeValues::Canvas(CanvasReference {
runner: self.runner.read().0.clone(),
}))
}
}
pub fn use_canvas<T: FnMut(&mut CanvasRunnerContext) + Sync + Send + 'static>(
mut renderer_cb: impl FnMut() -> T + 'static,
) -> UseCanvas {
let runner = use_memo(move || UseCanvasRunner(Arc::new(Mutex::new(renderer_cb()))));
UseCanvas { runner }
}
pub fn use_canvas_with_deps<
D: Dependency,
T: FnMut(&mut CanvasRunnerContext) + Sync + Send + 'static,
>(
dependencies: D,
mut renderer_cb: impl FnMut(D::Out) -> T + 'static,
) -> UseCanvas
where
D::Out: 'static,
{
let runner = use_memo(use_reactive(dependencies, move |dependencies| {
UseCanvasRunner(Arc::new(Mutex::new(renderer_cb(dependencies))))
}));
UseCanvas { runner }
}