~starkingdoms/starkingdoms

ref: 1018826380f46e306958358cc687d9a5302b2be6 starkingdoms/crates/unified/src/ship_editor/select.rs -rw-r--r-- 1.3 KiB
10188263ghostly_zsh ship editor feat: selection and deselection 3 hours ago
                                                                                
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
use crate::prelude::*;
use crate::ship_editor::components::{Part, PartConfigHolder, Selectable, OUTLINE_RENDER_LAYER};
use crate::ship_editor::input::ShipEditorDrag;

pub fn click_select(
    ev: On<Pointer<Click>>,
    mut parts: Query<(Entity, &Transform, &PartConfigHolder, &mut Selectable), With<Part>>,
    drag: Res<ShipEditorDrag>,
    mut commands: Commands,
    asset_server: Res<AssetServer>,
) {
    debug!("click detected");
    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;
    } else {
        part_selectable.is_selected = false;
        if let Some(outline_entity) = part_selectable.outline_entity {
            commands.entity(outline_entity).despawn();
        }
    }
}