Spaces:
Running
Running
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), | |
}) | |