use crate::automation::hit_keys::HitKeyDoc;
use brep_render::engine_state::{EngineState, SelectionFilter};
use crate::icon_text::IconTextUi as _;
use eframe::egui;
use std::collections::HashMap;
const KINDS: [(&str, &str); 7] = [
("COMPONENT", "Component"),
("SOLID", "Solid"),
("SKETCH", "Sketch"),
("FACE", "Face"),
("EDGE", "Edge"),
("VERTEX", "Vertex"),
("PLANE", "Plane"),
];
#[derive(Default)]
pub struct SelectionPanel {
hits: HashMap<String, egui::Rect>,
}
impl SelectionPanel {
pub fn new() -> Self {
Self::default()
}
pub fn show_status_bar(&mut self, ui: &mut egui::Ui, state: &mut EngineState) {
self.hits.clear();
ui.horizontal_wrapped(|ui| {
let locked = state.ref_select_active();
if locked {
ui.icon_label(egui::RichText::new("\u{1f512} Reference selection — filter locked").weak())
.on_hover_text(
"The pick filter is set by the field being referenced. \
Finish or cancel the reference selection to change it.",
);
} else {
ui.label("Pickable:");
}
ui.add_enabled_ui(!locked, |ui| {
let mut filter = state.selection_filter();
let before = filter;
let all_on = KINDS.iter().all(|(k, _)| filter.get(k));
let any_on = KINDS.iter().any(|(k, _)| filter.get(k));
let mut all_checked = all_on;
let resp = ui.add(
egui::Checkbox::new(&mut all_checked, "All").indeterminate(any_on && !all_on),
);
self.hits.insert("filter:ALL".into(), resp.rect);
if resp.changed() {
let target = toggle_all_target(&filter);
for (kind, _) in KINDS {
filter.set(kind, target);
}
}
for (kind, label) in KINDS {
let mut on = filter.get(kind);
let resp = ui.checkbox(&mut on, label);
self.hits.insert(format!("filter:{kind}"), resp.rect);
if resp.changed() {
filter.set(kind, on);
}
}
if filter != before {
state.set_selection_filter(filter);
}
});
});
}
pub fn clear_hits(&mut self) {
self.hits.clear();
}
pub fn hits_json(&self) -> String {
crate::automation::hit_rects::hits_json(&self.hits)
}
}
fn toggle_all_target(filter: &SelectionFilter) -> bool {
!KINDS.iter().all(|(k, _)| filter.get(k))
}
pub static HIT_KEYS: &[HitKeyDoc] = &[
HitKeyDoc { panel: "selection", prefix: "filter:", meaning: "toggle which entity kinds a click may pick (filter:ALL, filter:kind)", command: None },
];