paiagram/interface/tabs/
tree_view.rs1use crate::interface::UiCommand;
2use crate::vehicle_set::VehicleSet;
3use crate::vehicles::Vehicle;
4use bevy::prelude::*;
5use egui::Id;
6use egui_ltreeview::{Action, TreeView};
7
8#[derive(Hash, PartialEq, Eq, Clone, Copy)]
9enum TreeViewItem {
10 VehicleSet(Entity),
11 Vehicle(Entity),
12}
13
14pub fn show_tree_view(
15 InMut(ui): InMut<egui::Ui>,
16 vehicle_sets: Query<(Entity, &Name, &Children), With<VehicleSet>>,
17 vehicles: Query<(Entity, &Name), With<Vehicle>>,
18 mut msg_open_tab: MessageWriter<UiCommand>,
19) {
20 let (response, actions) = TreeView::new(Id::new("tree view")).show(ui, |builder| {
21 for (set_entity, set_name, children) in vehicle_sets {
22 builder.dir(TreeViewItem::VehicleSet(set_entity), set_name.to_string());
23 for child in children {
24 if let Ok((vehicle_entity, vehicle_name)) = vehicles.get(*child) {
25 builder.leaf(
26 TreeViewItem::Vehicle(vehicle_entity),
27 vehicle_name.to_string(),
28 );
29 }
30 }
31 builder.close_dir();
32 }
33 });
34 for action in actions {
35 match action {
36 Action::Activate(entries) => {
37 for item in entries.selected {
38 match item {
39 TreeViewItem::Vehicle(entity) => {
40 msg_open_tab.write(UiCommand::OpenOrFocusVehicleTab(
41 crate::interface::AppTab::Vehicle(entity),
42 ));
43 }
44 _ => {}
45 }
46 }
47 }
48 _ => {}
49 }
50 }
51}