use crate::{interaction::*, site::*};
#[derive(Component, Default)]
pub struct PointVisualCue {
supporter: Option<Point<Entity>>,
}
pub fn add_point_visual_cues(
mut commands: Commands,
new_points: Query<(Entity, &Point<Entity>), Without<PointVisualCue>>,
) {
for (e, point) in &new_points {
commands.entity(e).insert(PointVisualCue {
supporter: Some(*point),
});
}
}
pub fn update_point_visual_cues(
mut points: Query<
(
Entity,
&Hovered,
&Selected,
&Point<Entity>,
&mut PointVisualCue,
),
(
Without<AnchorVisualization>,
Without<Edge<Entity>>,
Without<Path<Entity>>,
Or<(Changed<Hovered>, Changed<Selected>, Changed<Point<Entity>>)>,
),
>,
mut anchors: Query<(&mut Hovered, &mut Selected), With<AnchorVisualization>>,
) {
for (p, hovered, selected, point, mut cue) in &mut points {
let anchor = point.0;
if let Some(old) = cue.supporter {
if old.0 != anchor {
if let Ok((mut hover, mut selected)) = anchors.get_mut(old.0) {
hover.support_hovering.remove(&p);
selected.support_selected.remove(&p);
}
}
}
if hovered.cue() || selected.cue() {
cue.supporter = Some(*point);
} else {
cue.supporter = None;
}
if let Ok((mut anchor_hovered, mut anchor_selected)) = anchors.get_mut(anchor) {
if hovered.cue() {
anchor_hovered.support_hovering.insert(p);
} else {
anchor_hovered.support_hovering.remove(&p);
}
if selected.cue() {
anchor_selected.support_selected.insert(p);
} else {
anchor_selected.support_selected.remove(&p);
}
}
}
}