wip: bottom up dropping

This commit is contained in:
Jonathan Kelley committed 2021-08-05 22:23:41 -04:00
1 parent 687cda1b6d
commit f2334c17be
21 files changed
+682 -679

No files matched your search

+23 -39
View File
@@ -2,6 +2,8 @@
//! --------------
//! This crate implements a renderer of the Dioxus Virtual DOM for the web browser using Websys.
use std::rc::Rc;
pub use crate::cfg::WebConfig;
use crate::dom::load_document;
use dioxus::prelude::{Context, Properties, VNode};
@@ -77,50 +79,25 @@ pub async fn run_with_props<T: Properties + 'static>(
) -> Result<()> {
let mut dom = VirtualDom::new_with_props(root, root_props);
// let tasks = dom.shared.tasks.clone();
let root_el = load_document().get_element_by_id(&cfg.rootname).unwrap();
let root_el = load_document().get_element_by_id("dioxusroot").unwrap();
let mut websys_dom = dom::WebsysDom::new(root_el, cfg);
let tasks = dom.get_event_sender();
let mut edits = Vec::new();
dom.rebuild(&mut websys_dom, &mut edits)?;
websys_dom.process_edits(&mut edits);
let mut real = RealDomWebsys {};
log::info!("Going into event loop");
// #[allow(unreachable_code)]
loop {
let trigger = {
let real_queue = websys_dom.wait_for_event();
if dom.any_pending_events() {
log::info!("tasks is not empty, waiting for either tasks or event system");
let mut task = dom.wait_for_event();
pin_mut!(real_queue);
pin_mut!(task);
match futures_util::future::select(real_queue, task).await {
futures_util::future::Either::Left((trigger, _)) => trigger,
futures_util::future::Either::Right((trigger, _)) => trigger,
}
} else {
log::info!("tasks is empty, waiting for dom event to trigger soemthing");
real_queue.await
}
};
if let Some(real_trigger) = trigger {
log::info!("event received");
dom.queue_event(real_trigger);
let mut edits = Vec::new();
dom.progress_with_event(&mut websys_dom, &mut edits).await?;
websys_dom.process_edits(&mut edits);
}
// initialize the virtualdom first
if cfg.hydrate {
dom.rebuild_in_place()?;
}
// should actually never return from this, should be an error, rustc just cant see it
let mut websys_dom = dom::WebsysDom::new(
root_el,
cfg,
Rc::new(move |event| tasks.unbounded_send(event).unwrap()),
);
dom.run(&mut websys_dom).await?;
Ok(())
}
@@ -128,3 +105,10 @@ struct HydrationNode {
id: usize,
node: Node,
}
struct RealDomWebsys {}
impl dioxus::RealDom for RealDomWebsys {
fn raw_node_as_any(&self) -> &mut dyn std::any::Any {
todo!()
}
}