Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

do not check for focus until cursor position has been set #1070

Merged
merged 2 commits into from
Dec 23, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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())
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will that work when having multiple windows? anyway did it even work before with multiple windows?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It didn't filter according to WindowId, so it would have supported multiple windows for focus events. But the rest of the UI system doesn't support multiple windows, so it doesn't really matter. If/when that ever gets built we can use the same approach here.

{
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