Skip to content

Commit 447490a

Browse files
author
Alexander
committed
Measurement and Snapping Managers. Правим расхождения при отображении расстояний до объектов.
1 parent 508d2fc commit 447490a

File tree

3 files changed

+75
-23
lines changed

3 files changed

+75
-23
lines changed

src/editor/measurement-manager/index.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ import {
1212
shouldIgnoreObject
1313
} from '../utils/object-filter'
1414
import { drawGuideLabel } from '../utils/render-utils'
15-
import { resolveDisplayDistance } from '../utils/distance'
15+
import {
16+
MAX_DISPLAY_DISTANCE_DIFF,
17+
resolveCommonDisplayDistance,
18+
resolveDisplayDistance
19+
} from '../utils/distance'
1620
import {
1721
MEASUREMENT_COLOR,
1822
MEASUREMENT_LINE_WIDTH
@@ -491,21 +495,23 @@ export default class MeasurementManager {
491495
currentGap: number
492496
oppositeGaps: Array<number | null>
493497
}): number | null {
494-
const currentDisplay = resolveDisplayDistance({ distance: currentGap })
495498
let bestCommonDistance: number | null = null
496499
let bestDiff = Number.POSITIVE_INFINITY
497500

498501
for (const oppositeGap of oppositeGaps) {
499502
if (oppositeGap === null) continue
500503

501-
const oppositeDisplay = resolveDisplayDistance({ distance: oppositeGap })
502-
const displayDiff = Math.abs(currentDisplay - oppositeDisplay)
503-
if (displayDiff > 1 || displayDiff >= bestDiff) continue
504-
505-
bestDiff = displayDiff
506-
bestCommonDistance = resolveDisplayDistance({
507-
distance: (currentGap + oppositeGap) / 2
504+
const {
505+
displayDistanceDiff,
506+
commonDisplayDistance
507+
} = resolveCommonDisplayDistance({
508+
firstDistance: currentGap,
509+
secondDistance: oppositeGap
508510
})
511+
if (displayDistanceDiff > MAX_DISPLAY_DISTANCE_DIFF || displayDistanceDiff >= bestDiff) continue
512+
513+
bestDiff = displayDistanceDiff
514+
bestCommonDistance = commonDisplayDistance
509515
}
510516

511517
return bestCommonDistance
@@ -610,7 +616,7 @@ export default class MeasurementManager {
610616
const overlapStart = Math.max(a.top ?? 0, b.top ?? 0)
611617
const overlapEnd = Math.min(a.bottom ?? 0, b.bottom ?? 0)
612618

613-
return overlapEnd >= overlapStart
619+
return overlapEnd > overlapStart
614620
}
615621

616622
/**
@@ -626,7 +632,7 @@ export default class MeasurementManager {
626632
const overlapStart = Math.max(a.left ?? 0, b.left ?? 0)
627633
const overlapEnd = Math.min(a.right ?? 0, b.right ?? 0)
628634

629-
return overlapEnd >= overlapStart
635+
return overlapEnd > overlapStart
630636
}
631637

632638
/**

src/editor/snapping-manager/calculations.ts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { MOVE_SNAP_STEP } from './constants'
2-
import { resolveDisplayDistance } from '../utils/distance'
2+
import {
3+
MAX_DISPLAY_DISTANCE_DIFF,
4+
resolveCommonDisplayDistance
5+
} from '../utils/distance'
36
import type {
47
AnchorBuckets,
58
Bounds,
@@ -316,12 +319,14 @@ const resolveCenteredEqualSpacing = ({
316319
const gapBefore = adjustedStart - beforeEdge
317320
const gapAfter = afterEdge - adjustedEnd
318321

319-
const beforeDistance = resolveDisplayDistance({ distance: gapBefore })
320-
const afterDistance = resolveDisplayDistance({ distance: gapAfter })
321-
const distanceDiff = Math.abs(beforeDistance - afterDistance)
322-
if (distanceDiff > 1) continue
323-
324-
const commonDistance = Math.max(beforeDistance, afterDistance)
322+
const {
323+
displayDistanceDiff: distanceDiff,
324+
commonDisplayDistance: commonDistance
325+
} = resolveCommonDisplayDistance({
326+
firstDistance: gapBefore,
327+
secondDistance: gapAfter
328+
})
329+
if (distanceDiff > MAX_DISPLAY_DISTANCE_DIFF) continue
325330

326331
const nearestDiff = Math.max(
327332
Math.abs(gapBefore - targetGap),
@@ -357,13 +362,18 @@ const resolveGuideDisplayDistance = ({
357362
currentGap: number
358363
referenceGap: number
359364
}): number => {
360-
const currentDisplay = resolveDisplayDistance({ distance: currentGap })
361-
const referenceDisplay = resolveDisplayDistance({ distance: referenceGap })
362-
const displayDiff = Math.abs(currentDisplay - referenceDisplay)
365+
const {
366+
secondDisplayDistance: referenceDisplay,
367+
displayDistanceDiff,
368+
commonDisplayDistance
369+
} = resolveCommonDisplayDistance({
370+
firstDistance: currentGap,
371+
secondDistance: referenceGap
372+
})
363373

364-
if (displayDiff > 1) return referenceDisplay
374+
if (displayDistanceDiff > MAX_DISPLAY_DISTANCE_DIFF) return referenceDisplay
365375

366-
return Math.max(currentDisplay, referenceDisplay)
376+
return commonDisplayDistance
367377
}
368378

369379
/**

src/editor/utils/distance.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,39 @@ export const resolveDisplayDistance = ({
1313

1414
return Math.floor(normalizedDistance + epsilon)
1515
}
16+
17+
/**
18+
* Максимально допустимая разница между display-расстояниями,
19+
* при которой их можно считать эквивалентными для UI.
20+
*/
21+
export const MAX_DISPLAY_DISTANCE_DIFF = 1
22+
23+
export type CommonDisplayDistance = {
24+
firstDisplayDistance: number
25+
secondDisplayDistance: number
26+
displayDistanceDiff: number
27+
commonDisplayDistance: number
28+
}
29+
30+
/**
31+
* Сравнивает два расстояния в display-пикселях и возвращает общее значение для интерфейса.
32+
*/
33+
export const resolveCommonDisplayDistance = ({
34+
firstDistance,
35+
secondDistance
36+
}: {
37+
firstDistance: number
38+
secondDistance: number
39+
}): CommonDisplayDistance => {
40+
const firstDisplayDistance = resolveDisplayDistance({ distance: firstDistance })
41+
const secondDisplayDistance = resolveDisplayDistance({ distance: secondDistance })
42+
const displayDistanceDiff = Math.abs(firstDisplayDistance - secondDisplayDistance)
43+
const commonDisplayDistance = Math.max(firstDisplayDistance, secondDisplayDistance)
44+
45+
return {
46+
firstDisplayDistance,
47+
secondDisplayDistance,
48+
displayDistanceDiff,
49+
commonDisplayDistance
50+
}
51+
}

0 commit comments

Comments
 (0)