diff --git a/website/src/lib/assets/layers.ts b/website/src/lib/assets/layers.ts index ffc6f2bc..fd8db6f9 100644 --- a/website/src/lib/assets/layers.ts +++ b/website/src/lib/assets/layers.ts @@ -438,7 +438,7 @@ export const overlays: { [key: string]: AnySourceData; } = { }, }; -export const opacities: { [key: string]: number; } = { +export const defaultOpacities: { [key: string]: number; } = { ignFrCadastre: 0.5, ignSlope: 0.4, swisstopoSlope: 0.4, diff --git a/website/src/lib/components/layer-control/LayerControl.svelte b/website/src/lib/components/layer-control/LayerControl.svelte index e9210331..74196b83 100644 --- a/website/src/lib/components/layer-control/LayerControl.svelte +++ b/website/src/lib/components/layer-control/LayerControl.svelte @@ -7,7 +7,7 @@ import { Layers } from 'lucide-svelte'; - import { basemaps, overlays, opacities } from '$lib/assets/layers'; + import { basemaps, overlays } from '$lib/assets/layers'; import { settings } from '$lib/db'; import { map } from '$lib/stores'; import { get, writable } from 'svelte/store'; @@ -19,7 +19,8 @@ currentOverlays, selectedBasemapTree, selectedOverlayTree, - customLayers + customLayers, + opacities } = settings; $: if ($map) { @@ -33,6 +34,7 @@ } $: if ($map && $currentOverlays) { + console.log($currentOverlays); // Add or remove overlay layers depending on the current overlays let overlayLayers = getLayers($currentOverlays); Object.keys(overlayLayers).forEach((id) => { @@ -79,10 +81,10 @@ type: overlay.type === 'raster' ? 'raster' : 'line', source: id, paint: { - ...(id in opacities + ...(id in $opacities ? overlay.type === 'raster' - ? { 'raster-opacity': opacities[id] } - : { 'line-opacity': opacities[id] } + ? { 'raster-opacity': $opacities[id] } + : { 'line-opacity': $opacities[id] } : {}) } }, diff --git a/website/src/lib/components/layer-control/LayerControlSettings.svelte b/website/src/lib/components/layer-control/LayerControlSettings.svelte index 417886b9..41727aaf 100644 --- a/website/src/lib/components/layer-control/LayerControlSettings.svelte +++ b/website/src/lib/components/layer-control/LayerControlSettings.svelte @@ -7,8 +7,10 @@ import * as Accordion from '$lib/components/ui/accordion'; import { Label } from '$lib/components/ui/label'; import * as Select from '$lib/components/ui/select'; + import { Slider } from '$lib/components/ui/slider'; - import { basemapTree, overlayTree } from '$lib/assets/layers'; + import { basemapTree, overlays, overlayTree } from '$lib/assets/layers'; + import { isSelected } from '$lib/components/layer-control/utils'; import { settings } from '$lib/db'; import { _ } from 'svelte-i18n'; @@ -17,11 +19,37 @@ import { browser } from '$app/environment'; import CustomLayers from './CustomLayers.svelte'; - const { selectedBasemapTree, selectedOverlayTree, stravaHeatmapColor, currentOverlays } = - settings; + const { + selectedBasemapTree, + selectedOverlayTree, + stravaHeatmapColor, + currentOverlays, + customLayers, + opacities + } = settings; export let open: boolean; + let selectedOverlay = writable(undefined); + let overlayOpacity = writable([1]); + + function setOpacityFromSelection() { + if ($selectedOverlay) { + let overlayId = $selectedOverlay.value; + if ($opacities.hasOwnProperty(overlayId)) { + $overlayOpacity = [$opacities[overlayId]]; + } else { + $overlayOpacity = [1]; + } + } else { + $overlayOpacity = [1]; + } + } + + $: if ($selectedOverlay) { + setOpacityFromSelection(); + } + const heatmapColors = [ { value: '', label: '' }, { value: 'blue', label: $_('layers.color.blue') }, @@ -120,13 +148,61 @@ + {$_('layers.opacity')} + + + + + + {$_('layers.heatmap')} - + {$_('layers.pois')} diff --git a/website/src/lib/components/layer-control/utils.ts b/website/src/lib/components/layer-control/utils.ts index 37a8a07e..d3db8a39 100644 --- a/website/src/lib/components/layer-control/utils.ts +++ b/website/src/lib/components/layer-control/utils.ts @@ -24,4 +24,16 @@ export function getLayers(node: LayerTreeType, layers: { [key: string]: boolean } }); return layers; +} + +export function isSelected(node: LayerTreeType, id: string) { + return Object.keys(node).some((key) => { + if (key === id) { + return node[key]; + } + if (typeof node[key] !== "boolean" && isSelected(node[key], id)) { + return true; + } + return false; + }); } \ No newline at end of file diff --git a/website/src/lib/db.ts b/website/src/lib/db.ts index e80b0cb1..05c99db1 100644 --- a/website/src/lib/db.ts +++ b/website/src/lib/db.ts @@ -4,7 +4,7 @@ import { enableMapSet, enablePatches, applyPatches, type Patch, type WritableDra import { writable, get, derived, type Readable, type Writable } from 'svelte/store'; import { gpxStatistics, initTargetMapBounds, splitAs, updateTargetMapBounds } from './stores'; import { mode } from 'mode-watcher'; -import { defaultBasemap, defaultBasemapTree, defaultOverlayTree, defaultOverlays, type CustomLayer } from './assets/layers'; +import { defaultBasemap, defaultBasemapTree, defaultOverlayTree, defaultOverlays, type CustomLayer, defaultOpacities } from './assets/layers'; import { applyToOrderedItemsFromFile, applyToOrderedSelectedItemsFromFile, selection } from '$lib/components/file-list/Selection'; import { ListFileItem, ListItem, ListTrackItem, ListLevel, ListTrackSegmentItem, ListWaypointItem, ListRootItem } from '$lib/components/file-list/FileList'; import { updateAnchorPoints } from '$lib/components/toolbar/tools/routing/Simplify'; @@ -104,6 +104,7 @@ export const settings = { currentOverlays: dexieUninitializedSettingStore('currentOverlays', defaultOverlays), previousOverlays: dexieSettingStore('previousOverlays', defaultOverlays), selectedOverlayTree: dexieSettingStore('selectedOverlayTree', defaultOverlayTree), + opacities: dexieSettingStore('opacities', defaultOpacities), customLayers: dexieSettingStore>('customLayers', {}), directionMarkers: dexieSettingStore('directionMarkers', false), distanceMarkers: dexieSettingStore('distanceMarkers', false), diff --git a/website/src/locales/en.json b/website/src/locales/en.json index 1be398c1..93af4fac 100644 --- a/website/src/locales/en.json +++ b/website/src/locales/en.json @@ -211,6 +211,7 @@ "create": "Create layer", "update": "Update layer" }, + "opacity": "Overlay opacity", "heatmap": "Strava Heatmap", "pois": "Points of interest", "label": {