From 6cf0274a5b72043d7e3450f5d28b3fa8f52d1e3e Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 2 Feb 2023 14:26:47 -0600 Subject: [PATCH] expose listener methods --- packages/native-core/src/real_dom.rs | 54 ++++++++++++++++------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 49f0e03c9..5db372e06 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -329,31 +329,11 @@ impl RealDom { } 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 RealDom { /// 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> { + pub fn get_listening_sorted(&self, event: &str) -> Vec> { if let Some(nodes) = self.nodes_listening.get(event) { let mut listening: Vec<_> = nodes .iter() @@ -490,6 +470,34 @@ impl RealDom { 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)) { let mut stack = vec![self.root()]; while let Some(id) = stack.pop() {