feat(ui): feature-parity context menu — Snap Overrides, transparent Pan/Zoom, ARC keyword flow

The command menu now follows the commercial solutions' layout row for row: Enter, Cancel,
Recent Input ▸, the command's keywords, Snap Overrides ▸ (every object snap
with its glyph, Mid Between 2 Points, None, Osnap Settings…), then Pan and
Zoom. Pan / Zoom run transparently while a command is active ('PAN,
'ZOOM …): navigation modes leave the command untouched and an interactive
ZOOM Window parks it and resumes it afterwards. Rows carry an icon gutter
so labels align; the Enter row shows a default value ("<0.5000>") as its
hint instead of a second finish row.

ARC gets the commercial solutions' prompt flow with all keywords: start [Center], second
point [Center/End], end; after Center: end [Angle/chord Length]; after
End: center [Angle/Direction/Radius]; Enter continues tangent. The
previous default (Center/Start/End with method codes) stays as ARC_CSE.

Object snaps gain a one-shot "None" override. New strings in all locales.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
PanosandClaude Opus 5 committed 2026-09-17 12:05:15 +03:00
1 parent 96df4928c7
commit 02cd98e790
34 files changed
+1305 -67

No files matched your search

+11
View File
@@ -416,6 +416,17 @@ impl Snapper {
self.snap_enabled = true;
}
/// One-shot "None" override (Snap Overrides ▸ None): the next pick takes
/// the raw cursor point, ignoring every running object snap, after which
/// `clear_override` restores the saved configuration.
pub fn set_override_none(&mut self) {
if self.override_saved.is_none() {
self.override_saved = Some((self.enabled.clone(), self.snap_enabled));
}
self.enabled.clear();
self.snap_enabled = false;
}
/// Restore the pre-override snap configuration. No-op when inactive.
pub fn clear_override(&mut self) {
if let Some((enabled, on)) = self.override_saved.take() {