Merge pull request #397 from Demonthos/tui_fix_mousemove

only trigger onmousemove if the position has changed (tui)
This commit is contained in:
Jon Kelley authored and GitHub committed 2022-05-06 20:37:23 -04:00
commit 14c0630242
1 file changed
+25 -21
+25 -21
View File
@@ -232,33 +232,37 @@ impl InnerInputState {
let old_pos = previous_mouse let old_pos = previous_mouse
.as_ref() .as_ref()
.map(|m| (m.0.screen_x, m.0.screen_y)); .map(|m| (m.0.screen_x, m.0.screen_y));
let clicked = // the a mouse button is pressed if a button was not down and is now down
(!mouse.0.buttons & previous_mouse.as_ref().map(|m| m.0.buttons).unwrap_or(0)) > 0; let pressed =
(mouse.0.buttons & !previous_mouse.as_ref().map(|m| m.0.buttons).unwrap_or(0)) > 0;
// the a mouse button is pressed if a button was down and is now not down
let released = let released =
(mouse.0.buttons & !previous_mouse.map(|m| m.0.buttons).unwrap_or(0)) > 0; (!mouse.0.buttons & previous_mouse.map(|m| m.0.buttons).unwrap_or(0)) > 0;
let wheel_delta = self.wheel.as_ref().map_or(0.0, |w| w.delta_y); let wheel_delta = self.wheel.as_ref().map_or(0.0, |w| w.delta_y);
let mouse_data = &mouse.0; let mouse_data = &mouse.0;
let wheel_data = &self.wheel; let wheel_data = &self.wheel;
{ {
// mousemove // mousemove
let mut will_bubble = FxHashSet::default(); if old_pos != Some(new_pos) {
for node in dom.get_listening_sorted("mousemove") { let mut will_bubble = FxHashSet::default();
let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); for node in dom.get_listening_sorted("mousemove") {
let previously_contained = old_pos let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap();
.filter(|pos| layout_contains_point(node_layout, *pos)) let previously_contained = old_pos
.is_some(); .filter(|pos| layout_contains_point(node_layout, *pos))
let currently_contains = layout_contains_point(node_layout, new_pos); .is_some();
let currently_contains = layout_contains_point(node_layout, new_pos);
if currently_contains && previously_contained { if currently_contains && previously_contained {
try_create_event( try_create_event(
"mousemove", "mousemove",
Arc::new(prepare_mouse_data(mouse_data, node_layout)), Arc::new(prepare_mouse_data(mouse_data, node_layout)),
&mut will_bubble, &mut will_bubble,
resolved_events, resolved_events,
node, node,
dom, dom,
); );
}
} }
} }
} }
@@ -309,8 +313,8 @@ impl InnerInputState {
} }
} }
{ // mousedown
// mousedown if pressed {
let mut will_bubble = FxHashSet::default(); let mut will_bubble = FxHashSet::default();
for node in dom.get_listening_sorted("mousedown") { for node in dom.get_listening_sorted("mousedown") {
let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap();