use brep_render::engine_state::EngineState;
use eframe::egui;
use std::collections::HashMap;
const KINDS: [(&str, &str); 4] = [
("SOLID", "Solid"),
("FACE", "Face"),
("EDGE", "Edge"),
("VERTEX", "Vertex"),
];
#[derive(Default)]
pub struct SelectionPanel {
hits: HashMap<String, egui::Rect>,
}
impl SelectionPanel {
pub fn new() -> Self {
Self::default()
}
pub fn show(&mut self, ui: &mut egui::Ui, state: &mut EngineState) {
self.hits.clear();
egui::CollapsingHeader::new("Selection")
.id_salt("selection")
.default_open(true)
.show(ui, |ui| {
self.filter_row(ui, state);
});
}
#[cfg(target_arch = "wasm32")]
pub fn hits_json(&self) -> String {
let map: serde_json::Map<String, serde_json::Value> = self
.hits
.iter()
.map(|(k, r)| {
(
k.clone(),
serde_json::json!([r.min.x, r.min.y, r.width(), r.height()]),
)
})
.collect();
serde_json::Value::Object(map).to_string()
}
fn filter_row(&mut self, ui: &mut egui::Ui, state: &mut EngineState) {
ui.label("Pickable kinds — a click selects the highest-priority one enabled:");
let mut filter = state.selection_filter();
let before = filter;
ui.horizontal_wrapped(|ui| {
for (kind, label) in KINDS {
let mut on = filter.get(kind);
let resp = ui.toggle_value(&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);
}
}
}