paiagram/interface/side_panel/
vehicle_stats.rs

1use bevy::ecs::{
2    entity::Entity,
3    name::Name,
4    query::With,
5    system::{In, InMut, Query},
6};
7use egui::Ui;
8
9use crate::vehicles::{
10    Vehicle,
11    entries::{TimetableEntry, TimetableEntryCache, VehicleSchedule, VehicleScheduleCache},
12};
13
14pub fn show_vehicle_stats(
15    (InMut(ui), In(vehicle_entity)): (InMut<Ui>, In<Entity>),
16    vehicle_name: Query<&Name, With<Vehicle>>,
17    schedule: Query<(&VehicleSchedule, &VehicleScheduleCache)>,
18    timetable_entries: Query<(&TimetableEntry, &TimetableEntryCache)>,
19) {
20    // Display basic statistics and edit functions
21    ui.heading(
22        vehicle_name
23            .get(vehicle_entity)
24            .map_or("Unknown", Name::as_str),
25    );
26    // calculate the duration
27    egui::Grid::new("vehicle_info_grid")
28        .num_columns(2)
29        .striped(true)
30        .show(ui, |ui| {
31            ui.label("Duration:");
32            let maybe_schedule = schedule.get(vehicle_entity).ok();
33            let duration_text = {
34                if let Some((_, cache)) = maybe_schedule
35                    && let Some(actual_route) = cache.actual_route.as_ref()
36                    && let Some(first) = actual_route.first()
37                    && let Some(last) = actual_route.last()
38                    && let Ok((_, first_cache)) = timetable_entries.get(first.inner())
39                    && let Ok((_, last_cache)) = timetable_entries.get(last.inner())
40                    && let Some(arrival) = first_cache.estimate.as_ref().map(|e| e.arrival)
41                    && let Some(departure) = last_cache.estimate.as_ref().map(|e| e.departure)
42                {
43                    (departure - arrival).to_string()
44                } else {
45                    "Incomplete".to_string()
46                }
47            };
48            ui.monospace(duration_text);
49            ui.end_row();
50        });
51}