feat(points): point style commands + DDPTYPE dialog, viewport-aware size

Points could only render as a 1px dot — no way to change PDMODE/PDSIZE.

- PDMODE / PDSIZE commands set the header value and rebuild the glyphs.
- DDPTYPE opens a Point Style dialog: a 5x4 grid of rendered glyphs
  (shape x enclosure), a size field, and relative/absolute radios.
- Relative (<=0) PDSIZE now sizes from the current world-per-pixel so the
  marker stays a roughly constant on-screen size across zoom, rebuilding
  on zoom via the existing camera-generation cache key. Absolute (>0)
  scales with the world as before. Switching to absolute with a zero size
  seeds a positive value from the on-screen size so it stays representable.

Part of the #100 extensibility epic (point style surfaced in #106).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-17 11:13:12 +03:00
commit 96ec672d5b
14 changed files with 456 additions and 45 deletions

View file

@ -1100,6 +1100,7 @@ impl OpenCADStudio {
AssocPrompt => (440, 210),
Unsaved => (420, 160),
SaveDialog => (560, 480),
PointStyle => (360, 470),
};
Some((w as f32 + EXTRA_W, h as f32 + EXTRA_H))
}
@ -1572,6 +1573,15 @@ impl OpenCADStudio {
};
sized(unsaved_changes_dialog_window(&tab_name), 420, 160)
}
super::ModalKind::PointStyle => sized(
crate::ui::point_style::view_window(
self.tabs[self.active_tab].scene.document.header.point_display_mode,
self.point_size_relative,
&self.point_size_buf,
),
360,
470,
),
super::ModalKind::SaveDialog => sized(
save_as_dialog_window(
&self.save_dialog_filename,