more progress updating tui

This commit is contained in:
Evan Almloff committed 2022-12-05 09:44:43 -06:00
1 parent 8c07b4059f
commit 11b37ee141
11 files changed
+44 -64

No files matched your search

+31 -13
View File
@@ -1,5 +1,6 @@
use dioxus_core::{ElementId, Mutations, TemplateNode};
use rustc_hash::{FxHashMap, FxHashSet};
use std::fmt::Debug;
use std::ops::{Deref, DerefMut, Index, IndexMut};
use crate::node::{Node, NodeType, OwnedAttributeDiscription, OwnedAttributeValue};
@@ -32,6 +33,7 @@ pub struct RealDom<S: State> {
nodes_listening: FxHashMap<String, FxHashSet<RealNodeId>>,
stack: Vec<RealNodeId>,
templates: FxHashMap<String, Vec<RealNodeId>>,
root_initialized: bool,
}
impl<S: State> Default for RealDom<S> {
@@ -55,10 +57,11 @@ impl<S: State> RealDom<S> {
RealDom {
tree,
node_id_mapping: Vec::new(),
node_id_mapping: vec![Some(root_id)],
nodes_listening: FxHashMap::default(),
stack: vec![root_id],
templates: FxHashMap::default(),
root_initialized: false,
}
}
@@ -99,7 +102,7 @@ impl<S: State> RealDom<S> {
&mut self,
node: &TemplateNode,
mutations_vec: &mut FxHashMap<RealNodeId, NodeMask>,
) -> Option<RealNodeId> {
) -> RealNodeId {
match node {
TemplateNode::Element {
tag,
@@ -132,21 +135,31 @@ impl<S: State> RealDom<S> {
});
let node_id = self.create_node(node);
for child in *children {
if let Some(child_id) = self.create_template_node(child, mutations_vec) {
self.add_child(node_id, child_id);
}
let child_id = self.create_template_node(child, mutations_vec);
self.add_child(node_id, child_id);
}
self.stack.push(node_id);
Some(node_id)
node_id
}
TemplateNode::Text(txt) => {
let node_id = self.create_node(Node::new(NodeType::Text {
text: txt.to_string(),
}));
self.stack.push(node_id);
Some(node_id)
node_id
}
TemplateNode::Dynamic(_) => {
let node_id = self.create_node(Node::new(NodeType::Placeholder));
self.stack.push(node_id);
node_id
}
TemplateNode::DynamicText(_) => {
let node_id = self.create_node(Node::new(NodeType::Text {
text: String::new(),
}));
self.stack.push(node_id);
node_id
}
_ => None,
}
}
@@ -156,13 +169,17 @@ impl<S: State> RealDom<S> {
for template in mutations.templates {
let mut template_root_ids = Vec::new();
for root in template.roots {
if let Some(id) = self.create_template_node(root, &mut nodes_updated) {
template_root_ids.push(id);
}
let id = self.create_template_node(root, &mut nodes_updated);
template_root_ids.push(id);
}
self.templates
.insert(template.name.to_string(), template_root_ids);
}
if !self.root_initialized {
self.root_initialized = true;
let root_id = self.tree.root();
nodes_updated.insert(root_id, NodeMask::ALL);
}
for e in mutations.edits {
use dioxus_core::Mutation::*;
match e {
@@ -171,7 +188,7 @@ impl<S: State> RealDom<S> {
let parent = self.element_to_node_id(id);
for child in children {
self.add_child(parent, child);
mark_dirty(parent, NodeMask::ALL, &mut nodes_updated);
mark_dirty(child, NodeMask::ALL, &mut nodes_updated);
}
}
AssignId { path, id } => {
@@ -207,6 +224,7 @@ impl<S: State> RealDom<S> {
let template_id = self.templates[name][index];
let clone_id = self.clone_node(template_id, &mut nodes_updated);
self.set_element_id(clone_id, id);
self.stack.push(clone_id);
}
ReplaceWith { id, m } => {
let new_nodes = self.stack.split_off(m);
@@ -218,7 +236,7 @@ impl<S: State> RealDom<S> {
self.tree.remove(old_node_id);
}
ReplacePlaceholder { path, m } => {
let new_nodes = self.stack.split_off(m);
let new_nodes = self.stack.split_off(self.stack.len() - m);
let old_node_id = self.load_child(path);
for new in new_nodes {
self.tree.insert_after(old_node_id, new);