Selaa lähdekoodia

Merge pull request #402 from Demonthos/tui_preformance

Tui performance improvements
Jon Kelley 3 vuotta sitten
vanhempi
commit
dab24e9ad9
2 muutettua tiedostoa jossa 65 lisäystä ja 56 poistoa
  1. 63 54
      packages/tui/src/hooks.rs
  2. 2 2
      packages/tui/src/lib.rs

+ 63 - 54
packages/tui/src/hooks.rs

@@ -335,76 +335,60 @@ 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 && 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 && 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 {
+                            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 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,
-                        );
-                    }
-                }
-            }
-
-            {
-                // 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 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 let Some(w) = wheel_data {
-                        if currently_contains && wheel_delta != 0.0 {
+                        if currently_contains {
                             try_create_event(
-                                "wheel",
-                                Arc::new(w.clone()),
+                                "contextmenu",
+                                Arc::new(prepare_mouse_data(mouse_data, node_layout)),
                                 &mut will_bubble,
                                 resolved_events,
                                 node,
@@ -415,6 +399,31 @@ impl InnerInputState {
                 }
             }
 
+            {
+                // wheel
+                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 currently_contains {
+                                try_create_event(
+                                    "wheel",
+                                    Arc::new(w.clone()),
+                                    &mut will_bubble,
+                                    resolved_events,
+                                    node,
+                                    dom,
+                                );
+                            }
+                        }
+                    }
+                }
+            }
+
             {
                 // mouseleave
                 let mut will_bubble = FxHashSet::default();

+ 2 - 2
packages/tui/src/lib.rs

@@ -129,7 +129,7 @@ fn render_vdom(
                 terminal.clear().unwrap();
             }
 
-            let to_rerender: fxhash::FxHashSet<usize> = vec![0].into_iter().collect();
+            let mut to_rerender: fxhash::FxHashSet<usize> = 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();
                 }
             }