Skip to content

Commit 6a68cda

Browse files
author
DavidQ
committed
Apply confirmed Object Preview zoom values to restore correct default view - PR_26133_009-object-preview-apply-confirmed-zoom-hack
1 parent 438d739 commit 6a68cda

4 files changed

Lines changed: 50 additions & 40 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_007 Playwright V8 Coverage Report
1+
# PR_26133_009 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 default zoom display, 1% control steps, min/max range, unchanged visual scale, and no console/runtime errors.
19+
- Manual Object Preview probe confirmed the applied zoom hack values, confirmed default view, max zoom cap, preserved logical coordinates, and no console/runtime errors.
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
1-
# PR_26133_007 Workspace V2 Results
1+
# PR_26133_009 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.
77
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "Object Vector Studio V2 (layout shell|preview coordinates)"`: 2 passed.
8-
- `npx playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --grep "blocks Workspace Manager V2 Save when the toolState file fails schema validation"`: 1 passed after the test setup waited for the Asset Manager V2 session before corrupting it.
9-
- Final `npm run test:workspace-v2`: 46 passed.
8+
- `npm run test:workspace-v2`: 46 passed.
109
- `git diff --check`: passed with the existing LF-to-CRLF working-copy warning for `tests/playwright/tools/WorkspaceManagerV2.spec.mjs`.
1110

1211
## Targeted Object Preview Verification
1312

1413
- Standalone Playwright manual probe reported `consoleErrors: []` and `pageErrors: []`.
15-
- Startup/default Object Preview display is `Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%`.
16-
- Zoom controls increment/decrement by 1%: zoom in displays `Zoom 101%`, then zoom out returns to `Zoom 100%`.
17-
- Zoom range clamps to the updated constants: max displays `Zoom 200%` with viewBox `-80 -55 160 110`; min displays `Zoom 1%` with viewBox `-16000 -11000 32000 22000`.
18-
- Visual scale remains unchanged at default: viewBox `-160 -110 320 220`, grid step `10`, and Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
19-
- Pointer/origin coordinate normalization from PR_26133_005 remains intact.
14+
- Confirmed values are applied: `DEFAULT_VIEWPORT.zoom = 0.1`, `MAX_ZOOM = 0.5`, and zoom text/status use `formatZoomPercentage() * 10`.
15+
- Startup/default Object Preview display is `Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%` with viewBox `-1600 -1100 3200 2200`.
16+
- Zoom in from startup displays `Zoom 110%` with viewBox `-1454.545 -1000 2909.091 2000`.
17+
- Max zoom clamps at the confirmed cap: `Zoom 500%` with viewBox `-320 -220 640 440`.
18+
- Internal `0.25` displays `Zoom 250%` with viewBox `-640 -440 1280 880`.
19+
- Visual scale remains aligned to the confirmed grid/object contract: grid step `10`, Asteroids ship drawn points `0,-180`, `140,160`, `0,80`, `-140,160`.
20+
- Pointer/origin coordinate math remains logical: panned origin displays `Origin: 2, 0`; grid-space pointer `-140,-160` displays `Pointer -14, -16`.
2021

2122
## Contract Checks
2223

23-
- `const MAX_ZOOM = 2;`, `const MIN_ZOOM = 0.01;`, and `const ZOOM_STEP = 0.01;` are applied.
2424
- Canvas size was not changed.
2525
- Grid size was not changed.
2626
- Object drawing scale was not changed.
27-
- Coordinate normalization logic was not changed.
27+
- Pointer/origin coordinate normalization was preserved.
28+
- No sample JSON files were changed.
2829
- No unrelated tool/runtime files were changed.

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,7 +1514,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
15141514
await expect(page.locator("#objectVectorStudioV2ObjectDetailsCount")).toHaveText("(18 obj, 0 shapes)");
15151515
await expect(page.locator("#objectVectorStudioV2ObjectDetails")).toContainText("No shape selected");
15161516
await expect(page.locator("#objectVectorStudioV2ObjectPreviewFooter")).toContainText("Object ID: object.asteroids.object-1");
1517-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
1517+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1600 -1100 3200 2200");
15181518
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-center-origin='0,0']")).toHaveCount(1);
15191519
await expect(page.locator("#objectVectorStudioV2CenterDotButton")).toHaveAttribute("aria-pressed", "true");
15201520
await page.locator("#objectVectorStudioV2CenterDotButton").click();
@@ -1837,36 +1837,45 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18371837
await page.keyboard.press("V");
18381838
await expect(page.locator("#statusLog")).toHaveValue(/OK Shape\/Tools mode selected from keyboard: select\./);
18391839

1840+
const zoomSource = await readFile("tools/object-vector-studio-v2/js/ToolStarterApp.js", "utf8");
1841+
expect(zoomSource).toContain("const DEFAULT_VIEWPORT = Object.freeze({ height: 220, width: 320, x: 0, y: 0, zoom: 0.1 });");
1842+
expect(zoomSource).toContain("const MAX_ZOOM = 0.5;");
1843+
expect(zoomSource).toContain("const MIN_ZOOM = 0.01;");
1844+
expect(zoomSource).toContain("const ZOOM_STEP = 0.01;");
1845+
expect(zoomSource).toMatch(/formatZoomPercentage\(\) \{\s+return Math\.round\(this\.viewport\.zoom \* 100\);\s+\}/);
1846+
expect(zoomSource.match(/formatZoomPercentage\(\) \* 10/g)?.length || 0).toBeGreaterThanOrEqual(4);
1847+
expect(zoomSource).not.toMatch(/viewport\.zoom\s*\*\s*100\s*\*\s*GRID_STEP|const MAX_ZOOM = 2/);
1848+
18401849
await page.locator("#objectVectorStudioV2ZoomInButton").click();
1841-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 101%");
1842-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-158.416 -108.911 316.832 217.822");
1850+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 110%");
1851+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1454.545 -1000 2909.091 2000");
18431852
await page.locator("#objectVectorStudioV2PanRightButton").click();
1844-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-138.416 -108.911 316.832 217.822");
1845-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 101%");
1853+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1434.545 -1000 2909.091 2000");
1854+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 110%");
18461855
await page.locator("#objectVectorStudioV2ResetViewButton").click();
1847-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
1856+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1600 -1100 3200 2200");
18481857
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%");
18491858
await expect(page.locator("#statusLog")).toHaveValue(/OK Viewport reset to 100% at origin 0,0\./);
18501859
await page.evaluate(() => {
1851-
window.__objectVectorStudioV2App.viewport.zoom = 0.95;
1860+
window.__objectVectorStudioV2App.viewport.zoom = 0.095;
18521861
window.__objectVectorStudioV2App.updateViewport();
18531862
});
1854-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 95%");
1863+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 100%");
18551864
await page.evaluate(() => {
18561865
window.__objectVectorStudioV2App.zoomViewport(2.5);
18571866
});
1858-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 200%");
1859-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-80 -55 160 110");
1867+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 500%");
1868+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-320 -220 640 440");
18601869
await page.evaluate(() => {
18611870
window.__objectVectorStudioV2App.zoomViewport(0);
18621871
});
1863-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 1%");
1872+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 10%");
18641873
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-16000 -11000 32000 22000");
18651874
await page.locator("#objectVectorStudioV2ResetViewButton").click();
1866-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
1875+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1600 -1100 3200 2200");
18671876
await page.locator("#objectVectorStudioV2RenderSurface").hover();
18681877
await page.mouse.wheel(0, -240);
1869-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 101%");
1878+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 110%");
18701879
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-grid-rendered='true']")).toHaveCount(1);
18711880
await expect(page.locator("#objectVectorStudioV2RenderSurface [data-center-origin='0,0']")).toHaveCount(1);
18721881
const zoomedGridState = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => ({
@@ -1876,13 +1885,13 @@ test.describe("Workspace Manager V2 bootstrap", () => {
18761885
}));
18771886
expect(zoomedGridState.backgroundImage).toBe("none");
18781887
expect(zoomedGridState.gridLineCount).toBeGreaterThan(0);
1879-
expect(zoomedGridState.viewBox).toBe("-158.416 -108.911 316.832 217.822");
1888+
expect(zoomedGridState.viewBox).toBe("-1454.545 -1000 2909.091 2000");
18801889
await page.mouse.wheel(0, 240);
18811890
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 100%");
18821891
await page.evaluate(() => {
18831892
window.__objectVectorStudioV2App.zoomViewport(0.25);
18841893
});
1885-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
1894+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
18861895
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
18871896
await page.locator("#objectVectorStudioV2ResetViewButton").click();
18881897

@@ -2140,11 +2149,11 @@ test.describe("Workspace Manager V2 bootstrap", () => {
21402149
name: "asteroids-ship-grid.object-vector.json"
21412150
});
21422151
await expect(page.locator("#statusLog")).toHaveValue(/OK Render mode svg-work-surface: rendered Asteroids Ship Grid Check with 1 visible shapes; capture mode none\./);
2143-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
2152+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1600 -1100 3200 2200");
21442153
await page.evaluate(() => {
21452154
window.__objectVectorStudioV2App.zoomViewport(0.25);
21462155
});
2147-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 25%");
2156+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toContainText("Zoom 250%");
21482157
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
21492158

21502159
const readPreviewScale = async () => page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
@@ -2224,10 +2233,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22242233

22252234
await page.locator("#objectVectorStudioV2PanRightButton").click();
22262235
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-620 -440 1280 880");
2227-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 25%");
2236+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 2, 0 | Canvas 0,0 centered | Zoom 250%");
22282237
await page.locator("#objectVectorStudioV2PanLeftButton").click();
22292238
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-640 -440 1280 880");
2230-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 25%");
2239+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Origin: 0, 0 | Canvas 0,0 centered | Zoom 250%");
22312240
const examplePointerScreen = await page.locator("#objectVectorStudioV2RenderSurface").evaluate((surface) => {
22322241
const point = surface.createSVGPoint();
22332242
point.x = -140;
@@ -2240,7 +2249,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22402249
clientX: examplePointerScreen.x,
22412250
clientY: examplePointerScreen.y
22422251
});
2243-
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 25%");
2252+
await expect(page.locator("#objectVectorStudioV2CoordinateDisplay")).toHaveText("Pointer -14, -16 | Canvas origin 0,0 centered | Zoom 250%");
22442253
await page.setViewportSize({ width: 1040, height: 720 });
22452254
const resizedPreviewScale = await readPreviewScale();
22462255
expect(resizedPreviewScale.aspectRatioStable).toBe(true);
@@ -2250,7 +2259,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
22502259
expect(resizedPreviewScale.gridStepRestored).toBe(true);
22512260
expect(resizedPreviewScale.pointsOnVisibleGridLines).toBe(true);
22522261
await page.locator("#objectVectorStudioV2ResetViewButton").click();
2253-
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-160 -110 320 220");
2262+
await expect(page.locator("#objectVectorStudioV2RenderSurface")).toHaveAttribute("viewBox", "-1600 -1100 3200 2200");
22542263

22552264
expect(pageErrors).toEqual([]);
22562265
expect(consoleErrors).toEqual([]);

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ const ANGLE_SNAP_SESSION_KEY = "object-vector-studio-v2.angleSnap";
99
const GRID_RENDER_SESSION_KEY = "object-vector-studio-v2.gridRender";
1010
const CENTER_ORIGIN_SESSION_KEY = "object-vector-studio-v2.centerOrigin";
1111
const SVG_NS = "http://www.w3.org/2000/svg";
12-
const DEFAULT_VIEWPORT = Object.freeze({ height: 220, width: 320, x: 0, y: 0, zoom: 1 });
12+
const DEFAULT_VIEWPORT = Object.freeze({ height: 220, width: 320, x: 0, y: 0, zoom: 0.1 });
1313
const GRID_STEP = 10;
1414
const OBJECT_PREVIEW_DRAWING_SCALE = GRID_STEP;
15-
const MAX_ZOOM = 2;
15+
const MAX_ZOOM = 0.5;
1616
const MIN_ZOOM = 0.01;
1717
const ZOOM_STEP = 0.01;
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 ${this.formatZoomPercentage()}%`;
663+
this.elements.coordinateDisplay.textContent = `Origin: 0, 0 | Canvas 0,0 centered | Zoom ${this.formatZoomPercentage() * 10}%`;
664664
this.elements.renderSurface.replaceChildren();
665665
this.renderSvgGrid();
666666
this.renderCenterOriginMarker();
@@ -1867,7 +1867,7 @@ export class ToolStarterApp {
18671867
const viewX = this.formatViewportNumber(this.viewport.x - width / 2);
18681868
const viewY = this.formatViewportNumber(this.viewport.y - height / 2);
18691869
this.elements.renderSurface.setAttribute("viewBox", `${viewX} ${viewY} ${this.formatViewportNumber(width)} ${this.formatViewportNumber(height)}`);
1870-
this.elements.coordinateDisplay.textContent = `Origin: ${this.formatLogicalCoordinate(this.viewport.x)}, ${this.formatLogicalCoordinate(this.viewport.y)} | Canvas 0,0 centered | Zoom ${this.formatZoomPercentage()}%`;
1870+
this.elements.coordinateDisplay.textContent = `Origin: ${this.formatLogicalCoordinate(this.viewport.x)}, ${this.formatLogicalCoordinate(this.viewport.y)} | Canvas 0,0 centered | Zoom ${this.formatZoomPercentage() * 10}%`;
18711871
}
18721872

18731873
formatViewportNumber(value) {
@@ -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 ${this.formatZoomPercentage()}%.`);
1903+
this.statusLog.write(`OK Viewport zoom set to ${this.formatZoomPercentage() * 10}%.`);
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 ${this.formatZoomPercentage()}% at origin 0,0.`);
1916+
this.statusLog.write(`OK Viewport reset to ${this.formatZoomPercentage() * 10}% at origin 0,0.`);
19171917
}
19181918

19191919
updateCoordinateDisplay(event) {
@@ -1925,7 +1925,7 @@ export class ToolStarterApp {
19251925
const viewHeight = DEFAULT_VIEWPORT.height / this.viewport.zoom;
19261926
const x = this.viewport.x - viewWidth / 2 + ((event.clientX - bounds.left) / bounds.width) * viewWidth;
19271927
const y = this.viewport.y - viewHeight / 2 + ((event.clientY - bounds.top) / bounds.height) * viewHeight;
1928-
this.elements.coordinateDisplay.textContent = `Pointer ${this.formatLogicalPointerCoordinate(x)}, ${this.formatLogicalPointerCoordinate(y)} | Canvas origin 0,0 centered | Zoom ${this.formatZoomPercentage()}%`;
1928+
this.elements.coordinateDisplay.textContent = `Pointer ${this.formatLogicalPointerCoordinate(x)}, ${this.formatLogicalPointerCoordinate(y)} | Canvas origin 0,0 centered | Zoom ${this.formatZoomPercentage() * 10}%`;
19291929
}
19301930

19311931
selectObject(objectId, sourceLabel) {

0 commit comments

Comments
 (0)