Skip to main content

traaains/editor/train/placing/states/
mod.rs

1use bevy::{
2    asset::Assets,
3    color::Color,
4    ecs::{
5        entity::Entity,
6        observer::Observer,
7        query::With,
8        system::{Commands, Query, ResMut},
9    },
10    picking::Pickable,
11    sprite_render::{ColorMaterial, MeshMaterial2d},
12};
13
14pub mod hovering;
15pub mod placed_state;
16
17use crate::{
18    editor::train::placing::{
19        CurrentPlacingDir, VirtualCarriage,
20        observers::{
21            PlacingTrainObserver, on_segment_pointer_enter, on_segment_pointer_leave,
22            on_segment_pointer_move,
23        },
24    },
25    sim::track::node::TrackNode,
26    utils::Dir,
27};
28
29// TODO: These change when going segment to segment, because two state transitions are triggered
30pub fn on_enter_placing_train(mut cmd: Commands, q_nodes: Query<Entity, With<TrackNode>>) {
31    cmd.spawn_batch([
32        (
33            PlacingTrainObserver,
34            Observer::new(on_segment_pointer_enter),
35        ),
36        (
37            PlacingTrainObserver,
38            Observer::new(on_segment_pointer_leave),
39        ),
40        (PlacingTrainObserver, Observer::new(on_segment_pointer_move)),
41    ]);
42
43    for node in q_nodes {
44        cmd.entity(node).insert(Pickable::IGNORE);
45    }
46
47    cmd.insert_resource(CurrentPlacingDir(Dir::Positive));
48}
49
50pub fn on_exit_placing_train(
51    mut cmd: Commands,
52    q_observers: Query<Entity, With<PlacingTrainObserver>>,
53    q_nodes: Query<Entity, With<TrackNode>>,
54) {
55    q_observers.into_iter().for_each(|e| {
56        cmd.entity(e).despawn();
57    });
58
59    q_nodes.into_iter().for_each(|e| {
60        cmd.entity(e).remove::<Pickable>();
61    });
62}
63
64pub fn color_virtual_carriages_green(
65    q_carriages: Query<&mut MeshMaterial2d<ColorMaterial>, With<VirtualCarriage>>,
66    mut materials: ResMut<Assets<ColorMaterial>>,
67) {
68    let mat = materials.add(Color::srgb(0.0, 1.0, 0.0));
69    for mut carriage in q_carriages {
70        carriage.0 = mat.clone();
71    }
72}
73
74pub fn color_virtual_carriages_red(
75    q_carriages: Query<&mut MeshMaterial2d<ColorMaterial>, With<VirtualCarriage>>,
76    mut materials: ResMut<Assets<ColorMaterial>>,
77) {
78    let mat = materials.add(Color::srgb(1.0, 0.0, 0.0));
79    for mut carriage in q_carriages {
80        carriage.0 = mat.clone();
81    }
82}