forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|     import type {RasterLayerPolygon} from "../../Models/RasterLayers";
 | |
|     import OverlayMap from "./OverlayMap.svelte";
 | |
|     import type {MapProperties} from "../../Models/MapProperties";
 | |
|     import {Store, UIEventSource} from "../../Logic/UIEventSource";
 | |
|     import {Map as MlMap} from "maplibre-gl"
 | |
|     import {createEventDispatcher, onDestroy} from "svelte";
 | |
| 
 | |
|     /***
 | |
|      * Chooses a background-layer out of available options
 | |
|      */
 | |
|     export let availableLayers: Store<RasterLayerPolygon[]>
 | |
|     export let mapproperties: MapProperties
 | |
|     export let map: Store<MlMap>
 | |
| 
 | |
|     export let visible: Store<boolean> = undefined
 | |
|     
 | |
|     let dispatch = createEventDispatcher<{appliedLayer}>()
 | |
|     
 | |
|     export let favourite : UIEventSource<string> | undefined = undefined
 | |
|     
 | |
| 
 | |
|     let rasterLayer = new UIEventSource<RasterLayerPolygon>(availableLayers.data?.[0])
 | |
|     let hasLayers = true
 | |
|     onDestroy(availableLayers.addCallbackAndRun(layers => {
 | |
|         if (layers === undefined || layers.length === 0) {
 | |
|             hasLayers = false
 | |
|             return
 | |
|         }
 | |
|         hasLayers = true
 | |
|         rasterLayer.setData(layers[0])
 | |
|     }))
 | |
|     
 | |
|     if(favourite){
 | |
|         onDestroy(favourite.addCallbackAndRunD(favourite => {
 | |
|             const fav = availableLayers.data?.find(l => l.properties.id === favourite)
 | |
|             if(!fav){
 | |
|                 return
 | |
|             }
 | |
|             rasterLayer.setData(fav)
 | |
|         }))
 | |
|     
 | |
|         onDestroy(rasterLayer.addCallbackAndRunD(selected => {
 | |
|             favourite?.setData(selected.properties.id)
 | |
|         }))
 | |
|     }
 | |
| 
 | |
|     let rasterLayerOnMap = UIEventSource.feedFrom(rasterLayer)
 | |
|     
 | |
|     if (visible) {
 | |
|         onDestroy(visible?.addCallbackAndRunD(visible => {
 | |
|             if (visible) {
 | |
|                 rasterLayerOnMap.setData(rasterLayer.data ?? availableLayers.data[0])
 | |
|             } else {
 | |
|                 rasterLayerOnMap.setData(undefined)
 | |
|             }
 | |
|         }))
 | |
|     }
 | |
| </script>
 | |
| 
 | |
| {#if hasLayers}
 | |
|     <div class="h-full w-full flex flex-col">
 | |
|         <button on:click={() => {mapproperties.rasterLayer.setData(rasterLayer.data);
 | |
|             dispatch("appliedLayer")
 | |
|         }} class="w-full h-full m-0 p-0">
 | |
|             <OverlayMap rasterLayer={rasterLayerOnMap} placedOverMap={map} placedOverMapProperties={mapproperties}
 | |
|                         {visible}/>
 | |
|         </button>
 | |
|         <select bind:value={$rasterLayer} class="w-full">
 | |
|             {#each $availableLayers as availableLayer }
 | |
|                 <option value={availableLayer}>
 | |
|                     {availableLayer.properties.name}
 | |
|                 </option>
 | |
|             {/each}
 | |
|         </select>
 | |
|     </div>
 | |
| {/if}
 |