tldraw/lib/code/control.ts
2021-05-17 11:01:11 +01:00

57 lines
1.4 KiB
TypeScript

import {
CodeControl,
ControlType,
NumberCodeControl,
VectorCodeControl,
} from "types"
import { v4 as uuid } from "uuid"
import Vector from "./vector"
export const controls: Record<string, any> = {}
export const codeControls = new Set<CodeControl>([])
export class Control<T extends CodeControl> {
control: T
constructor(control: Omit<T, "id">) {
this.control = { ...control, id: uuid() } as T
codeControls.add(this.control)
// Could there be a better way to prevent this?
// When updating, constructor should just bind to
// the existing control rather than creating a new one?
if (!(window as any).isUpdatingCode) {
controls[this.control.label] = this.control.value
}
}
destroy() {
codeControls.delete(this.control)
delete controls[this.control.label]
}
}
export class NumberControl extends Control<NumberCodeControl> {
constructor(options: Omit<NumberCodeControl, "id" | "type">) {
const { value = 0, step = 1 } = options
super({
type: ControlType.Number,
...options,
value,
step,
})
}
}
export class VectorControl extends Control<VectorCodeControl> {
constructor(options: Omit<VectorCodeControl, "id" | "type">) {
const { value = [0, 0], isNormalized = false } = options
super({
type: ControlType.Vector,
...options,
value,
isNormalized,
})
}
}