Skip to main content

traaains/editor/train/
mod.rs

1//! Provides functionality for editing trains (currently only placing).
2
3use bevy::{
4    app::{Plugin, Update},
5    ecs::{
6        query::With,
7        schedule::IntoScheduleConfigs,
8        system::{Res, ResMut, Single},
9    },
10    input::{ButtonInput, keyboard::KeyCode},
11    state::{
12        app::AppExtStates,
13        condition::in_state,
14        state::{NextState, OnEnter, SubStates},
15    },
16    ui::widget::Text,
17};
18
19use crate::editor::{EditorState, StateText, train::placing::PlacingTrainPlugin};
20
21pub mod placing;
22
23#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, SubStates)]
24#[source(EditorState = EditorState::Train)]
25pub enum TrainEditorState {
26    #[default]
27    PlacingTrain,
28}
29
30pub fn input_handler(
31    input: Res<ButtonInput<KeyCode>>,
32    mut next_editor_state: ResMut<NextState<EditorState>>,
33) {
34    if input.just_pressed(KeyCode::Escape) {
35        next_editor_state.set(EditorState::Viewing);
36    }
37}
38
39fn on_enter_train(mut text: Single<&mut Text, With<StateText>>) {
40    text.0 = String::from("Placing trains\nEsc to exit");
41}
42
43/// Provides functionality for editing trains (currently only placing).
44pub struct TrainEditorPlugin;
45
46impl Plugin for TrainEditorPlugin {
47    fn build(&self, app: &mut bevy::app::App) {
48        app.add_plugins(PlacingTrainPlugin)
49            .add_sub_state::<TrainEditorState>()
50            .add_systems(OnEnter(EditorState::Train), on_enter_train)
51            .add_systems(Update, input_handler.run_if(in_state(EditorState::Train)));
52    }
53}