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