| 
									
										
										
										
											2022-06-03 01:33:41 +02:00
										 |  |  | import { InputElement } from "./InputElement" | 
					
						
							|  |  |  | import { UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class Slider extends InputElement<number> { | 
					
						
							|  |  |  |     private readonly _value: UIEventSource<number> | 
					
						
							| 
									
										
										
										
											2022-07-18 13:50:14 +02:00
										 |  |  |     private readonly min: number | 
					
						
							|  |  |  |     private readonly max: number | 
					
						
							|  |  |  |     private readonly step: number | 
					
						
							|  |  |  |     private readonly vertical: boolean | 
					
						
							| 
									
										
										
										
											2022-06-03 01:33:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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<number> | 
					
						
							| 
									
										
										
										
											2022-07-18 13:50:14 +02:00
										 |  |  |             step?: 1 | number | 
					
						
							|  |  |  |             vertical?: false | boolean | 
					
						
							| 
									
										
										
										
											2022-06-03 01:33:41 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |         super() | 
					
						
							|  |  |  |         this.max = max | 
					
						
							|  |  |  |         this.min = min | 
					
						
							|  |  |  |         this._value = options?.value ?? new UIEventSource<number>(min) | 
					
						
							|  |  |  |         this.step = options?.step ?? 1 | 
					
						
							| 
									
										
										
										
											2022-07-18 13:50:14 +02:00
										 |  |  |         this.vertical = options?.vertical ?? false | 
					
						
							| 
									
										
										
										
											2022-06-03 01:33:41 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     GetValue(): UIEventSource<number> { | 
					
						
							|  |  |  |         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)) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-07-18 13:50:14 +02:00
										 |  |  |         if (this.vertical) { | 
					
						
							|  |  |  |             el.classList.add("vertical") | 
					
						
							|  |  |  |             el.setAttribute("orient", "vertical") // firefox only workaround...
 | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-06-03 01:33:41 +02:00
										 |  |  |         valuestore.addCallbackAndRunD((v) => (el.value = "" + valuestore.data)) | 
					
						
							|  |  |  |         return el | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     IsValid(t: number): boolean { | 
					
						
							|  |  |  |         return Math.round(t) == t && t >= this.min && t <= this.max | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |