import { PositionAndSizeProperty } from "../types" function offsetSize(x: number, y: number, width: number, height: number) { return (old: PositionAndSizeProperty) => { const result: PositionAndSizeProperty = { ...old } result.x += x result.y += y result.width += width result.height += height return result } } const arrayKeys = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"] as const type ArrayKey = (typeof arrayKeys)[number] function checkArrayKey(key: string): key is ArrayKey { return (arrayKeys as unknown as string[]).indexOf(key) > -1 } function getOptionType(ev: KeyboardEvent) { if (!ev.ctrlKey) { return "move" } if (ev.altKey) { return ev.shiftKey ? "shrinkBoth" : "shrink" } else { return ev.shiftKey ? "growBoth" : "grow" } } type DictItem = [ArrayKey, ReturnType, number, number, number, number] const dict: DictItem[] = [ ["ArrowLeft", "move", -1, 0, 0, 0], ["ArrowLeft", "grow", -1, 0, 1, 0], ["ArrowLeft", "growBoth", -1, 0, 2, 0], ["ArrowLeft", "shrink", 0, 0, -1, 0], ["ArrowLeft", "shrinkBoth", 1, 0, -2, 0], ["ArrowRight", "move", 1, 0, 0, 0], ["ArrowRight", "grow", 0, 0, 1, 0], ["ArrowRight", "growBoth", -1, 0, 2, 0], ["ArrowRight", "shrink", 1, 0, -1, 0], ["ArrowRight", "shrinkBoth", 1, 0, -2, 0], ["ArrowUp", "move", 0, -1, 0, 0], ["ArrowUp", "grow", 0, -1, 0, 1], ["ArrowUp", "growBoth", 0, -1, 0, 2], ["ArrowUp", "shrink", 0, 0, 0, -1], ["ArrowUp", "shrinkBoth", 0, 1, 0, -2], ["ArrowDown", "move", 0, 1, 0, 0], ["ArrowDown", "grow", 0, 0, 0, 1], ["ArrowDown", "growBoth", 0, -1, 0, 2], ["ArrowDown", "shrink", 0, 1, 0, -1], ["ArrowDown", "shrinkBoth", 0, 1, 0, -2], ] export function moveAction(ev: KeyboardEvent) { const key = ev.key if (!checkArrayKey(key)) return undefined const opType = getOptionType(ev) const item = dict.find(i => i[0] === key && i[1] === opType)! return offsetSize(item[2], item[3], item[4], item[5]) }