import { InputElement } from "./InputElement" import { UIEventSource } from "../../Logic/UIEventSource" export default class Slider extends InputElement { private readonly _value: UIEventSource private readonly min: number private readonly max: number private readonly step: number private readonly vertical: boolean /** * Constructs a slider input element for natural numbers * @param min: the minimum value that is allowed, inclusive * @param max: the max value that is allowed, inclusive * @param options: value: injectable value; step: the step size of the slider */ constructor( min: number, max: number, options?: { value?: UIEventSource step?: 1 | number vertical?: false | boolean } ) { super() this.max = max this.min = min this._value = options?.value ?? new UIEventSource(min) this.step = options?.step ?? 1 this.vertical = options?.vertical ?? false } GetValue(): UIEventSource { return this._value } protected InnerConstructElement(): HTMLElement { const el = document.createElement("input") el.type = "range" el.min = "" + this.min el.max = "" + this.max el.step = "" + this.step const valuestore = this._value el.oninput = () => { valuestore.setData(Number(el.value)) } if (this.vertical) { el.classList.add("vertical") el.setAttribute("orient", "vertical") // firefox only workaround... } valuestore.addCallbackAndRunD((v) => (el.value = "" + valuestore.data)) return el } IsValid(t: number): boolean { return Math.round(t) == t && t >= this.min && t <= this.max } }