File size: 1,979 Bytes
f23825d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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,
})