diff options
Diffstat (limited to 'apps/web/src/timeline/placement/overlap.ts')
| -rw-r--r-- | apps/web/src/timeline/placement/overlap.ts | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/apps/web/src/timeline/placement/overlap.ts b/apps/web/src/timeline/placement/overlap.ts new file mode 100644 index 00000000..daf3e627 --- /dev/null +++ b/apps/web/src/timeline/placement/overlap.ts @@ -0,0 +1,44 @@ +import type { TimelineElement } from "@/timeline"; +import type { PlacementTimeSpan } from "./types"; + +interface TrackWithElements { + elements: TimelineElement[]; +} + +function wouldElementOverlap({ + elements, + startTime, + endTime, + excludeElementId, +}: { + elements: TimelineElement[]; + startTime: number; + endTime: number; + excludeElementId?: string; +}): boolean { + return elements.some((element) => { + if (excludeElementId && element.id === excludeElementId) { + return false; + } + + const elementEnd = element.startTime + element.duration; + return startTime < elementEnd && endTime > element.startTime; + }); +} + +export function canPlaceTimeSpansOnTrack({ + track, + timeSpans, +}: { + track: TrackWithElements; + timeSpans: PlacementTimeSpan[]; +}): boolean { + return timeSpans.every(({ startTime, duration, excludeElementId }) => { + return !wouldElementOverlap({ + elements: track.elements, + startTime, + endTime: startTime + duration, + excludeElementId, + }); + }); +} |
