Files
OneCAD-Draft/src/app/layers.rs
T
Hakan Seven 89fcb21b46 fix(layer): propagate LAY* command changes to panel + dropdown (#39)
LAYOFF / LAYFRZ / LAYLCK / LAYON / LAYTHW / LAYULK / LAYISO /
LAYUNISO mutated the document's layer table (\`turn_off\` /
\`freeze\` / \`lock\` / …) and then called \`sync_ribbon_layers\`,
which feeds the ribbon dropdown from \`self.tabs[i].layers.layers\`
— the \`LayerPanel\` cache. That cache was never refreshed from
the document for these commands, so the dropdown stayed wrong and
the Layers Properties Manager kept showing the old visibility /
lock / freeze icons.

Add \`OpenCADStudio::refresh_layer_panel\` that runs
\`LayerPanel::sync_with_viewports\` from the live document before
calling \`sync_ribbon_layers\`. Replace every direct
\`sync_ribbon_layers\` in \`commands.rs\` (all of them sit inside
LAY* arms) with the new helper.

Closes #39
2026-05-29 01:30:02 +03:00

141 lines
4.7 KiB
Rust

use super::OpenCADStudio;
use crate::ui;
impl OpenCADStudio {
/// Reload the `LayerPanel` cache from the document and push the
/// fresh state through to the ribbon dropdown + every other
/// layer-aware UI mirror. Use this whenever a command mutates the
/// document's layer table directly (LAYOFF / LAYFRZ / LAYLCK …) so
/// the panel + dropdown reflect the change. See #39.
pub(super) fn refresh_layer_panel(&mut self) {
let i = self.active_tab;
let doc_layers = self.tabs[i].scene.document.layers.clone();
let vp_info = self.tabs[i].scene.viewport_list();
self.tabs[i]
.layers
.sync_with_viewports(&doc_layers, vp_info);
self.sync_ribbon_layers();
}
pub(super) fn sync_ribbon_layers(&mut self) {
let i = self.active_tab;
let active = self.tabs[i].active_layer.clone();
let infos: Vec<crate::ui::ribbon::LayerInfo> = self.tabs[i]
.layers
.layers
.iter()
.map(|l| crate::ui::ribbon::LayerInfo {
name: l.name.clone(),
color: l.color,
visible: l.visible,
frozen: l.frozen,
locked: l.locked,
})
.collect();
let names: Vec<String> = infos.iter().map(|l| l.name.clone()).collect();
let active = if names.contains(&active) {
active
} else {
"0".to_string()
};
self.tabs[i].active_layer = active.clone();
self.tabs[i].layers.current_layer = active.clone();
self.ribbon.set_layers(infos, &active);
let lt_items: Vec<ui::properties::LinetypeItem> = self.tabs[i]
.scene
.document
.line_types
.iter()
.map(|lt| {
let name = if lt.name.eq_ignore_ascii_case("bylayer") {
"ByLayer".to_string()
} else {
lt.name.clone()
};
let art = crate::linetypes::extract_pattern(&lt.description);
ui::properties::LinetypeItem { name, art }
})
.collect();
self.tabs[i].layers.sync_linetypes(lt_items.clone());
self.ribbon.set_available_linetypes(lt_items);
self.sync_ribbon_styles();
}
pub(super) fn sync_ribbon_styles(&mut self) {
let i = self.active_tab;
let doc = &self.tabs[i].scene.document;
let text_names: Vec<String> = doc.text_styles.iter().map(|s| s.name.clone()).collect();
let active_text = doc.header.current_text_style_name.clone();
let active_text = if text_names.contains(&active_text) {
active_text
} else {
text_names
.first()
.cloned()
.unwrap_or_else(|| "Standard".to_string())
};
let dim_names: Vec<String> = doc.dim_styles.iter().map(|s| s.name.clone()).collect();
let active_dim = doc.header.current_dimstyle_name.clone();
let active_dim = if dim_names.contains(&active_dim) {
active_dim
} else {
dim_names
.first()
.cloned()
.unwrap_or_else(|| "Standard".to_string())
};
let mleader_names: Vec<String> = doc
.objects
.values()
.filter_map(|o| {
if let acadrust::objects::ObjectType::MultiLeaderStyle(mls) = o {
Some(mls.name.clone())
} else {
None
}
})
.collect();
let active_mleader = self.tabs[i].active_mleader_style.clone();
let active_mleader = if mleader_names.contains(&active_mleader) {
active_mleader
} else {
mleader_names
.first()
.cloned()
.unwrap_or_else(|| "Standard".to_string())
};
let table_names: Vec<String> = doc
.objects
.values()
.filter_map(|o| {
if let acadrust::objects::ObjectType::TableStyle(ts) = o {
Some(ts.name.clone())
} else {
None
}
})
.collect();
let active_table = table_names
.first()
.cloned()
.unwrap_or_else(|| "Standard".to_string());
let active_mleader2 = active_mleader.clone();
let active_table2 = active_table.clone();
self.ribbon.set_styles(
text_names,
&active_text,
dim_names,
&active_dim,
mleader_names,
&active_mleader2,
table_names,
&active_table2,
);
}
}