fix(dynin): read a comma-separated second point as cartesian, not W/H

A rectangle's opposite corner is entered through Width/Height dynamic
fields, whose sign is taken from the cursor quadrant on commit. Typing
"50,50" is a cartesian coordinate pair, not two cursor-signed
dimensions, but the comma advance kept the Width/Height roles so the
committed corner mirrored into whatever quadrant the cursor sat in.

Key off `dyn_user_reshaped` (set only by `,`, never by Tab) to treat a
comma-separated entry as a literal cartesian coordinate for every field,
in both the point resolver and the live dyn-box display. Tab-separated
entry still reads as signed Width/Height dimensions.

Closes #269

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 4.8 committed 2026-07-04 22:27:59 +03:00
1 parent 62680883cd
commit 450dbf79ac
3 files changed
+25 -6

No files matched your search

+11 -3
View File
@@ -212,8 +212,15 @@ impl OpenCADStudio {
.unwrap_or(glam::Vec3::ZERO);
// Buffer value parsed as f32 (de-scaled by the role so a typed diameter
// becomes a radius), or the supplied geometric live value. Width/Height
// are shown unsigned, so a typed value takes the sign of the cursor's
// delta on that axis (`live` is the signed delta in the cartesian arms).
// are shown unsigned, so a typed value normally takes the sign of the
// cursor's delta on that axis (`live` is the signed delta in the
// cartesian arms). But once the user separates the two values with `,`
// — e.g. the rectangle opposite corner entered as "50,50" — the entry
// is a cartesian coordinate pair, not cursor-signed W/H dimensions, so
// the typed sign must stay literal. `,` is the only thing that sets
// `dyn_user_reshaped`, so it cleanly distinguishes comma-cartesian entry
// from Tab-separated dimension entry (#269).
let comma_cartesian = self.dyn_user_reshaped;
let val = |idx: usize, live: f32| -> f32 {
match fields[idx]
.buffer
@@ -226,7 +233,8 @@ impl OpenCADStudio {
if matches!(
fields[idx].role,
crate::command::DynRole::Width | crate::command::DynRole::Height
) {
) && !comma_cartesian
{
v.abs().copysign(live)
} else {
v