forked from 1b-agent/opencadstudio-upstream
perf(core): cache ribbon_groups() with OnceLock, avoid per-frame tree allocations
Change CadModule::ribbon_groups() from -> Vec<RibbonGroup> to -> &[RibbonGroup], backed by a per-module OnceLock cache. The ribbon group tree is static data (&'static str, Copy enums) that was being fully reconstructed — Vecs, String clones, enum discriminants — on every call, including all three per-frame call sites (view(), dropdown_overlay(), style_combo_overlay()). - 7 built-in modules + 2 plugin templates cache via function-local OnceLock. Safe because each is a unit struct with exactly one instance per process (plugins run in isolated child processes; see PluginProcess::spawn()). - SharedCadModule avoids the static pattern entirely, storing groups in an instance field (owned.rs). - IPC runner converts &RibbonGroup -> OwnedRibbonGroup directly via new From<&T> impls, avoiding an intermediate clone. - render_small/render_large and the two make_tool_row closures now borrow (&RibbonItem, &[ToolDef]) instead of taking ownership, so the view loop doesn't need to clone items to satisfy the old by-value signatures. - Various match-ergonomics deref fixes (*id, *default, *icon, etc.) from the &RibbonItem pattern change.
This commit is contained in:
1 parent
8164e14a19
commit
73b05e1dec
14 files changed
+947
-690
No files matched your search
+56
-53
@@ -21,58 +21,61 @@ impl CadModule for ManageModule {
|
||||
"Manage"
|
||||
}
|
||||
|
||||
fn ribbon_groups(&self) -> Vec<RibbonGroup> {
|
||||
vec![
|
||||
// ── Customization ─────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Customization",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(user_interface::tool()),
|
||||
RibbonItem::LargeTool(crate::modules::ToolDef {
|
||||
id: "TOOLPALETTES",
|
||||
label: "Tool\nPalettes",
|
||||
icon: IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/tool_palettes.svg"
|
||||
)),
|
||||
event: crate::modules::ModuleEvent::Command("TOOLPALETTES".to_string()),
|
||||
}),
|
||||
RibbonItem::Tool(cui_import::tool()),
|
||||
RibbonItem::Tool(cui_export::tool()),
|
||||
RibbonItem::Dropdown {
|
||||
id: "ALIASEDIT_DROPDOWN",
|
||||
icon: IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/edit_aliases.svg"
|
||||
)),
|
||||
items: vec![
|
||||
(
|
||||
"ALIASEDIT",
|
||||
"Edit Aliases",
|
||||
IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/edit_aliases.svg"
|
||||
)),
|
||||
),
|
||||
(
|
||||
"CUILOAD",
|
||||
"Load Partial CUI",
|
||||
IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/cui_import.svg"
|
||||
)),
|
||||
),
|
||||
],
|
||||
default: "ALIASEDIT",
|
||||
},
|
||||
],
|
||||
},
|
||||
// ── Cleanup ───────────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Cleanup",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(find_nonpurgeable::tool()),
|
||||
RibbonItem::Tool(purge::tool()),
|
||||
RibbonItem::Tool(overkill::tool()),
|
||||
RibbonItem::Tool(audit::tool()),
|
||||
],
|
||||
},
|
||||
]
|
||||
fn ribbon_groups(&self) -> &[RibbonGroup] {
|
||||
static GROUPS: std::sync::OnceLock<Vec<RibbonGroup>> = std::sync::OnceLock::new();
|
||||
GROUPS.get_or_init(|| {
|
||||
vec![
|
||||
// ── Customization ─────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Customization",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(user_interface::tool()),
|
||||
RibbonItem::LargeTool(crate::modules::ToolDef {
|
||||
id: "TOOLPALETTES",
|
||||
label: "Tool\nPalettes",
|
||||
icon: IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/tool_palettes.svg"
|
||||
)),
|
||||
event: crate::modules::ModuleEvent::Command("TOOLPALETTES".to_string()),
|
||||
}),
|
||||
RibbonItem::Tool(cui_import::tool()),
|
||||
RibbonItem::Tool(cui_export::tool()),
|
||||
RibbonItem::Dropdown {
|
||||
id: "ALIASEDIT_DROPDOWN",
|
||||
icon: IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/edit_aliases.svg"
|
||||
)),
|
||||
items: vec![
|
||||
(
|
||||
"ALIASEDIT",
|
||||
"Edit Aliases",
|
||||
IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/edit_aliases.svg"
|
||||
)),
|
||||
),
|
||||
(
|
||||
"CUILOAD",
|
||||
"Load Partial CUI",
|
||||
IconKind::Svg(include_bytes!(
|
||||
"../../../assets/icons/cui_import.svg"
|
||||
)),
|
||||
),
|
||||
],
|
||||
default: "ALIASEDIT",
|
||||
},
|
||||
],
|
||||
},
|
||||
// ── Cleanup ───────────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Cleanup",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(find_nonpurgeable::tool()),
|
||||
RibbonItem::Tool(purge::tool()),
|
||||
RibbonItem::Tool(overkill::tool()),
|
||||
RibbonItem::Tool(audit::tool()),
|
||||
],
|
||||
},
|
||||
]
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user