Skip to content

Commit

Permalink
do not check for focus until cursor position has been set (#1070)
Browse files Browse the repository at this point in the history
do not check for focus until cursor position has been set
  • Loading branch information
mockersf authored Dec 23, 2020
1 parent 61ce3f7 commit 09c15ea
Showing 1 changed file with 12 additions and 14 deletions.
26 changes: 12 additions & 14 deletions crates/bevy_ui/src/focus.rs
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -34,15 +32,13 @@ impl Default for FocusPolicy {

#[derive(Default)]
pub struct State {
cursor_moved_event_reader: EventReader<CursorMoved>,
cursor_position: Vec2,
hovered_entity: Option<Entity>,
}

pub fn ui_focus_system(
mut state: Local<State>,
windows: Res<Windows>,
mouse_button_input: Res<Input<MouseButton>>,
cursor_moved_events: Res<Events<CursorMoved>>,
touches_input: Res<Touches>,
mut node_query: Query<(
Entity,
Expand All @@ -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()
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 09c15ea

Please sign in to comment.