expose listener methods

This commit is contained in:
Evan Almloff committed 2023-02-02 14:26:47 -06:00
1 parent 2f6b8393f8
commit 6cf0274a5b
1 file changed
+31 -23
+31 -23
View File
@@ -329,31 +329,11 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
}
NewEventListener { name, id } => {
let node_id = self.element_to_node_id(id);
let mut node = self.get_mut(node_id).unwrap();
if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
element.listeners_mut().insert(name.to_string());
drop(node);
match self.nodes_listening.get_mut(name) {
Some(hs) => {
hs.insert(node_id);
}
None => {
let mut hs = FxHashSet::default();
hs.insert(node_id);
self.nodes_listening.insert(name.to_string(), hs);
}
}
}
self.add_event_listener(node_id, name);
}
RemoveEventListener { id, name } => {
let node_id = self.element_to_node_id(id);
{
let mut node = self.get_mut(node_id).unwrap();
if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
element.listeners_mut().remove(name);
}
}
self.nodes_listening.get_mut(name).unwrap().remove(&node_id);
self.remove_event_listener(node_id, name);
}
Remove { id } => {
let node_id = self.element_to_node_id(id);
@@ -369,7 +349,7 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
/// Find all nodes that are listening for an event, sorted by there height in the dom progressing starting at the bottom and progressing up.
/// This can be useful to avoid creating duplicate events.
pub fn get_listening_sorted(&self, event: &'static str) -> Vec<NodeRef<V>> {
pub fn get_listening_sorted(&self, event: &str) -> Vec<NodeRef<V>> {
if let Some(nodes) = self.nodes_listening.get(event) {
let mut listening: Vec<_> = nodes
.iter()
@@ -490,6 +470,34 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
self.tree.insert_after(id, new);
}
pub fn add_event_listener(&mut self, id: NodeId, event: &str) {
let mut node = self.get_mut(id).unwrap();
if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
element.listeners_mut().insert(event.to_string());
drop(node);
match self.nodes_listening.get_mut(event) {
Some(hs) => {
hs.insert(id);
}
None => {
let mut hs = FxHashSet::default();
hs.insert(id);
self.nodes_listening.insert(event.to_string(), hs);
}
}
}
}
pub fn remove_event_listener(&mut self, id: NodeId, event: &str) {
{
let mut node = self.get_mut(id).unwrap();
if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
element.listeners_mut().remove(event);
}
}
self.nodes_listening.get_mut(event).unwrap().remove(&id);
}
pub fn traverse_depth_first(&self, mut f: impl FnMut(NodeRef<V>)) {
let mut stack = vec![self.root()];
while let Some(id) = stack.pop() {