(
ui: &mut egui::Ui,
selected_obj: &mut Option<usize>,
units: &[ObjectConfig],
node: &ProjectObjectNode,
appearance: &Appearance,
node_open: NodeOpen,
)
| 398 | } |
| 399 | |
| 400 | fn display_node( |
| 401 | ui: &mut egui::Ui, |
| 402 | selected_obj: &mut Option<usize>, |
| 403 | units: &[ObjectConfig], |
| 404 | node: &ProjectObjectNode, |
| 405 | appearance: &Appearance, |
| 406 | node_open: NodeOpen, |
| 407 | ) { |
| 408 | match node { |
| 409 | ProjectObjectNode::Unit(name, idx) => { |
| 410 | display_unit(ui, selected_obj, name, units, *idx, appearance); |
| 411 | } |
| 412 | ProjectObjectNode::Dir(name, children) => { |
| 413 | let contains_obj = selected_obj.map(|idx| contains_node(node, idx)); |
| 414 | let open = match node_open { |
| 415 | NodeOpen::Default => None, |
| 416 | NodeOpen::Open => Some(true), |
| 417 | NodeOpen::Close => Some(false), |
| 418 | NodeOpen::Object => contains_obj, |
| 419 | }; |
| 420 | let color = if contains_obj == Some(true) { |
| 421 | appearance.replace_color |
| 422 | } else { |
| 423 | appearance.text_color |
| 424 | }; |
| 425 | CollapsingHeader::new( |
| 426 | RichText::new(name) |
| 427 | .font(FontId { |
| 428 | size: appearance.ui_font.size, |
| 429 | family: appearance.code_font.family.clone(), |
| 430 | }) |
| 431 | .color(color), |
| 432 | ) |
| 433 | .open(open) |
| 434 | .show(ui, |ui| { |
| 435 | for node in children { |
| 436 | display_node(ui, selected_obj, units, node, appearance, node_open); |
| 437 | } |
| 438 | }); |
| 439 | } |
| 440 | } |
| 441 | } |
| 442 | |
| 443 | fn contains_node(node: &ProjectObjectNode, selected_obj: usize) -> bool { |
| 444 | match node { |
no test coverage detected