diff --git a/website/src/lib/components/Menu.svelte b/website/src/lib/components/Menu.svelte index 541ec7d1..da782e3b 100644 --- a/website/src/lib/components/Menu.svelte +++ b/website/src/lib/components/Menu.svelte @@ -43,6 +43,18 @@ let undoDisabled = derived(canUndo, ($canUndo) => !$canUndo); let redoDisabled = derived(canRedo, ($canRedo) => !$canRedo); + + function switchBasemaps() { + [$currentBasemap, $previousBasemap] = [$previousBasemap, $currentBasemap]; + } + + function toggleOverlays() { + if (anySelectedLayer($currentOverlays)) { + [$currentOverlays, $previousOverlays] = [defaultOverlays, $currentOverlays]; + } else { + [$currentOverlays, $previousOverlays] = [$previousOverlays, defaultOverlays]; + } + }
@@ -127,6 +139,17 @@ + + {$_('menu.view')} + + {$_('menu.switch_basemap')} + {$_('menu.toggle_overlays')} + + {$_('menu.settings')} { @@ -109,12 +109,14 @@
- + {#if $currentOverlays} + + {/if}
diff --git a/website/src/lib/components/layer-control/LayerTreeNode.svelte b/website/src/lib/components/layer-control/LayerTreeNode.svelte index ec80089e..e8de81db 100644 --- a/website/src/lib/components/layer-control/LayerTreeNode.svelte +++ b/website/src/lib/components/layer-control/LayerTreeNode.svelte @@ -17,6 +17,8 @@ export let multiple: boolean = false; export let open: CollapsedInfoTreeType; + export let checked: LayerTreeType; + if (!Array.isArray(node)) { Object.keys(node).forEach((id) => { if (!open.children.hasOwnProperty(id)) { @@ -27,8 +29,6 @@ } }); } - - export let checked: LayerTreeType; Object.keys(node).forEach((id) => { if (!checked.hasOwnProperty(id)) { if (typeof node[id] == 'boolean') { diff --git a/website/src/lib/db.ts b/website/src/lib/db.ts index f80250cd..a89af5f1 100644 --- a/website/src/lib/db.ts +++ b/website/src/lib/db.ts @@ -47,6 +47,26 @@ function dexieSettingStore(setting: string, initial: any): Writable { }; } +// Wrap Dexie live queries in a Svelte store to avoid triggering the query for every subscriber, and updates to the store are pushed to the DB +function dexieUninitializedSettingStore(setting: string, initial: any): Writable { + let store = writable(undefined); + liveQuery(() => db.settings.get(setting)).subscribe(value => { + if (value !== undefined) { + store.set(value); + } else { + store.set(initial); + } + }); + return { + subscribe: store.subscribe, + set: (value: any) => db.settings.put(value, setting), + update: (callback: (value: any) => any) => { + let newValue = callback(get(store)); + db.settings.put(newValue, setting); + } + }; +} + export const settings = { distanceUnits: dexieSettingStore('distanceUnits', 'metric'), velocityUnits: dexieSettingStore('velocityUnits', 'speed'), @@ -64,7 +84,7 @@ export const settings = { currentBasemap: dexieSettingStore('currentBasemap', defaultBasemap), previousBasemap: dexieSettingStore('previousBasemap', defaultBasemap), selectedBasemapTree: dexieSettingStore('selectedBasemapTree', defaultBasemapTree), - currentOverlays: dexieSettingStore('currentOverlays', defaultOverlays), + currentOverlays: dexieUninitializedSettingStore('currentOverlays', defaultOverlays), previousOverlays: dexieSettingStore('previousOverlays', defaultOverlays), selectedOverlayTree: dexieSettingStore('selectedOverlayTree', defaultOverlayTree), }; diff --git a/website/src/locales/en.json b/website/src/locales/en.json index e0214be7..ab440928 100644 --- a/website/src/locales/en.json +++ b/website/src/locales/en.json @@ -14,6 +14,9 @@ "delete": "Delete", "delete_all": "Delete all", "select_all": "Select all", + "view": "View", + "switch_basemap": "Switch to previous basemap", + "toggle_overlays": "Toggle overlays", "settings": "Settings", "distance_units": "Distance units", "metric": "Metric",