use crate::{Hover, PickableMesh, RayCastPluginState, Selection};
use bevy::prelude::*;
#[derive(Debug)]
pub enum SelectionEvent {
JustSelected(Entity),
JustDeselected(Entity),
}
#[derive(Debug)]
pub enum HoverEvent {
JustEntered(Entity),
JustLeft(Entity),
}
#[derive(Debug)]
pub enum PickingEvent {
Selection(SelectionEvent),
Hover(HoverEvent),
}
#[allow(clippy::type_complexity)]
pub fn mesh_events_system(
state: Res<RayCastPluginState>,
mut picking_events: EventWriter<PickingEvent>,
hover_query: Query<
(Entity, &Hover, ChangeTrackers<Hover>),
(Changed<Hover>, With<PickableMesh>),
>,
selection_query: Query<
(Entity, &Selection, ChangeTrackers<Selection>),
(Changed<Selection>, With<PickableMesh>),
>,
) {
if !state.enabled {
return;
}
for (entity, hover, hover_change) in hover_query.iter() {
if hover_change.is_added() {
continue; }
if hover.hovered() {
picking_events.send(PickingEvent::Hover(HoverEvent::JustEntered(entity)));
} else {
picking_events.send(PickingEvent::Hover(HoverEvent::JustLeft(entity)));
}
}
for (entity, selection, selection_change) in selection_query.iter() {
if selection_change.is_added() {
continue; }
if selection.selected() {
picking_events.send(PickingEvent::Selection(SelectionEvent::JustSelected(
entity,
)));
} else {
picking_events.send(PickingEvent::Selection(SelectionEvent::JustDeselected(
entity,
)));
}
}
}
pub fn event_debug_system(state: Res<RayCastPluginState>, mut events: EventReader<PickingEvent>) {
if !state.enabled {
return;
}
for event in events.iter() {
info!("{:?}", event);
}
}