88 lines
3.1 KiB
Svelte
88 lines
3.1 KiB
Svelte
<script lang="ts">
|
|
import { Store, UIEventSource } from "../../Logic/UIEventSource"
|
|
import type { RasterLayerPolygon } from "../../Models/RasterLayers"
|
|
import { AvailableRasterLayers } from "../../Models/RasterLayers"
|
|
import { createEventDispatcher, onDestroy } from "svelte"
|
|
import Svg from "../../Svg"
|
|
import { Map as MlMap } from "maplibre-gl"
|
|
import type { MapProperties } from "../../Models/MapProperties"
|
|
import OverlayMap from "../Map/OverlayMap.svelte"
|
|
import RasterLayerPicker from "../Map/RasterLayerPicker.svelte"
|
|
|
|
export let mapproperties: MapProperties
|
|
export let normalMap: UIEventSource<MlMap>
|
|
/**
|
|
* The current background (raster) layer of the polygon.
|
|
* This is undefined if a vector layer is used
|
|
*/
|
|
let rasterLayer: UIEventSource<RasterLayerPolygon | undefined> = mapproperties.rasterLayer
|
|
let name = rasterLayer.data?.properties?.name
|
|
let icon = Svg.satellite_svg()
|
|
onDestroy(
|
|
rasterLayer.addCallback((polygon) => {
|
|
name = polygon.properties?.name
|
|
})
|
|
)
|
|
/**
|
|
* The layers that this component can offer as a choice.
|
|
*/
|
|
export let availableRasterLayers: Store<RasterLayerPolygon[]>
|
|
|
|
let raster0 = new UIEventSource<RasterLayerPolygon>(undefined)
|
|
|
|
let raster1 = new UIEventSource<RasterLayerPolygon>(undefined)
|
|
|
|
let currentLayer: RasterLayerPolygon
|
|
|
|
function updatedAltLayer() {
|
|
const available = availableRasterLayers.data
|
|
const current = rasterLayer.data
|
|
const defaultLayer = AvailableRasterLayers.maplibre
|
|
const firstOther = available.find((l) => l !== defaultLayer)
|
|
const secondOther = available.find((l) => l !== defaultLayer && l !== firstOther)
|
|
raster0.setData(firstOther === current ? defaultLayer : firstOther)
|
|
raster1.setData(secondOther === current ? defaultLayer : secondOther)
|
|
}
|
|
|
|
updatedAltLayer()
|
|
onDestroy(mapproperties.rasterLayer.addCallbackAndRunD(updatedAltLayer))
|
|
onDestroy(availableRasterLayers.addCallbackAndRunD(updatedAltLayer))
|
|
|
|
function use(rasterLayer: UIEventSource<RasterLayerPolygon>): () => void {
|
|
return () => {
|
|
currentLayer = undefined
|
|
mapproperties.rasterLayer.setData(rasterLayer.data)
|
|
}
|
|
}
|
|
|
|
const dispatch = createEventDispatcher<{ copyright_clicked }>()
|
|
</script>
|
|
|
|
<div class="flex items-end opacity-50 hover:opacity-100">
|
|
<div class="flex flex-col md:flex-row">
|
|
<button class="m-0 h-12 w-16 overflow-hidden p-0 md:h-16 md:w-16" on:click={use(raster0)}>
|
|
<OverlayMap
|
|
placedOverMap={normalMap}
|
|
placedOverMapProperties={mapproperties}
|
|
rasterLayer={raster0}
|
|
/>
|
|
</button>
|
|
<button class="m-0 h-12 w-16 overflow-hidden p-0 md:h-16 md:w-16" on:click={use(raster1)}>
|
|
<OverlayMap
|
|
placedOverMap={normalMap}
|
|
placedOverMapProperties={mapproperties}
|
|
rasterLayer={raster1}
|
|
/>
|
|
</button>
|
|
</div>
|
|
<div class="ml-1 flex h-fit flex-col gap-y-1 text-sm">
|
|
<div class="low-interaction w-64 rounded p-1">
|
|
<RasterLayerPicker
|
|
availableLayers={availableRasterLayers}
|
|
value={mapproperties.rasterLayer}
|
|
/>
|
|
</div>
|
|
|
|
<button class="small" on:click={() => dispatch("copyright_clicked")}>© OpenStreetMap</button>
|
|
</div>
|
|
</div>
|