expose listener methods
This commit is contained in:
1 parent
2f6b8393f8
commit
6cf0274a5b
1 file changed
+31
-23
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user