diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs index 71c5d2198..b41bacb7c 100644 --- a/packages/core/src/create.rs +++ b/packages/core/src/create.rs @@ -40,7 +40,7 @@ impl<'b> VirtualDom { for (root_idx, root) in template.template.roots.iter().enumerate() { // We might need to generate an ID for the root node on_stack += match root { - TemplateNode::DynamicText(id) | TemplateNode::Dynamic(id) => { + TemplateNode::DynamicText { id } | TemplateNode::Dynamic { id } => { match &template.dynamic_nodes[*id] { // a dynamic text node doesn't replace a template node, instead we create it on the fly DynamicNode::Text(VText { id: slot, value }) => { @@ -70,7 +70,7 @@ impl<'b> VirtualDom { } } - TemplateNode::Element { .. } | TemplateNode::Text(_) => { + TemplateNode::Element { .. } | TemplateNode::Text { .. } => { let this_id = self.next_root(template, root_idx); template.root_ids[root_idx].set(this_id); @@ -215,7 +215,7 @@ impl<'b> VirtualDom { .filter(|root| { matches!( root, - TemplateNode::Dynamic(_) | TemplateNode::DynamicText(_) + TemplateNode::Dynamic { .. } | TemplateNode::DynamicText { .. } ) }) .count(); diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index fca6a45e0..423cf677b 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -911,7 +911,7 @@ fn matching_components<'a>( .zip(right.template.roots.iter()) .map(|(l, r)| { let (l, r) = match (l, r) { - (TemplateNode::Dynamic(l), TemplateNode::Dynamic(r)) => (l, r), + (TemplateNode::Dynamic { id: l }, TemplateNode::Dynamic { id: r }) => (l, r), _ => return None, }; diff --git a/packages/core/src/mutations.rs b/packages/core/src/mutations.rs index 3687cd956..2512ae9fa 100644 --- a/packages/core/src/mutations.rs +++ b/packages/core/src/mutations.rs @@ -13,6 +13,7 @@ use crate::{arena::ElementId, ScopeId, Template}; /// Templates, however, apply to all subtrees, not just target subtree. /// /// Mutations are the only link between the RealDOM and the VirtualDOM. +#[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[derive(Debug, Default)] #[must_use = "not handling edits can lead to visual inconsistencies in UI"] pub struct Mutations<'a> { diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs index a7968abf5..7b6764417 100644 --- a/packages/core/src/nodes.rs +++ b/packages/core/src/nodes.rs @@ -78,8 +78,8 @@ impl<'a> VNode<'a> { /// Returns [`None`] if the root is actually a static node (Element/Text) pub fn dynamic_root(&self, idx: usize) -> Option<&'a DynamicNode<'a>> { match &self.template.roots[idx] { - TemplateNode::Element { .. } | TemplateNode::Text(_) => None, - TemplateNode::Dynamic(id) | TemplateNode::DynamicText(id) => { + TemplateNode::Element { .. } | TemplateNode::Text { text: _ } => None, + TemplateNode::Dynamic { id } | TemplateNode::DynamicText { id } => { Some(&self.dynamic_nodes[*id]) } } @@ -132,7 +132,7 @@ pub struct Template<'a> { /// /// This can be created at compile time, saving the VirtualDom time when diffing the tree #[derive(Debug, Clone, Copy, PartialEq, Hash, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serialize", derive(serde::Serialize), serde(tag = "type"))] pub enum TemplateNode<'a> { /// An statically known element in the dom. /// @@ -159,15 +159,15 @@ pub enum TemplateNode<'a> { }, /// This template node is just a piece of static text - Text(&'a str), + Text { text: &'a str }, /// This template node is unknown, and needs to be created at runtime. - Dynamic(usize), + Dynamic { id: usize }, /// This template node is known to be some text, but needs to be created at runtime /// /// This is separate from the pure Dynamic variant for various optimizations - DynamicText(usize), + DynamicText { id: usize }, } /// A node created at runtime @@ -252,7 +252,11 @@ pub struct VText<'a> { /// An attribute of the TemplateNode, created at compile time #[derive(Debug, PartialEq, Hash, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr( + feature = "serialize", + derive(serde::Serialize, serde::Deserialize), + serde(tag = "type") +)] pub enum TemplateAttribute<'a> { /// This attribute is entirely known at compile time, enabling Static { diff --git a/packages/desktop/src/controller.rs b/packages/desktop/src/controller.rs index d01b6545f..a71c43b47 100644 --- a/packages/desktop/src/controller.rs +++ b/packages/desktop/src/controller.rs @@ -54,8 +54,7 @@ impl DesktopController { { let edits = dom.rebuild(); let mut queue = edit_queue.lock().unwrap(); - queue.push(serde_json::to_string(&edits.templates).unwrap()); - queue.push(serde_json::to_string(&edits.edits).unwrap()); + queue.push(serde_json::to_string(&edits).unwrap()); proxy.send_event(UserWindowEvent::EditsReady).unwrap(); } @@ -116,8 +115,6 @@ impl DesktopController { let (_id, view) = self.webviews.iter_mut().next().unwrap(); - println!("processing pending edits {:?}", new_queue.len()); - for edit in new_queue.drain(..) { view.evaluate_script(&format!("window.interpreter.handleEdits({})", edit)) .unwrap(); diff --git a/packages/desktop/src/events.rs b/packages/desktop/src/events.rs index c407013ea..1dba8978f 100644 --- a/packages/desktop/src/events.rs +++ b/packages/desktop/src/events.rs @@ -1,6 +1,5 @@ //! Convert a serialized event to an event trigger -use dioxus_core::ElementId; use dioxus_html::events::*; use serde::{Deserialize, Serialize}; use serde_json::from_value; diff --git a/packages/html/src/render_template.rs b/packages/html/src/render_template.rs index 5fbff5ff0..e608f6aa1 100644 --- a/packages/html/src/render_template.rs +++ b/packages/html/src/render_template.rs @@ -33,9 +33,9 @@ fn render_template_node(node: &TemplateNode, out: &mut String) -> std::fmt::Resu } write!(out, "")?; } - TemplateNode::Text(t) => write!(out, "{t}")?, - TemplateNode::Dynamic(_) => write!(out, "