| 
									
										
										
										
											2023-04-21 01:53:24 +02:00
										 |  |  | import { Store, UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | import { Map as MlMap } from "maplibre-gl" | 
					
						
							|  |  |  | import { Utils } from "../../Utils" | 
					
						
							|  |  |  | import { MapLibreAdaptor } from "./MapLibreAdaptor" | 
					
						
							| 
									
										
										
										
											2023-04-21 16:19:36 +02:00
										 |  |  | import { RasterLayerProperties } from "../../Models/RasterLayerProperties" | 
					
						
							| 
									
										
										
										
											2023-04-21 01:53:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class ShowOverlayRasterLayer { | 
					
						
							|  |  |  |     private readonly _map: UIEventSource<MlMap> | 
					
						
							|  |  |  |     private readonly _layer: RasterLayerProperties | 
					
						
							|  |  |  |     private readonly _mapProperties?: { zoom: Store<number> } | 
					
						
							|  |  |  |     private _mllayer | 
					
						
							|  |  |  |     private readonly _isDisplayed?: Store<boolean> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor( | 
					
						
							|  |  |  |         layer: RasterLayerProperties, | 
					
						
							|  |  |  |         map: UIEventSource<MlMap>, | 
					
						
							|  |  |  |         mapProperties?: { zoom: Store<number> }, | 
					
						
							|  |  |  |         options?: { | 
					
						
							|  |  |  |             isDisplayed?: Store<boolean> | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |         this._mapProperties = mapProperties | 
					
						
							|  |  |  |         this._layer = layer | 
					
						
							|  |  |  |         this._map = map | 
					
						
							|  |  |  |         this._isDisplayed = options?.isDisplayed | 
					
						
							|  |  |  |         const self = this | 
					
						
							|  |  |  |         map.addCallbackAndRunD((map) => { | 
					
						
							|  |  |  |             self.addLayer() | 
					
						
							|  |  |  |             map.on("load", () => { | 
					
						
							|  |  |  |                 self.addLayer() | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         this.addLayer() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         options?.isDisplayed?.addCallbackAndRun(() => { | 
					
						
							|  |  |  |             self.setVisibility() | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mapProperties?.zoom?.addCallbackAndRun(() => { | 
					
						
							|  |  |  |             self.setVisibility() | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private setVisibility() { | 
					
						
							|  |  |  |         let zoom = this._mapProperties?.zoom?.data | 
					
						
							|  |  |  |         let withinRange = zoom === undefined || zoom > this._layer.min_zoom | 
					
						
							|  |  |  |         let isDisplayed = (this._isDisplayed?.data ?? true) && withinRange | 
					
						
							|  |  |  |         this._map.data?.setLayoutProperty( | 
					
						
							|  |  |  |             this._layer.id, | 
					
						
							|  |  |  |             "visibility", | 
					
						
							|  |  |  |             isDisplayed ? "visible" : "none" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private async awaitStyleIsLoaded(): Promise<void> { | 
					
						
							|  |  |  |         const map = this._map.data | 
					
						
							|  |  |  |         if (map === undefined) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         while (!map?.isStyleLoaded()) { | 
					
						
							|  |  |  |             await Utils.waitFor(250) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private async addLayer() { | 
					
						
							|  |  |  |         const map = this._map.data | 
					
						
							|  |  |  |         console.log("Attempting to add ", this._layer.id) | 
					
						
							|  |  |  |         if (map === undefined) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         await this.awaitStyleIsLoaded() | 
					
						
							|  |  |  |         if (this._mllayer) { | 
					
						
							|  |  |  |             // Already initialized
 | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const background: RasterLayerProperties = this._layer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         map.addSource(background.id, MapLibreAdaptor.prepareWmsSource(background)) | 
					
						
							|  |  |  |         this._mllayer = map.addLayer({ | 
					
						
							|  |  |  |             id: background.id, | 
					
						
							|  |  |  |             type: "raster", | 
					
						
							|  |  |  |             source: background.id, | 
					
						
							|  |  |  |             paint: {}, | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         map.setLayoutProperty( | 
					
						
							|  |  |  |             this._layer.id, | 
					
						
							|  |  |  |             "visibility", | 
					
						
							|  |  |  |             this._isDisplayed?.data ?? true ? "visible" : "none" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         this.setVisibility() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |