forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			68 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { Store, UIEventSource } from "../UIEventSource"; | ||
|  | import { RasterLayerPolygon } from "../../Models/RasterLayers"; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Selects the appropriate raster layer as background for the given query parameter, theme setting, user preference or default value. | ||
|  |  * | ||
|  |  * It the requested layer is not available, a layer of the same type will be selected. | ||
|  |  */ | ||
|  | export class PreferredRasterLayerSelector { | ||
|  |     private readonly _rasterLayerSetting: UIEventSource<RasterLayerPolygon>; | ||
|  |     private readonly _availableLayers: Store<RasterLayerPolygon[]>; | ||
|  |     private readonly _preferredBackgroundLayer: UIEventSource<string | "photo" | "map" | "osmbasedmap" | undefined>; | ||
|  |     private readonly _queryParameter: UIEventSource<string>; | ||
|  | 
 | ||
|  |     constructor(rasterLayerSetting: UIEventSource<RasterLayerPolygon>, availableLayers: Store<RasterLayerPolygon[]>, queryParameter: UIEventSource<string>, preferredBackgroundLayer: UIEventSource<string | "photo" | "map" | "osmbasedmap" | undefined>) { | ||
|  |         this._rasterLayerSetting = rasterLayerSetting; | ||
|  |         this._availableLayers = availableLayers; | ||
|  |         this._queryParameter = queryParameter; | ||
|  |         this._preferredBackgroundLayer = preferredBackgroundLayer; | ||
|  |         const self = this; | ||
|  | 
 | ||
|  |         this._rasterLayerSetting.addCallbackD(layer => { | ||
|  |             if (layer.properties.id !== this._queryParameter.data) { | ||
|  |                 this._queryParameter.setData(undefined); | ||
|  |                 return true; | ||
|  |             } | ||
|  |         }); | ||
|  | 
 | ||
|  | 
 | ||
|  |         this._queryParameter.addCallbackAndRunD(_ => { | ||
|  |             const isApplied = self.updateLayer(); | ||
|  |             if (!isApplied) { | ||
|  |                 // A different layer was set as background
 | ||
|  |                 // We remove this queryParameter instead
 | ||
|  |                 self._queryParameter.setData(undefined); | ||
|  |                 return true; // Unregister
 | ||
|  |             } | ||
|  |         }); | ||
|  | 
 | ||
|  |         this._preferredBackgroundLayer.addCallbackD(_ => self.updateLayer()); | ||
|  | 
 | ||
|  |         this._availableLayers.addCallbackD(_ => self.updateLayer()); | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns 'true' if the target layer is set or is the current layer | ||
|  |      * @private | ||
|  |      */ | ||
|  |     private updateLayer() { | ||
|  | 
 | ||
|  |         // What is the ID of the layer we have to (try to) load?
 | ||
|  |         const targetLayerId = this._queryParameter.data ?? this._preferredBackgroundLayer.data; | ||
|  |         const available = this._availableLayers.data; | ||
|  |         const isCategory = targetLayerId === "photo" || targetLayerId === "osmbasedmap" || targetLayerId === "map" | ||
|  |         const foundLayer = isCategory ? available.find(l => l.properties.category === targetLayerId) : available.find(l => l.properties.id === targetLayerId); | ||
|  |         if (foundLayer) { | ||
|  |             this._rasterLayerSetting.setData(foundLayer); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         // The current layer is not in view
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | } |