forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			No EOL
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			No EOL
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {UIEventSource} from "../UIEventSource";
 | |
| import BaseLayer from "../../Models/BaseLayer";
 | |
| import AvailableBaseLayers from "./AvailableBaseLayers";
 | |
| import Loc from "../../Models/Loc";
 | |
| import {Utils} from "../../Utils";
 | |
| 
 | |
| /**
 | |
|  * Sets the current background layer to a layer that is actually available
 | |
|  */
 | |
| export default class BackgroundLayerResetter {
 | |
| 
 | |
|     constructor(currentBackgroundLayer: UIEventSource<BaseLayer>,
 | |
|                 location: UIEventSource<Loc>,
 | |
|                 availableLayers: UIEventSource<BaseLayer[]>,
 | |
|                 defaultLayerId: string = undefined) {
 | |
| 
 | |
|         if (Utils.runningFromConsole) {
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         defaultLayerId = defaultLayerId ?? AvailableBaseLayers.osmCarto.id;
 | |
| 
 | |
|         // Change the baselayer back to OSM if we go out of the current range of the layer
 | |
|         availableLayers.addCallbackAndRun(availableLayers => {
 | |
|             let defaultLayer = undefined;
 | |
|             const currentLayer = currentBackgroundLayer.data.id;
 | |
|             for (const availableLayer of availableLayers) {
 | |
|                 if (availableLayer.id === currentLayer) {
 | |
| 
 | |
|                     if (availableLayer.max_zoom < location.data.zoom) {
 | |
|                         break;
 | |
|                     }
 | |
| 
 | |
|                     if (availableLayer.min_zoom > location.data.zoom) {
 | |
|                         break;
 | |
|                     }
 | |
|                     if (availableLayer.id === defaultLayerId) {
 | |
|                         defaultLayer = availableLayer;
 | |
|                     }
 | |
|                     return; // All good - the current layer still works!
 | |
|                 }
 | |
|             }
 | |
|             // Oops, we panned out of range for this layer!
 | |
|             console.log("AvailableBaseLayers-actor: detected that the current bounds aren't sufficient anymore - reverting to OSM standard")
 | |
|             currentBackgroundLayer.setData(defaultLayer ?? AvailableBaseLayers.osmCarto);
 | |
|         });
 | |
| 
 | |
|     }
 | |
| 
 | |
| } |