use crate::automation::hit_keys::HitKeyDoc;
use crate::column_tree;
use crate::panels::bom_columns;
use brep_render::engine_state::EngineState;
use eframe::egui;
use serde_json::Value;
use std::collections::HashMap;
#[derive(Default)]
pub struct PartPropertiesPanel {
pub open: bool,
hits: HashMap<String, egui::Rect>,
}
impl PartPropertiesPanel {
pub fn new() -> Self {
Self::default()
}
pub fn show(
&mut self,
ctx: &egui::Context,
state: &mut EngineState,
title: &str,
document: u64,
) {
if !self.open {
return;
}
let mut open = true;
egui::Window::new("Part Properties")
.open(&mut open)
.movable(true)
.resizable(true)
.default_size([340.0, 420.0])
.default_pos([660.0, 96.0])
.show(ctx, |ui| self.body(ui, state, title, document));
self.open = open;
if crate::automation::registry::enabled() {
crate::automation::registry::publish(
"__brepPartPropertiesHit",
"part properties window widget rects (field:*)",
&self.hits_json(),
);
}
}
fn body(&mut self, ui: &mut egui::Ui, state: &mut EngineState, title: &str, document: u64) {
self.hits.clear();
ui.label(egui::RichText::new(title).strong());
ui.label(
egui::RichText::new(
"Stored on this document and carried into any assembly's BOM.",
)
.weak()
.small(),
);
ui.separator();
let stored = state.document_part_attributes();
let fields = bom_columns::part_fields(
&bom_columns::effective_text(&state.settings.bom_columns),
&stored,
);
let mut edits: Vec<(String, Value)> = Vec::new();
egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| {
egui::Grid::new("part-properties-grid")
.num_columns(2)
.spacing([8.0, 4.0])
.striped(true)
.show(ui, |ui| {
for field in &fields {
ui.label(field.label());
let size = egui::vec2(
ui.available_width().max(80.0),
ui.spacing().interact_size.y,
);
let (committed, rect) = column_tree::value_editor(
ui,
egui::Id::new(("part-properties", document, &field.field)),
&field.kind(),
stored.get(&field.field),
size,
);
self.hits.insert(format!("field:{}", field.field), rect);
if let Some(value) = committed {
edits.push((field.field.clone(), value));
}
ui.end_row();
}
});
});
for (key, value) in edits {
let _ = state.set_document_part_attribute(&key, value);
}
}
pub fn hits_json(&self) -> String {
crate::automation::hit_rects::hits_json(&self.hits)
}
}
pub static HIT_KEYS: &[HitKeyDoc] = &[HitKeyDoc {
panel: "partproperties",
prefix: "field:",
meaning: "a part-attribute editor in the Part Properties window (field:<Field>)",
command: Some("part_attribute_set"),
}];