diff --git a/src/app/control/actions.rs b/src/app/control/actions.rs index 923f1d775..c169d5f4a 100644 --- a/src/app/control/actions.rs +++ b/src/app/control/actions.rs @@ -1166,6 +1166,8 @@ impl OpenCADStudio { let name = string(req, "name")?; let msg = match name { "close_modal" => Message::CloseModal, + // Show a layout (or "Model"), as clicking its tab does. + "layout_switch" => Message::LayoutSwitch(string(req, "value")?.into()), // The "changed outside" modal's suggested actions (D6): reload // the disk copy, keep the in-memory one and overwrite, save as, // or dismiss. Native only — the web build has no such dialog. diff --git a/src/scene/mod.rs b/src/scene/mod.rs index f2d821ccf..fa56c3c69 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -7223,12 +7223,20 @@ impl Scene { if block == self.model_space_block_handle() { *self.model_wire_gpu_patch.borrow_mut() = None; } + // Every content viewport of the shown layout holds a set of its own; + // a cap below their count cleared them all each frame and rebuilt + // every viewport's wires on every redraw (#1769). + let shown = if self.current_layout == "Model" { + 0 + } else { + self.paper_viewport_handles().2.len() + }; let mut sets = self.resident_wire_sets.borrow_mut(); // Evict stale entries (older epochs / abandoned keys) so switching // spaces or re-scaling a viewport can't accumulate dead full sets. let cur_epoch = self.geometry_epoch; sets.retain(|_, set| set.epoch == cur_epoch); - if sets.len() > 16 { + if sets.len() > 16.max(shown + 2) { sets.clear(); } sets.insert(