use crate::prelude::*; use crate::ship_editor::components::{Part, PartConfigHolder, Selectable, SelectedCount, OUTLINE_RENDER_LAYER}; use crate::ship_editor::input::ShipEditorDrag; pub fn click_select( ev: On>, keys: Res>, mut parts: Query<(Entity, &Transform, &PartConfigHolder, &mut Selectable), With>, drag: Res, mut selected_count: ResMut, mut commands: Commands, asset_server: Res, ) { if !drag.can_select { return } let Ok((part_entity, part_transform, part, mut part_selectable)) = parts.get_mut(ev.entity) else { error!("No Part found upon part selection. The observer probably wasn't removed."); return; }; if !part_selectable.is_selected { let mut sprite = Sprite::from_image(asset_server.load("textures/outline.png")); sprite.custom_size = Some(vec2(part.0.physics.width as f32, part.0.physics.height as f32) * 1.0625); let outline_entity = commands.spawn(( part_transform.clone(), sprite, )); part_selectable.outline_entity = Some(outline_entity.id()); part_selectable.is_selected = true; selected_count.0 += 1; } else { 'select: { if !(keys.pressed(KeyCode::ShiftLeft) || keys.pressed(KeyCode::ShiftRight)) && selected_count.0 > 1 { break 'select; } part_selectable.is_selected = false; if let Some(outline_entity) = part_selectable.outline_entity { commands.entity(outline_entity).despawn(); } part_selectable.outline_entity = None; selected_count.0 -= 1; } } if !(keys.pressed(KeyCode::ShiftLeft) || keys.pressed(KeyCode::ShiftRight)) { for (part_entity, part_transform, part, mut part_selectable) in parts.iter_mut() { if part_entity == ev.entity { continue } if let Some(outline_entity) = part_selectable.outline_entity { part_selectable.is_selected = false; commands.entity(outline_entity).despawn(); part_selectable.outline_entity = None; selected_count.0 -= 1; } } } }