paiagram/interface/tabs/
tree_view.rs

1use 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}