fix: preserve annotations while resizing selection
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
|
||||
import { preserveAnnotationScreenPositions } from '../src/utils/annotationGeometry.ts'
|
||||
|
||||
test('keeps annotation points at the same screen position when the origin moves', () => {
|
||||
const annotations = [
|
||||
{ points: [{ x: 30, y: 40 }, { x: 80, y: 90 }] },
|
||||
{ points: [{ x: 12, y: 18 }] },
|
||||
]
|
||||
|
||||
preserveAnnotationScreenPositions(
|
||||
annotations,
|
||||
{ x: 100, y: 200 },
|
||||
{ x: 125, y: 230 }
|
||||
)
|
||||
|
||||
assert.deepEqual(annotations, [
|
||||
{ points: [{ x: 5, y: 10 }, { x: 55, y: 60 }] },
|
||||
{ points: [{ x: -13, y: -12 }] },
|
||||
])
|
||||
assert.deepEqual(
|
||||
annotations[0].points.map((point) => ({
|
||||
x: 125 + point.x,
|
||||
y: 230 + point.y,
|
||||
})),
|
||||
[{ x: 130, y: 240 }, { x: 180, y: 290 }]
|
||||
)
|
||||
})
|
||||
|
||||
test('does not move annotations when only the right or bottom edge changes', () => {
|
||||
const annotations = [{ points: [{ x: 30, y: 40 }] }]
|
||||
|
||||
preserveAnnotationScreenPositions(
|
||||
annotations,
|
||||
{ x: 100, y: 200 },
|
||||
{ x: 100, y: 200 }
|
||||
)
|
||||
|
||||
assert.deepEqual(annotations, [{ points: [{ x: 30, y: 40 }] }])
|
||||
})
|
||||
|
||||
test('preserves screen positions across repeated drags and an edge crossover', () => {
|
||||
const annotations = [{ points: [{ x: 50, y: 60 }] }]
|
||||
|
||||
preserveAnnotationScreenPositions(
|
||||
annotations,
|
||||
{ x: 100, y: 100 },
|
||||
{ x: 140, y: 130 }
|
||||
)
|
||||
preserveAnnotationScreenPositions(
|
||||
annotations,
|
||||
{ x: 140, y: 130 },
|
||||
{ x: 300, y: 150 }
|
||||
)
|
||||
|
||||
assert.deepEqual(annotations, [{ points: [{ x: -150, y: 10 }] }])
|
||||
assert.deepEqual(
|
||||
{
|
||||
x: 300 + annotations[0].points[0].x,
|
||||
y: 150 + annotations[0].points[0].y,
|
||||
},
|
||||
{ x: 150, y: 160 }
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user