File size: 1,677 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
import cloneDeep from "lodash/cloneDeep"
import { MaxNoteNumber } from "../../main/Constants"
import { IRect } from "../geometry"
import { NoteCoordTransform } from "../transform"
import { clampNotePoint, NotePoint } from "../transform/NotePoint"

export interface Selection {
  from: NotePoint
  to: NotePoint
}

export const getSelectionBounds = (
  selection: Selection,
  transform: NoteCoordTransform,
): IRect => {
  const left = transform.getX(selection.from.tick)
  const right = transform.getX(selection.to.tick)
  const top = transform.getY(selection.from.noteNumber)
  const bottom = transform.getY(selection.to.noteNumber)
  return {
    x: left,
    y: top,
    width: right - left,
    height: bottom - top,
  }
}

export const movedSelection = (
  selection: Selection,
  dt: number,
  dn: number,
): Selection => {
  const s = cloneDeep(selection)

  s.from.tick += dt
  s.to.tick += dt
  s.from.noteNumber += dn
  s.to.noteNumber += dn

  return s
}

// to γŒε³δΈ‹γ«γͺγ‚‹γ‚ˆγ†γ«γ™γ‚‹
// to Make the lower right

export const regularizedSelection = (
  fromTick: number,
  fromNoteNumber: number,
  toTick: number,
  toNoteNumber: number,
): Selection => ({
  from: {
    tick: Math.max(0, Math.min(fromTick, toTick)),
    noteNumber: Math.min(
      MaxNoteNumber,
      Math.max(0, Math.max(fromNoteNumber, toNoteNumber)),
    ),
  },
  to: {
    tick: Math.max(fromTick, toTick),
    noteNumber: Math.min(
      MaxNoteNumber,
      Math.max(0, Math.min(fromNoteNumber, toNoteNumber)),
    ),
  },
})

export const clampSelection = (selection: Selection): Selection => ({
  from: clampNotePoint(selection.from),
  to: clampNotePoint(selection.to),
})