paiagram/interface/side_panel/
vehicle_stats.rs1use 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 ui.heading(
22 vehicle_name
23 .get(vehicle_entity)
24 .map_or("Unknown", Name::as_str),
25 );
26 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}