feat(styles): seed current table/multileader style from the file
Bump acadrust to pick up the new $CTABLESTYLE / $CMLEADERSTYLE header variables, then on load seed the ribbon's active table style and the tab's active multileader style from the document header so the ✓ marks the style the file actually declares (DXF). Set Current writes the header field as the round-trip source of truth, and the style-manager staging snapshot now covers it. sync_ribbon_styles honours the active table style instead of always falling back to the first one. DWG still leaves these at "Standard" until acadrust parses them from the binary header. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
b3ba3a53d1
commit
e65a7a6d67
4 changed files with 36 additions and 5 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -56,7 +56,7 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "acadrust"
|
name = "acadrust"
|
||||||
version = "0.3.4"
|
version = "0.3.4"
|
||||||
source = "git+https://github.com/HakanSeven12/acadrust?branch=main#041df8c0568ea1242a39e22f2d04e770317bdf7c"
|
source = "git+https://github.com/HakanSeven12/acadrust?branch=main#2f3ff7995110b570bf64e22c5d8752803b8ecf7d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
|
|
||||||
|
|
@ -119,10 +119,15 @@ impl OpenCADStudio {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
let active_table = table_names
|
let active_table = self.ribbon.active_table_style.clone();
|
||||||
.first()
|
let active_table = if table_names.contains(&active_table) {
|
||||||
.cloned()
|
active_table
|
||||||
.unwrap_or_else(|| "Standard".to_string());
|
} else {
|
||||||
|
table_names
|
||||||
|
.first()
|
||||||
|
.cloned()
|
||||||
|
.unwrap_or_else(|| "Standard".to_string())
|
||||||
|
};
|
||||||
|
|
||||||
let active_mleader2 = active_mleader.clone();
|
let active_mleader2 = active_mleader.clone();
|
||||||
let active_table2 = active_table.clone();
|
let active_table2 = active_table.clone();
|
||||||
|
|
|
||||||
|
|
@ -473,6 +473,8 @@ impl OpenCADStudio {
|
||||||
current_text: doc.header.current_text_style_name.clone(),
|
current_text: doc.header.current_text_style_name.clone(),
|
||||||
current_dim: doc.header.current_dimstyle_name.clone(),
|
current_dim: doc.header.current_dimstyle_name.clone(),
|
||||||
multiline_style: doc.header.multiline_style.clone(),
|
multiline_style: doc.header.multiline_style.clone(),
|
||||||
|
current_table: doc.header.current_table_style_name.clone(),
|
||||||
|
current_mleader: doc.header.current_mleader_style_name.clone(),
|
||||||
active_table: self.ribbon.active_table_style.clone(),
|
active_table: self.ribbon.active_table_style.clone(),
|
||||||
active_mleader: self.ribbon.active_mleader_style.clone(),
|
active_mleader: self.ribbon.active_mleader_style.clone(),
|
||||||
tab_active_mleader: self.tabs[i].active_mleader_style.clone(),
|
tab_active_mleader: self.tabs[i].active_mleader_style.clone(),
|
||||||
|
|
@ -500,6 +502,8 @@ impl OpenCADStudio {
|
||||||
doc.header.current_text_style_name = snap.current_text.clone();
|
doc.header.current_text_style_name = snap.current_text.clone();
|
||||||
doc.header.current_dimstyle_name = snap.current_dim.clone();
|
doc.header.current_dimstyle_name = snap.current_dim.clone();
|
||||||
doc.header.multiline_style = snap.multiline_style.clone();
|
doc.header.multiline_style = snap.multiline_style.clone();
|
||||||
|
doc.header.current_table_style_name = snap.current_table.clone();
|
||||||
|
doc.header.current_mleader_style_name = snap.current_mleader.clone();
|
||||||
self.ribbon.active_table_style = snap.active_table.clone();
|
self.ribbon.active_table_style = snap.active_table.clone();
|
||||||
self.ribbon.active_mleader_style = snap.active_mleader.clone();
|
self.ribbon.active_mleader_style = snap.active_mleader.clone();
|
||||||
self.tabs[i].active_mleader_style = snap.tab_active_mleader.clone();
|
self.tabs[i].active_mleader_style = snap.tab_active_mleader.clone();
|
||||||
|
|
@ -563,6 +567,8 @@ pub(super) struct StyleStateSnapshot {
|
||||||
current_text: String,
|
current_text: String,
|
||||||
current_dim: String,
|
current_dim: String,
|
||||||
multiline_style: String,
|
multiline_style: String,
|
||||||
|
current_table: String,
|
||||||
|
current_mleader: String,
|
||||||
active_table: String,
|
active_table: String,
|
||||||
active_mleader: String,
|
active_mleader: String,
|
||||||
tab_active_mleader: String,
|
tab_active_mleader: String,
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,19 @@ impl OpenCADStudio {
|
||||||
self.tabs[i].scene.current_layout = "Model".to_string();
|
self.tabs[i].scene.current_layout = "Model".to_string();
|
||||||
crate::linetypes::populate_document(&mut self.tabs[i].scene.document);
|
crate::linetypes::populate_document(&mut self.tabs[i].scene.document);
|
||||||
self.tabs[i].properties = PropertiesPanel::empty();
|
self.tabs[i].properties = PropertiesPanel::empty();
|
||||||
|
// Seed the current table / multileader style from the file's
|
||||||
|
// header so the ✓ marks the right one (text/dim/mline come from
|
||||||
|
// the document header directly). DXF provides these via
|
||||||
|
// $CTABLESTYLE / $CMLEADERSTYLE; DWG leaves them at "Standard".
|
||||||
|
self.ribbon.active_table_style =
|
||||||
|
self.tabs[i].scene.document.header.current_table_style_name.clone();
|
||||||
|
self.tabs[i].active_mleader_style = self
|
||||||
|
.tabs[i]
|
||||||
|
.scene
|
||||||
|
.document
|
||||||
|
.header
|
||||||
|
.current_mleader_style_name
|
||||||
|
.clone();
|
||||||
let doc_layers = self.tabs[i].scene.document.layers.clone();
|
let doc_layers = self.tabs[i].scene.document.layers.clone();
|
||||||
let vp_info = self.tabs[i].scene.viewport_list();
|
let vp_info = self.tabs[i].scene.viewport_list();
|
||||||
self.tabs[i]
|
self.tabs[i]
|
||||||
|
|
@ -6556,11 +6569,15 @@ impl OpenCADStudio {
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
Message::TableStyleDialogSetCurrent => {
|
Message::TableStyleDialogSetCurrent => {
|
||||||
|
// Staged: persists on Apply. The header field is the round-trip
|
||||||
|
// source of truth ($CTABLESTYLE); the ribbon mirrors it.
|
||||||
|
let i = self.active_tab;
|
||||||
let name = self.tablestyle_selected.clone();
|
let name = self.tablestyle_selected.clone();
|
||||||
if self
|
if self
|
||||||
.style_names(crate::app::StyleKind::Table)
|
.style_names(crate::app::StyleKind::Table)
|
||||||
.contains(&name)
|
.contains(&name)
|
||||||
{
|
{
|
||||||
|
self.tabs[i].scene.document.header.current_table_style_name = name.clone();
|
||||||
self.ribbon.active_table_style = name.clone();
|
self.ribbon.active_table_style = name.clone();
|
||||||
self.command_line
|
self.command_line
|
||||||
.push_output(&format!("Current table style: {name}"));
|
.push_output(&format!("Current table style: {name}"));
|
||||||
|
|
@ -6727,6 +6744,9 @@ impl OpenCADStudio {
|
||||||
.values()
|
.values()
|
||||||
.any(|o| matches!(o, ObjectType::MultiLeaderStyle(s) if s.name == name));
|
.any(|o| matches!(o, ObjectType::MultiLeaderStyle(s) if s.name == name));
|
||||||
if exists {
|
if exists {
|
||||||
|
// Staged: header field is the round-trip source of truth
|
||||||
|
// ($CMLEADERSTYLE); the ribbon/tab mirror it.
|
||||||
|
self.tabs[i].scene.document.header.current_mleader_style_name = name.clone();
|
||||||
self.tabs[i].active_mleader_style = name.clone();
|
self.tabs[i].active_mleader_style = name.clone();
|
||||||
self.ribbon.active_mleader_style = name.clone();
|
self.ribbon.active_mleader_style = name.clone();
|
||||||
self.command_line
|
self.command_line
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue