Skip to content

Commit 033c71d

Browse files
author
DavidQ
committed
Normalize Object Preview zoom display so internal 10 percent reads as user 100 percent - PR_26133_006-object-preview-zoom-display-normalization
1 parent 215ce2c commit 033c71d

4 files changed

Lines changed: 40 additions & 27 deletions

File tree

docs/dev/reports/playwright_v8_coverage_report.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# PR_26133_005 Playwright V8 Coverage Report
1+
# PR_26133_006 Playwright V8 Coverage Report
22

33
Coverage source: `docs/dev/reports/playwright_v8_coverage_report.txt`, refreshed by the final `npm run test:workspace-v2` run.
44

@@ -16,4 +16,4 @@ Coverage source: `docs/dev/reports/playwright_v8_coverage_report.txt`, refreshed
1616
- Main command: `npm run test:workspace-v2`.
1717
- Result: 46 passed.
1818
- Focused Object Vector Studio V2 layout and preview-coordinate scenarios also passed.
19-
- Manual Object Preview probe confirmed logical pointer/origin display, unchanged visual scale, and no console/runtime errors.
19+
- Manual Object Preview probe confirmed normalized zoom display, unchanged visual scale, and no console/runtime errors.
Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
# PR_26133_005 Workspace V2 Results
1+
# PR_26133_006 Workspace V2 Results
22

33
## Command Results
44

55
- `node --check tools/object-vector-studio-v2/js/ToolStarterApp.js`: passed.
66
- `node --check tests/playwright/tools/WorkspaceManagerV2.spec.mjs`: passed.
7-
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "Object Vector Studio V2 (layout shell|preview coordinates)"`: 2 passed after correcting the pointer-event test probe.
7+
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "Object Vector Studio V2 (layout shell|preview coordinates)"`: 2 passed.
88
- `npm run test:workspace-v2`: 46 passed.
99
- `git diff --check`: passed with the existing LF-to-CRLF working-copy warning for `tests/playwright/tools/WorkspaceManagerV2.spec.mjs`.
1010

1111
## Targeted Object Preview Verification
1212

1313
- Standalone Playwright manual probe reported `consoleErrors: []` and `pageErrors: []`.
14-
- Object Preview visuals remained unchanged: grid step `10`, viewBox `-640 -440 1280 880` at 25% zoom, and Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
15-
- Pointer display now reports logical coordinates: grid-space `-140,-160` displays as `Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 25%`.
16-
- Canvas origin display now reports logical coordinates: panning right displays `Origin: 2, 0 | Canvas 0,0 centered | Zoom 25%`.
17-
- Reset view displays `Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%`.
18-
- Zoom display remains logical viewport zoom and is not multiplied by `GRID_STEP`.
14+
- Object Preview visuals remained unchanged: grid step `10`, viewBox `-640 -440 1280 880` at internal 25%, and Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
15+
- Internal zoom `0.1` displayed as `Zoom 100%`.
16+
- Internal zoom `0.095` displayed as `Zoom 95%`.
17+
- Zoom buttons continued changing the internal zoom/viewBox the same way: one zoom out from reset displayed `Zoom 900%`, one zoom in back to reset displayed `Zoom 1000%`, and internal 25% displayed `Zoom 250%`.
18+
- Pointer and origin coordinate normalization from PR_26133_005 remains intact.
1919

2020
## Contract Checks
2121

22-
- `const GRID_STEP = 10;` remains unchanged.
23-
- Object rendering scale was not changed.
24-
- Grid rendering was not changed.
25-
- Canvas sizing was not changed.
22+
- Visual rendering was not changed.
23+
- Canvas size was not changed.
24+
- Grid size was not changed.
25+
- Object drawing scale was not changed.
26+
- Pointer/origin coordinate normalization was not changed.
2627
- No unrelated tool/runtime files were changed.
2728
- No fallback behavior was added.

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,20 +1838,32 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18381838
await expect(page.locator("#statusLog")).toHaveValue(/OK Shape\/Tools mode selected from keyboard: select\./);
18391839

18401840
await page.locator("#objectVectorStudioV2ZoomInButton").click();
1841-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 110%");
1841+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 1100%");
18421842
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-145.455 -100 290.909 200");
18431843
await page.locator("#objectVectorStudioV2PanRightButton").click();
18441844
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-125.455 -100 290.909 200");
1845-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 110%");
1845+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 1100%");
18461846
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18471847
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
1848+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 1000%");
1849+
await expect(page.locator("#statusLog")).toHaveValue(/OK Viewport reset to 1000% at origin 0,0\./);
1850+
await page.evaluate(() => {
1851+
window.__objectVectorStudioV2App.viewport.zoom = 0.1;
1852+
window.__objectVectorStudioV2App.updateViewport();
1853+
});
18481854
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%");
1849-
await expect(page.locator("#statusLog")).toHaveValue(/OK Viewport reset to 100% at origin 0,0\./);
1855+
await page.evaluate(() => {
1856+
window.__objectVectorStudioV2App.viewport.zoom = 0.095;
1857+
window.__objectVectorStudioV2App.updateViewport();
1858+
});
1859+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 95%");
1860+
await page.locator("#objectVectorStudioV2ResetViewButton").click();
1861+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
18501862
await page.locator("#objectVectorStudioV2RenderSurface").hover();
18511863
for (let index = 0; index < 40; index += 1) {
18521864
await page.mouse.wheel(0, -240);
18531865
}
1854-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 400%");
1866+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 4000%");
18551867
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-grid-rendered='true']")).toHaveCount(1);
18561868
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-center-origin='0,0']")).toHaveCount(1);
18571869
const zoomedGridState = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => ({
@@ -1865,7 +1877,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18651877
for (let index = 0; index < 60; index += 1) {
18661878
await page.mouse.wheel(0, 240);
18671879
}
1868-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
1880+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
18691881
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
18701882
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18711883

@@ -2127,7 +2139,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
21272139
for (let index = 0; index < 8; index += 1) {
21282140
await page.locator("#objectVectorStudioV2ZoomOutButton").click();
21292141
}
2130-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
2142+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
21312143
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
21322144

21332145
const readPreviewScale = async () => page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
@@ -2207,10 +2219,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22072219

22082220
await page.locator("#objectVectorStudioV2PanRightButton").click();
22092221
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-620 -440 1280 880");
2210-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 25%");
2222+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 250%");
22112223
await page.locator("#objectVectorStudioV2PanLeftButton").click();
22122224
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
2213-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 25%");
2225+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 250%");
22142226
const examplePointerScreen = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
22152227
const point = surface.createSVGPoint();
22162228
point.x = -140;
@@ -2223,7 +2235,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22232235
clientX: examplePointerScreen.x,
22242236
clientY: examplePointerScreen.y
22252237
});
2226-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 25%");
2238+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 250%");
22272239
await page.setViewportSize({ width: 1040, height: 720 });
22282240
const resizedPreviewScale = await readPreviewScale();
22292241
expect(resizedPreviewScale.aspectRatioStable).toBe(true);

tools/object-vector-studio-v2/js/ToolStarterApp.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const SVG_NS = "http://www.w3.org/2000/svg";
1212
const DEFAULT_VIEWPORT = Object.freeze({ height: 220, width: 320, x: 0, y: 0, zoom: 1 });
1313
const GRID_STEP = 10;
1414
const OBJECT_PREVIEW_DRAWING_SCALE = GRID_STEP;
15-
const MAX_ZOOM = 4;
15+
const MAX_ZOOM = 1;
1616
const MIN_ZOOM = 0.25;
1717
const ZOOM_STEP = 0.1;
1818

@@ -660,7 +660,7 @@ export class ToolStarterApp {
660660
this.elements.objectPreviewFooter.textContent = "Object ID: none";
661661
this.elements.jsonDetails.textContent = "{}";
662662
this.renderFrameTimeline();
663-
this.elements.coordinateDisplay.textContent = "Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%";
663+
this.elements.coordinateDisplay.textContent = `Origin: 0, 0 | Canvas 0,0 centered | Zoom ${this.formatZoomPercentage()}%`;
664664
this.elements.renderSurface.replaceChildren();
665665
this.renderSvgGrid();
666666
this.renderCenterOriginMarker();
@@ -1884,7 +1884,7 @@ export class ToolStarterApp {
18841884
}
18851885

18861886
formatZoomPercentage() {
1887-
return Math.round(this.viewport.zoom * 100);
1887+
return Math.round(this.viewport.zoom * 100 * GRID_STEP);
18881888
}
18891889

18901890
zoomViewportByStep(step) {
@@ -1900,7 +1900,7 @@ export class ToolStarterApp {
19001900
this.viewport.zoom = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, Number(nextZoom.toFixed(3))));
19011901
this.updateViewport();
19021902
this.renderWorkSurface();
1903-
this.statusLog.write(`OK Viewport zoom set to ${Math.round(this.viewport.zoom * 100)}%.`);
1903+
this.statusLog.write(`OK Viewport zoom set to ${this.formatZoomPercentage()}%.`);
19041904
}
19051905

19061906
panViewport(x, y) {
@@ -1913,7 +1913,7 @@ export class ToolStarterApp {
19131913
resetViewport() {
19141914
this.viewport = { ...DEFAULT_VIEWPORT };
19151915
this.updateViewport();
1916-
this.statusLog.write("OK Viewport reset to 100% at origin 0,0.");
1916+
this.statusLog.write(`OK Viewport reset to ${this.formatZoomPercentage()}% at origin 0,0.`);
19171917
}
19181918

19191919
updateCoordinateDisplay(event) {

0 commit comments

Comments
 (0)