2024-04-08 17:12:39 +02:00
|
|
|
<script lang="ts">
|
|
|
|
import * as Menubar from '$lib/components/ui/menubar/index.js';
|
|
|
|
import { Button } from '$lib/components/ui/button';
|
|
|
|
import Logo from './Logo.svelte';
|
2024-04-29 17:03:23 +02:00
|
|
|
import Shortcut from './Shortcut.svelte';
|
2024-05-08 12:00:04 +02:00
|
|
|
import {
|
|
|
|
Plus,
|
|
|
|
Copy,
|
|
|
|
Download,
|
|
|
|
Undo2,
|
|
|
|
Redo2,
|
|
|
|
Trash2,
|
|
|
|
Upload,
|
|
|
|
Cloud,
|
|
|
|
Heart,
|
|
|
|
Map,
|
|
|
|
Layers2,
|
2024-05-08 12:35:31 +02:00
|
|
|
Box,
|
|
|
|
Milestone,
|
|
|
|
Coins,
|
|
|
|
Ruler,
|
|
|
|
Zap,
|
|
|
|
Thermometer,
|
|
|
|
Sun,
|
2024-05-22 16:05:31 +02:00
|
|
|
Moon,
|
2024-06-09 17:22:41 +02:00
|
|
|
Layers3,
|
2024-06-10 12:06:32 +02:00
|
|
|
MountainSnow,
|
2024-06-19 19:42:36 +02:00
|
|
|
GalleryVertical,
|
|
|
|
Languages
|
2024-05-08 12:00:04 +02:00
|
|
|
} from 'lucide-svelte';
|
2024-04-18 10:55:55 +02:00
|
|
|
|
2024-04-18 15:30:19 +02:00
|
|
|
import {
|
2024-05-08 12:00:04 +02:00
|
|
|
map,
|
2024-04-18 15:30:19 +02:00
|
|
|
exportAllFiles,
|
|
|
|
exportSelectedFiles,
|
2024-04-22 11:45:57 +02:00
|
|
|
triggerFileInput,
|
2024-06-11 19:27:10 +02:00
|
|
|
createFile,
|
2024-06-19 18:11:05 +02:00
|
|
|
loadFiles,
|
2024-06-19 18:51:26 +02:00
|
|
|
toggleSelectionVisibility,
|
|
|
|
updateSelectionFromKey
|
2024-04-18 15:30:19 +02:00
|
|
|
} from '$lib/stores';
|
2024-05-23 11:21:57 +02:00
|
|
|
import { selectAll, selection } from '$lib/components/file-list/Selection';
|
2024-06-20 00:28:16 +02:00
|
|
|
import { derived } from 'svelte/store';
|
2024-05-04 15:10:30 +02:00
|
|
|
import { canUndo, canRedo, dbUtils, fileObservers, settings } from '$lib/db';
|
2024-05-23 11:21:57 +02:00
|
|
|
import { anySelectedLayer } from '$lib/components/layer-control/utils';
|
|
|
|
import { defaultOverlays } from '$lib/assets/layers';
|
|
|
|
import LayerControlSettings from '$lib/components/layer-control/LayerControlSettings.svelte';
|
2024-04-08 17:12:39 +02:00
|
|
|
|
2024-05-08 12:35:31 +02:00
|
|
|
import { resetMode, setMode, systemPrefersMode } from 'mode-watcher';
|
2024-04-27 11:16:59 +02:00
|
|
|
|
2024-06-19 19:42:36 +02:00
|
|
|
import { _, locale } from 'svelte-i18n';
|
|
|
|
import { languages } from '$lib/languages';
|
|
|
|
import { goto } from '$app/navigation';
|
2024-06-19 20:39:00 +02:00
|
|
|
import { base } from '$app/paths';
|
2024-04-24 16:12:50 +02:00
|
|
|
|
2024-05-04 23:50:27 +02:00
|
|
|
const {
|
|
|
|
distanceUnits,
|
|
|
|
velocityUnits,
|
|
|
|
temperatureUnits,
|
2024-06-09 17:22:41 +02:00
|
|
|
elevationProfile,
|
2024-05-22 16:05:31 +02:00
|
|
|
verticalFileView,
|
2024-05-04 23:50:27 +02:00
|
|
|
mode,
|
|
|
|
currentBasemap,
|
|
|
|
previousBasemap,
|
|
|
|
currentOverlays,
|
2024-05-08 12:35:31 +02:00
|
|
|
previousOverlays,
|
|
|
|
distanceMarkers,
|
|
|
|
directionMarkers
|
2024-05-04 23:50:27 +02:00
|
|
|
} = settings;
|
2024-05-08 12:35:31 +02:00
|
|
|
|
2024-05-04 15:10:30 +02:00
|
|
|
$: if ($mode === 'system') {
|
|
|
|
resetMode();
|
|
|
|
} else {
|
|
|
|
setMode($mode);
|
2024-04-27 11:16:59 +02:00
|
|
|
}
|
2024-04-30 22:35:54 +02:00
|
|
|
|
2024-05-02 19:51:08 +02:00
|
|
|
let undoDisabled = derived(canUndo, ($canUndo) => !$canUndo);
|
2024-05-03 15:59:34 +02:00
|
|
|
let redoDisabled = derived(canRedo, ($canRedo) => !$canRedo);
|
2024-05-06 15:52:11 +02:00
|
|
|
|
|
|
|
function switchBasemaps() {
|
|
|
|
[$currentBasemap, $previousBasemap] = [$previousBasemap, $currentBasemap];
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleOverlays() {
|
|
|
|
if (anySelectedLayer($currentOverlays)) {
|
|
|
|
[$currentOverlays, $previousOverlays] = [defaultOverlays, $currentOverlays];
|
|
|
|
} else {
|
|
|
|
[$currentOverlays, $previousOverlays] = [$previousOverlays, defaultOverlays];
|
|
|
|
}
|
|
|
|
}
|
2024-05-08 12:00:04 +02:00
|
|
|
|
|
|
|
function toggle3D() {
|
|
|
|
if ($map) {
|
|
|
|
if ($map.getPitch() === 0) {
|
|
|
|
$map.easeTo({ pitch: 70 });
|
|
|
|
} else {
|
|
|
|
$map.easeTo({ pitch: 0 });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-05-23 11:21:57 +02:00
|
|
|
|
|
|
|
let layerSettingsOpen = false;
|
2024-04-08 17:12:39 +02:00
|
|
|
</script>
|
|
|
|
|
2024-04-26 19:34:46 +02:00
|
|
|
<div class="absolute top-2 left-0 right-0 z-20 flex flex-row justify-center pointer-events-none">
|
2024-04-10 14:54:35 +02:00
|
|
|
<div
|
2024-05-24 22:53:30 +02:00
|
|
|
class="w-fit flex flex-row mx-16 items-center justify-center p-1 bg-background rounded-md pointer-events-auto shadow-md"
|
2024-04-10 14:54:35 +02:00
|
|
|
>
|
2024-04-09 18:46:01 +02:00
|
|
|
<Logo class="h-5 mt-0.5 mx-2" />
|
|
|
|
<Menubar.Root class="border-none h-fit p-0">
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.Menu>
|
2024-06-10 20:03:57 +02:00
|
|
|
<Menubar.Trigger>{$_('gpx.file')}</Menubar.Trigger>
|
2024-04-26 12:30:39 +02:00
|
|
|
<Menubar.Content class="border-none">
|
2024-04-27 12:18:40 +02:00
|
|
|
<Menubar.Item on:click={createFile}>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Plus size="16" class="mr-1" />
|
2024-06-12 15:29:54 +02:00
|
|
|
{$_('menu.new')}
|
|
|
|
<Shortcut key="+" ctrl={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
2024-04-18 15:49:20 +02:00
|
|
|
<Menubar.Separator />
|
2024-04-18 10:55:55 +02:00
|
|
|
<Menubar.Item on:click={triggerFileInput}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Upload size="16" class="mr-1" />
|
|
|
|
{$_('menu.load_desktop')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="O" ctrl={true} />
|
2024-04-18 10:55:55 +02:00
|
|
|
</Menubar.Item>
|
2024-04-15 10:33:47 +02:00
|
|
|
<Menubar.Item>
|
2024-04-19 12:16:51 +02:00
|
|
|
<Cloud size="16" class="mr-1" />
|
2024-04-24 17:39:56 +02:00
|
|
|
{$_('menu.load_drive')}</Menubar.Item
|
2024-04-15 10:33:47 +02:00
|
|
|
>
|
|
|
|
<Menubar.Separator />
|
2024-05-22 16:05:31 +02:00
|
|
|
<Menubar.Item on:click={dbUtils.duplicateSelection} disabled={$selection.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Copy size="16" class="mr-1" />
|
|
|
|
{$_('menu.duplicate')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="D" ctrl={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Separator />
|
2024-05-22 16:05:31 +02:00
|
|
|
<Menubar.Item on:click={exportSelectedFiles} disabled={$selection.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Download size="16" class="mr-1" />
|
|
|
|
{$_('menu.export')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="S" ctrl={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
2024-05-02 19:51:08 +02:00
|
|
|
<Menubar.Item on:click={exportAllFiles} disabled={$fileObservers.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Download size="16" class="mr-1" />
|
|
|
|
{$_('menu.export_all')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="S" ctrl={true} shift={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
</Menubar.Content>
|
|
|
|
</Menubar.Menu>
|
|
|
|
<Menubar.Menu>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.Trigger>{$_('menu.edit')}</Menubar.Trigger>
|
2024-04-26 12:30:39 +02:00
|
|
|
<Menubar.Content class="border-none">
|
2024-05-04 14:27:12 +02:00
|
|
|
<Menubar.Item on:click={dbUtils.undo} disabled={$undoDisabled}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Undo2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.undo')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="Z" ctrl={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
2024-05-04 14:27:12 +02:00
|
|
|
<Menubar.Item on:click={dbUtils.redo} disabled={$redoDisabled}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Redo2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.redo')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="Z" ctrl={true} shift={true} />
|
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Separator />
|
2024-05-23 11:21:57 +02:00
|
|
|
<Menubar.Item on:click={selectAll}>
|
2024-04-29 17:03:23 +02:00
|
|
|
<span class="w-4 mr-1"></span>
|
|
|
|
{$_('menu.select_all')}
|
|
|
|
<Shortcut key="A" ctrl={true} />
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Separator />
|
2024-05-22 16:05:31 +02:00
|
|
|
<Menubar.Item on:click={dbUtils.deleteSelection} disabled={$selection.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Trash2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.delete')}
|
2024-04-29 17:03:23 +02:00
|
|
|
<Shortcut key="⌫" ctrl={true} />
|
|
|
|
</Menubar.Item>
|
2024-04-18 15:30:19 +02:00
|
|
|
<Menubar.Item
|
|
|
|
class="text-destructive data-[highlighted]:text-destructive"
|
2024-05-02 19:51:08 +02:00
|
|
|
on:click={dbUtils.deleteAllFiles}
|
|
|
|
disabled={$fileObservers.size == 0}
|
2024-04-18 15:30:19 +02:00
|
|
|
>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Trash2 size="16" class="mr-1" />
|
2024-04-29 17:03:23 +02:00
|
|
|
{$_('menu.delete_all')}
|
|
|
|
<Shortcut key="⌫" ctrl={true} shift={true} />
|
|
|
|
</Menubar.Item>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Content>
|
|
|
|
</Menubar.Menu>
|
2024-05-06 15:52:11 +02:00
|
|
|
<Menubar.Menu>
|
|
|
|
<Menubar.Trigger>{$_('menu.view')}</Menubar.Trigger>
|
|
|
|
<Menubar.Content class="border-none">
|
2024-06-09 17:22:41 +02:00
|
|
|
<Menubar.CheckboxItem bind:checked={$elevationProfile}>
|
2024-06-19 17:34:07 +02:00
|
|
|
<MountainSnow size="16" class="mr-1" />
|
|
|
|
{$_('menu.elevation_profile')}
|
|
|
|
<Shortcut key="P" ctrl={true} />
|
2024-06-09 17:22:41 +02:00
|
|
|
</Menubar.CheckboxItem>
|
2024-05-22 16:05:31 +02:00
|
|
|
<Menubar.CheckboxItem bind:checked={$verticalFileView}>
|
2024-06-19 17:34:07 +02:00
|
|
|
<GalleryVertical size="16" class="mr-1" />
|
|
|
|
{$_('menu.vertical_file_view')}
|
|
|
|
<Shortcut key="L" ctrl={true} />
|
2024-05-22 16:05:31 +02:00
|
|
|
</Menubar.CheckboxItem>
|
|
|
|
<Menubar.Separator />
|
2024-06-19 17:34:07 +02:00
|
|
|
<Menubar.Item inset on:click={switchBasemaps}>
|
|
|
|
<Map size="16" class="mr-1" />{$_('menu.switch_basemap')}<Shortcut key="F1" />
|
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Item inset on:click={toggleOverlays}>
|
|
|
|
<Layers2 size="16" class="mr-1" />{$_('menu.toggle_overlays')}<Shortcut key="F2" />
|
|
|
|
</Menubar.Item>
|
2024-05-08 12:00:04 +02:00
|
|
|
<Menubar.Separator />
|
2024-05-08 12:35:31 +02:00
|
|
|
<Menubar.CheckboxItem bind:checked={$distanceMarkers}>
|
2024-06-19 17:34:07 +02:00
|
|
|
<Coins size="16" class="mr-1" />{$_('menu.distance_markers')}<Shortcut key="F3" />
|
2024-05-08 12:35:31 +02:00
|
|
|
</Menubar.CheckboxItem>
|
|
|
|
<Menubar.CheckboxItem bind:checked={$directionMarkers}>
|
2024-06-19 17:34:07 +02:00
|
|
|
<Milestone size="16" class="mr-1" />{$_('menu.direction_markers')}<Shortcut key="F4" />
|
2024-05-08 12:35:31 +02:00
|
|
|
</Menubar.CheckboxItem>
|
2024-05-08 12:37:06 +02:00
|
|
|
<Menubar.Separator />
|
2024-06-19 17:34:07 +02:00
|
|
|
<Menubar.Item inset on:click={toggle3D}>
|
|
|
|
<Box size="16" class="mr-1" />
|
|
|
|
{$_('menu.toggle_3d')}
|
|
|
|
<Shortcut key="{$_('menu.ctrl')}+{$_('menu.drag')}" />
|
|
|
|
</Menubar.Item>
|
2024-05-06 15:52:11 +02:00
|
|
|
</Menubar.Content>
|
|
|
|
</Menubar.Menu>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.Menu>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.Trigger>{$_('menu.settings')}</Menubar.Trigger>
|
2024-04-26 12:30:39 +02:00
|
|
|
<Menubar.Content class="border-none"
|
2024-04-09 17:21:26 +02:00
|
|
|
><Menubar.Sub>
|
2024-06-19 17:34:07 +02:00
|
|
|
<Menubar.SubTrigger>
|
|
|
|
<Ruler size="16" class="mr-1" />{$_('menu.distance_units')}
|
|
|
|
</Menubar.SubTrigger>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.SubContent>
|
2024-05-04 15:10:30 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$distanceUnits}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.RadioItem value="metric">{$_('menu.metric')}</Menubar.RadioItem>
|
|
|
|
<Menubar.RadioItem value="imperial">{$_('menu.imperial')}</Menubar.RadioItem>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.RadioGroup>
|
|
|
|
</Menubar.SubContent>
|
|
|
|
</Menubar.Sub>
|
|
|
|
<Menubar.Sub>
|
2024-05-08 12:35:31 +02:00
|
|
|
<Menubar.SubTrigger
|
|
|
|
><Zap size="16" class="mr-1" />{$_('menu.velocity_units')}</Menubar.SubTrigger
|
|
|
|
>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.SubContent>
|
2024-05-04 15:10:30 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$velocityUnits}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.RadioItem value="speed">{$_('quantities.speed')}</Menubar.RadioItem>
|
|
|
|
<Menubar.RadioItem value="pace">{$_('quantities.pace')}</Menubar.RadioItem>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.RadioGroup>
|
|
|
|
</Menubar.SubContent>
|
|
|
|
</Menubar.Sub>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Menubar.Sub>
|
2024-06-19 17:34:07 +02:00
|
|
|
<Menubar.SubTrigger>
|
|
|
|
<Thermometer size="16" class="mr-1" />{$_('menu.temperature_units')}
|
|
|
|
</Menubar.SubTrigger>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Menubar.SubContent>
|
2024-05-04 15:10:30 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$temperatureUnits}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.RadioItem value="celsius">{$_('menu.celsius')}</Menubar.RadioItem>
|
|
|
|
<Menubar.RadioItem value="fahrenheit">{$_('menu.fahrenheit')}</Menubar.RadioItem>
|
2024-04-24 16:12:50 +02:00
|
|
|
</Menubar.RadioGroup>
|
|
|
|
</Menubar.SubContent>
|
|
|
|
</Menubar.Sub>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.Separator />
|
2024-06-19 19:42:36 +02:00
|
|
|
<Menubar.Sub>
|
|
|
|
<Menubar.SubTrigger>
|
|
|
|
<Languages size="16" class="mr-1" />
|
|
|
|
{$_('menu.language')}
|
|
|
|
</Menubar.SubTrigger>
|
|
|
|
<Menubar.SubContent>
|
|
|
|
<Menubar.RadioGroup
|
|
|
|
bind:value={$locale}
|
|
|
|
onValueChange={(value) => {
|
|
|
|
if (value) {
|
2024-06-19 20:39:00 +02:00
|
|
|
goto(base + '/' + (value === 'en' ? '' : value));
|
2024-06-19 19:42:36 +02:00
|
|
|
}
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{#each Object.entries(languages) as [code, name]}
|
|
|
|
<Menubar.RadioItem value={code}>{name}</Menubar.RadioItem>
|
|
|
|
{/each}
|
|
|
|
</Menubar.RadioGroup>
|
|
|
|
</Menubar.SubContent>
|
|
|
|
</Menubar.Sub>
|
2024-04-27 11:16:59 +02:00
|
|
|
<Menubar.Sub>
|
2024-05-08 12:35:31 +02:00
|
|
|
<Menubar.SubTrigger>
|
|
|
|
{#if $mode === 'system'}
|
|
|
|
{#if $systemPrefersMode === 'light'}
|
|
|
|
<Sun size="16" class="mr-1" />
|
|
|
|
{:else if $systemPrefersMode === 'dark'}
|
|
|
|
<Moon size="16" class="mr-1" />
|
|
|
|
{:else}
|
|
|
|
<Sun size="16" class="mr-1" />
|
|
|
|
{/if}
|
|
|
|
{:else if $mode === 'light'}
|
|
|
|
<Sun size="16" class="mr-1" />
|
|
|
|
{:else if $mode === 'dark'}
|
|
|
|
<Moon size="16" class="mr-1" />
|
|
|
|
{/if}
|
|
|
|
{$_('menu.mode')}
|
|
|
|
</Menubar.SubTrigger>
|
2024-04-27 11:16:59 +02:00
|
|
|
<Menubar.SubContent>
|
2024-05-04 15:10:30 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$mode}>
|
2024-04-27 11:16:59 +02:00
|
|
|
<Menubar.RadioItem value="light">{$_('menu.light')}</Menubar.RadioItem>
|
|
|
|
<Menubar.RadioItem value="dark">{$_('menu.dark')}</Menubar.RadioItem>
|
|
|
|
<Menubar.RadioItem value="system">{$_('menu.system')}</Menubar.RadioItem>
|
|
|
|
</Menubar.RadioGroup>
|
|
|
|
</Menubar.SubContent>
|
|
|
|
</Menubar.Sub>
|
2024-05-23 11:21:57 +02:00
|
|
|
<Menubar.Separator />
|
|
|
|
<Menubar.Item on:click={() => (layerSettingsOpen = true)}>
|
|
|
|
<Layers3 size="16" class="mr-1" />
|
|
|
|
{$_('menu.layers')}
|
|
|
|
</Menubar.Item>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Content>
|
|
|
|
</Menubar.Menu>
|
|
|
|
</Menubar.Root>
|
2024-04-12 15:12:27 +02:00
|
|
|
<div class="h-fit flex flex-row items-center ml-1 gap-1">
|
2024-06-19 20:41:02 +02:00
|
|
|
<Button variant="ghost" href="./about" target="_blank" class="cursor-default h-fit rounded-sm"
|
|
|
|
>{$_('menu.about')}</Button
|
2024-04-09 17:21:26 +02:00
|
|
|
>
|
|
|
|
<Button
|
|
|
|
variant="ghost"
|
|
|
|
href="https://ko-fi.com/gpxstudio"
|
|
|
|
target="_blank"
|
2024-04-25 14:42:19 +02:00
|
|
|
class="cursor-default h-fit rounded-sm font-bold text-support hover:text-support"
|
|
|
|
>{$_('menu.donate')} <Heart size="16" class="ml-1" fill="rgb(var(--support))" /></Button
|
2024-04-09 17:21:26 +02:00
|
|
|
>
|
|
|
|
</div>
|
2024-04-08 17:12:39 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2024-04-09 18:46:01 +02:00
|
|
|
|
2024-05-23 11:21:57 +02:00
|
|
|
<LayerControlSettings bind:open={layerSettingsOpen} />
|
|
|
|
|
2024-04-18 15:30:19 +02:00
|
|
|
<svelte:window
|
|
|
|
on:keydown={(e) => {
|
2024-06-12 15:29:54 +02:00
|
|
|
if (e.key === '+' && (e.metaKey || e.ctrlKey)) {
|
2024-04-27 12:18:40 +02:00
|
|
|
createFile();
|
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'o' && (e.metaKey || e.ctrlKey)) {
|
2024-04-18 15:30:19 +02:00
|
|
|
triggerFileInput();
|
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'd' && (e.metaKey || e.ctrlKey)) {
|
2024-05-22 16:05:31 +02:00
|
|
|
dbUtils.duplicateSelection();
|
2024-04-18 15:30:19 +02:00
|
|
|
e.preventDefault();
|
2024-04-18 15:48:07 +02:00
|
|
|
} else if ((e.key === 's' || e.key == 'S') && (e.metaKey || e.ctrlKey)) {
|
2024-04-18 15:30:19 +02:00
|
|
|
if (e.shiftKey) {
|
|
|
|
exportAllFiles();
|
|
|
|
} else {
|
|
|
|
exportSelectedFiles();
|
|
|
|
}
|
|
|
|
e.preventDefault();
|
2024-04-30 22:35:54 +02:00
|
|
|
} else if ((e.key === 'z' || e.key == 'Z') && (e.metaKey || e.ctrlKey)) {
|
|
|
|
if (e.shiftKey) {
|
2024-05-04 14:27:12 +02:00
|
|
|
dbUtils.redo();
|
2024-04-30 22:35:54 +02:00
|
|
|
} else {
|
2024-05-04 14:27:12 +02:00
|
|
|
dbUtils.undo();
|
2024-04-30 22:35:54 +02:00
|
|
|
}
|
2024-04-18 15:30:19 +02:00
|
|
|
} else if ((e.key === 'Backspace' || e.key === 'Delete') && (e.metaKey || e.ctrlKey)) {
|
|
|
|
if (e.shiftKey) {
|
2024-05-02 19:51:08 +02:00
|
|
|
dbUtils.deleteAllFiles();
|
2024-04-18 15:30:19 +02:00
|
|
|
} else {
|
2024-05-22 16:05:31 +02:00
|
|
|
dbUtils.deleteSelection();
|
2024-04-18 15:30:19 +02:00
|
|
|
}
|
|
|
|
e.preventDefault();
|
2024-04-22 11:45:57 +02:00
|
|
|
} else if (e.key === 'a' && (e.metaKey || e.ctrlKey)) {
|
2024-05-23 11:21:57 +02:00
|
|
|
selectAll();
|
2024-04-22 11:45:57 +02:00
|
|
|
e.preventDefault();
|
2024-06-19 17:34:07 +02:00
|
|
|
} else if (e.key === 'p' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
$elevationProfile = !$elevationProfile;
|
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'l' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
$verticalFileView = !$verticalFileView;
|
|
|
|
e.preventDefault();
|
2024-06-19 18:11:05 +02:00
|
|
|
} else if (e.key === 'h' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
toggleSelectionVisibility();
|
|
|
|
e.preventDefault();
|
2024-05-04 23:50:27 +02:00
|
|
|
} else if (e.key === 'F1') {
|
2024-05-06 15:52:11 +02:00
|
|
|
switchBasemaps();
|
2024-05-04 23:50:27 +02:00
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'F2') {
|
2024-05-06 15:52:11 +02:00
|
|
|
toggleOverlays();
|
2024-05-04 23:50:27 +02:00
|
|
|
e.preventDefault();
|
2024-06-19 17:34:07 +02:00
|
|
|
} else if (e.key === 'F3') {
|
|
|
|
$distanceMarkers = !$distanceMarkers;
|
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'F4') {
|
|
|
|
$directionMarkers = !$directionMarkers;
|
|
|
|
e.preventDefault();
|
2024-06-19 18:51:26 +02:00
|
|
|
} else if (
|
|
|
|
e.key === 'ArrowRight' ||
|
|
|
|
e.key === 'ArrowDown' ||
|
|
|
|
e.key === 'ArrowLeft' ||
|
|
|
|
e.key === 'ArrowUp'
|
|
|
|
) {
|
|
|
|
updateSelectionFromKey(e.key === 'ArrowRight' || e.key === 'ArrowDown', e.shiftKey);
|
|
|
|
e.preventDefault();
|
2024-04-18 15:30:19 +02:00
|
|
|
}
|
|
|
|
}}
|
2024-06-11 19:27:10 +02:00
|
|
|
on:dragover={(e) => e.preventDefault()}
|
|
|
|
on:drop={(e) => {
|
|
|
|
e.preventDefault();
|
|
|
|
if (e.dataTransfer.files.length > 0) {
|
|
|
|
loadFiles(e.dataTransfer.files);
|
|
|
|
}
|
|
|
|
}}
|
2024-04-18 15:30:19 +02:00
|
|
|
/>
|
|
|
|
|
2024-04-09 18:46:01 +02:00
|
|
|
<style lang="postcss">
|
|
|
|
div :global(button) {
|
|
|
|
@apply hover:bg-accent;
|
|
|
|
@apply px-3;
|
|
|
|
@apply py-0.5;
|
|
|
|
}
|
|
|
|
|
|
|
|
div :global(a) {
|
|
|
|
@apply hover:bg-accent;
|
|
|
|
@apply px-3;
|
|
|
|
@apply py-0.5;
|
|
|
|
}
|
|
|
|
</style>
|