1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use crate::{PickableMesh, PickingCamera, PickingPluginState};
use bevy::{prelude::*, ui::FocusPolicy};
#[derive(Debug, Copy, Clone)]
pub struct Hover {
hovered: bool,
}
impl Hover {
pub fn hovered(&self) -> bool {
self.hovered
}
}
impl Default for Hover {
fn default() -> Self {
Hover { hovered: false }
}
}
#[allow(clippy::type_complexity)]
pub fn mesh_focus(
mut state: ResMut<PickingPluginState>,
mouse_button_input: Res<Input<MouseButton>>,
touches_input: Res<Touches>,
pick_source_query: Query<&PickingCamera>,
mut interaction_set: QuerySet<(
Query<
(
&mut Interaction,
Option<&mut Hover>,
Option<&FocusPolicy>,
Entity,
),
With<PickableMesh>,
>,
Query<&Interaction, With<Node>>,
)>,
) {
if !state.enabled {
return;
}
let mut hovered_entity = None;
for ui_interaction in interaction_set.q1().iter() {
if *ui_interaction != Interaction::None {
for (mut interaction, hover, _, _) in &mut interaction_set.q0_mut().iter_mut() {
if *interaction != Interaction::None {
*interaction = Interaction::None;
}
if let Some(mut hover) = hover {
if hover.hovered {
hover.hovered = false;
}
}
}
state.paused_for_ui = true;
return;
} else {
state.paused_for_ui = false;
}
}
if mouse_button_input.just_released(MouseButton::Left) || touches_input.just_released(0) {
for (mut interaction, _, _, _) in &mut interaction_set.q0_mut().iter_mut() {
if *interaction == Interaction::Clicked {
*interaction = Interaction::None;
}
}
}
let mouse_clicked =
mouse_button_input.just_pressed(MouseButton::Left) || touches_input.just_released(0);
for pick_source in pick_source_query.iter() {
if let Some(picks) = pick_source.intersect_list() {
for (topmost_entity, _intersection) in picks.iter() {
if let Ok((mut interaction, _hover, focus_policy, _entity)) =
interaction_set.q0_mut().get_mut(*topmost_entity)
{
if mouse_clicked {
if *interaction != Interaction::Clicked {
*interaction = Interaction::Clicked;
}
} else if *interaction == Interaction::None {
*interaction = Interaction::Hovered;
}
hovered_entity = Some(*topmost_entity);
match focus_policy.cloned().unwrap_or(FocusPolicy::Block) {
FocusPolicy::Block => {
break;
}
FocusPolicy::Pass => { }
}
}
}
}
for (mut interaction, hover, _, entity) in &mut interaction_set.q0_mut().iter_mut() {
if Some(entity) != hovered_entity && *interaction == Interaction::Hovered {
*interaction = Interaction::None;
}
if Some(entity) == hovered_entity {
if let Some(mut hover) = hover {
if !hover.hovered {
hover.hovered = true;
}
}
} else if let Some(mut hover) = hover {
if hover.hovered {
hover.hovered = false;
}
}
}
}
}