From 83209e5e03dc85639abcd223a12b06480010afed Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:10:17 -0500 Subject: [PATCH 1/3] check mouse state before iterating through elements --- packages/tui/src/hooks.rs | 115 ++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 53 deletions(-) diff --git a/packages/tui/src/hooks.rs b/packages/tui/src/hooks.rs index c9d1e2a8c..57ca27dcd 100644 --- a/packages/tui/src/hooks.rs +++ b/packages/tui/src/hooks.rs @@ -335,81 +335,90 @@ impl InnerInputState { { // mouseup - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("mouseup") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if released { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("mouseup") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { - try_create_event( - "mouseup", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains { + try_create_event( + "mouseup", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // click - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("click") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if mouse_data.button == 0 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("click") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released && mouse_data.button == 0 { - try_create_event( - "click", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains && released { + try_create_event( + "click", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // contextmenu - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("contextmenu") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if mouse_data.button == 2 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("contextmenu") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released && mouse_data.button == 2 { - try_create_event( - "contextmenu", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains && released { + try_create_event( + "contextmenu", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // wheel - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("wheel") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if let Some(w) = wheel_data { + if wheel_delta != 0.0 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("wheel") { + let node_layout = + layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if let Some(w) = wheel_data { - if currently_contains && wheel_delta != 0.0 { - try_create_event( - "wheel", - Arc::new(w.clone()), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains { + try_create_event( + "wheel", + Arc::new(w.clone()), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } From 2ea587359b7a8dd7a794e10b2190afd05ed9fb82 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:10:34 -0500 Subject: [PATCH 2/3] only re-render if the state has changed --- packages/tui/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tui/src/lib.rs b/packages/tui/src/lib.rs index 9f6bd78ed..012d92fed 100644 --- a/packages/tui/src/lib.rs +++ b/packages/tui/src/lib.rs @@ -129,7 +129,7 @@ fn render_vdom( terminal.clear().unwrap(); } - let to_rerender: fxhash::FxHashSet = vec![0].into_iter().collect(); + let mut to_rerender: fxhash::FxHashSet = vec![0].into_iter().collect(); let mut resized = true; loop { @@ -226,7 +226,7 @@ fn render_vdom( // update the style and layout let mut any_map = AnyMap::new(); any_map.insert(stretch.clone()); - let _to_rerender = rdom.update_state(vdom, to_update, any_map).unwrap(); + to_rerender = rdom.update_state(vdom, to_update, any_map).unwrap(); } } From 6f260e8a4a6a38fd0abe74250fd2baffd8dd5657 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:16:21 -0500 Subject: [PATCH 3/3] move released into mouse condition --- packages/tui/src/hooks.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tui/src/hooks.rs b/packages/tui/src/hooks.rs index 57ca27dcd..9def817a8 100644 --- a/packages/tui/src/hooks.rs +++ b/packages/tui/src/hooks.rs @@ -357,13 +357,13 @@ impl InnerInputState { { // click - if mouse_data.button == 0 { + if mouse_data.button == 0 && released { let mut will_bubble = FxHashSet::default(); for node in dom.get_listening_sorted("click") { let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { + if currently_contains { try_create_event( "click", Arc::new(prepare_mouse_data(mouse_data, node_layout)), @@ -379,13 +379,13 @@ impl InnerInputState { { // contextmenu - if mouse_data.button == 2 { + if mouse_data.button == 2 && released { let mut will_bubble = FxHashSet::default(); for node in dom.get_listening_sorted("contextmenu") { let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { + if currently_contains { try_create_event( "contextmenu", Arc::new(prepare_mouse_data(mouse_data, node_layout)),