import Quantizer from "../quantizer" import { ArrangePoint } from "../transform/ArrangePoint" export interface ArrangeSelection { fromTick: number fromTrackIndex: number toTick: number toTrackIndex: number } export function arrangeSelectionFromPoints( start: ArrangePoint, end: ArrangePoint, quantizer: Quantizer, maxTrackIndex: number, ): ArrangeSelection { const startSelection = selectionForPoint(start, quantizer) const endSelection = selectionForPoint(end, quantizer) return clampSelection( unionSelections(startSelection, endSelection), maxTrackIndex, ) } export const selectionForPoint = ( point: ArrangePoint, quantizer: Quantizer, ): ArrangeSelection => { const fromTick = quantizer.floor(point.tick) const toTick = quantizer.ceil(point.tick) return { fromTick, toTick, fromTrackIndex: Math.floor(point.trackIndex), toTrackIndex: Math.floor(point.trackIndex) + 1, } } export const unionSelections = ( a: ArrangeSelection, b: ArrangeSelection, ): ArrangeSelection => { return { fromTick: Math.min(a.fromTick, b.fromTick), toTick: Math.max(a.toTick, b.toTick), fromTrackIndex: Math.min(a.fromTrackIndex, b.fromTrackIndex), toTrackIndex: Math.max(a.toTrackIndex, b.toTrackIndex), } } export const clampSelection = ( selection: ArrangeSelection, maxTrackIndex: number, ): ArrangeSelection => ({ fromTick: Math.max(0, selection.fromTick), toTick: Math.max(0, selection.toTick), fromTrackIndex: Math.min( maxTrackIndex, Math.max(0, selection.fromTrackIndex), ), toTrackIndex: Math.min(maxTrackIndex, Math.max(0, selection.toTrackIndex)), }) export const movedSelection = ( selection: ArrangeSelection, delta: ArrangePoint, ): ArrangeSelection => ({ fromTick: selection.fromTick + delta.tick, toTick: selection.toTick + delta.tick, fromTrackIndex: selection.fromTrackIndex + delta.trackIndex, toTrackIndex: selection.toTrackIndex + delta.trackIndex, })