traaains/editor/train/placing/states/
mod.rs1use 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
29pub 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}