From 09c15ea890c3d2d13e6238ec4fa45ea58901a450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Wed, 23 Dec 2020 23:10:39 +0100 Subject: [PATCH] do not check for focus until cursor position has been set (#1070) do not check for focus until cursor position has been set --- crates/bevy_ui/src/focus.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/crates/bevy_ui/src/focus.rs b/crates/bevy_ui/src/focus.rs index 663b27b4c63db..814bed2baab2d 100644 --- a/crates/bevy_ui/src/focus.rs +++ b/crates/bevy_ui/src/focus.rs @@ -1,11 +1,9 @@ use crate::Node; -use bevy_app::{EventReader, Events}; use bevy_core::FloatOrd; use bevy_ecs::prelude::*; use bevy_input::{mouse::MouseButton, touch::Touches, Input}; -use bevy_math::Vec2; use bevy_transform::components::GlobalTransform; -use bevy_window::CursorMoved; +use bevy_window::Windows; #[derive(Copy, Clone, Eq, PartialEq, Debug)] pub enum Interaction { @@ -34,15 +32,13 @@ impl Default for FocusPolicy { #[derive(Default)] pub struct State { - cursor_moved_event_reader: EventReader, - cursor_position: Vec2, hovered_entity: Option, } pub fn ui_focus_system( mut state: Local, + windows: Res, mouse_button_input: Res>, - cursor_moved_events: Res>, touches_input: Res, mut node_query: Query<( Entity, @@ -52,12 +48,14 @@ pub fn ui_focus_system( Option<&FocusPolicy>, )>, ) { - if let Some(cursor_moved) = state.cursor_moved_event_reader.latest(&cursor_moved_events) { - state.cursor_position = cursor_moved.position; - } - if let Some(touch) = touches_input.get_pressed(0) { - state.cursor_position = touch.position(); - } + let cursor_position = if let Some(cursor_position) = windows + .get_primary() + .and_then(|window| window.cursor_position()) + { + cursor_position + } else { + return; + }; if mouse_button_input.just_released(MouseButton::Left) || touches_input.just_released(0) { for (_entity, _node, _global_transform, interaction, _focus_policy) in node_query.iter_mut() @@ -85,8 +83,8 @@ pub fn ui_focus_system( let min = ui_position - extents; let max = ui_position + extents; // if the current cursor position is within the bounds of the node, consider it for clicking - if (min.x..max.x).contains(&state.cursor_position.x) - && (min.y..max.y).contains(&state.cursor_position.y) + if (min.x..max.x).contains(&cursor_position.x) + && (min.y..max.y).contains(&cursor_position.y) { Some((entity, focus_policy, interaction, FloatOrd(position.z))) } else {