diff --git a/src/renderer/extensions/minimap/composables/useMinimapViewport.test.ts b/src/renderer/extensions/minimap/composables/useMinimapViewport.test.ts index 60437cc641..03a7fb0625 100644 --- a/src/renderer/extensions/minimap/composables/useMinimapViewport.test.ts +++ b/src/renderer/extensions/minimap/composables/useMinimapViewport.test.ts @@ -187,6 +187,46 @@ describe('useMinimapViewport', () => { expect(transform.height).toBeCloseTo(viewportHeight * 0.5) // 300 * 0.5 = 150 }) + it('should maintain strict reference equality for viewportTransform when canvas state is unchanged', () => { + vi.mocked(calculateNodeBounds).mockReturnValue({ + minX: 0, + minY: 0, + maxX: 500, + maxY: 400, + width: 500, + height: 400 + }) + + vi.mocked(enforceMinimumBounds).mockImplementation((bounds) => bounds) + vi.mocked(calculateMinimapScale).mockReturnValue(0.5) + + const canvasRef = ref(mockCanvas) as Ref + const graphRef = ref(mockGraph) as Ref + + const viewport = useMinimapViewport(canvasRef, graphRef, 250, 200) + + mockCanvas.ds.scale = 2 + mockCanvas.ds.offset = [-100, -50] + + viewport.updateBounds() + viewport.updateCanvasDimensions() + viewport.updateViewport() + + const initialTransform = viewport.viewportTransform.value + + viewport.updateViewport() + const transformAfterIdle = viewport.viewportTransform.value + + expect(transformAfterIdle).toBe(initialTransform) + + mockCanvas.ds.offset = [-150, -50] + viewport.updateViewport() + const transformAfterPan = viewport.viewportTransform.value + + expect(transformAfterPan).not.toBe(initialTransform) + expect(transformAfterPan.x).not.toBe(initialTransform.x) + }) + it('should center view on world coordinates', () => { const canvasRef = ref(mockCanvas) as Ref const graphRef = ref(mockGraph) as Ref diff --git a/src/renderer/extensions/minimap/composables/useMinimapViewport.ts b/src/renderer/extensions/minimap/composables/useMinimapViewport.ts index 0dd4d19df8..4aec08bdf6 100644 --- a/src/renderer/extensions/minimap/composables/useMinimapViewport.ts +++ b/src/renderer/extensions/minimap/composables/useMinimapViewport.ts @@ -90,12 +90,16 @@ export function useMinimapViewport( const centerOffsetX = (width - bounds.value.width * scale.value) / 2 const centerOffsetY = (height - bounds.value.height * scale.value) / 2 - viewportTransform.value = { - x: (worldX - bounds.value.minX) * scale.value + centerOffsetX, - y: (worldY - bounds.value.minY) * scale.value + centerOffsetY, - width: viewportWidth * scale.value, - height: viewportHeight * scale.value - } + const x = (worldX - bounds.value.minX) * scale.value + centerOffsetX + const y = (worldY - bounds.value.minY) * scale.value + centerOffsetY + const w = viewportWidth * scale.value + const h = viewportHeight * scale.value + + const curr = viewportTransform.value + if (curr.x === x && curr.y === y && curr.width === w && curr.height === h) + return + + viewportTransform.value = { x, y, width: w, height: h } } const updateBounds = () => {