| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |