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-18 10:55:55 +02:00
|
|
|
import {
|
|
|
|
Plus,
|
|
|
|
Copy,
|
|
|
|
Download,
|
|
|
|
Undo2,
|
|
|
|
Redo2,
|
|
|
|
Trash2,
|
|
|
|
HeartHandshake,
|
2024-04-19 12:16:51 +02:00
|
|
|
Upload,
|
|
|
|
Cloud
|
2024-04-18 10:55:55 +02:00
|
|
|
} from 'lucide-svelte';
|
|
|
|
|
2024-04-18 15:30:19 +02:00
|
|
|
import {
|
2024-04-22 17:22:21 +02:00
|
|
|
fileCollection,
|
2024-04-18 15:30:19 +02:00
|
|
|
selectedFiles,
|
|
|
|
duplicateSelectedFiles,
|
|
|
|
exportAllFiles,
|
|
|
|
exportSelectedFiles,
|
|
|
|
removeAllFiles,
|
|
|
|
removeSelectedFiles,
|
2024-04-22 11:45:57 +02:00
|
|
|
triggerFileInput,
|
2024-04-24 16:12:50 +02:00
|
|
|
selectFiles,
|
|
|
|
settings
|
2024-04-18 15:30:19 +02:00
|
|
|
} from '$lib/stores';
|
2024-04-08 17:12:39 +02:00
|
|
|
|
2024-04-24 16:12:50 +02:00
|
|
|
import { _ } from 'svelte-i18n';
|
|
|
|
|
2024-04-08 17:12:39 +02:00
|
|
|
let showDistanceMarkers = false;
|
|
|
|
let showDirectionMarkers = false;
|
|
|
|
</script>
|
|
|
|
|
2024-04-09 17:37:23 +02:00
|
|
|
<div class="absolute top-2 left-0 right-0 z-10 flex flex-row justify-center pointer-events-none">
|
2024-04-10 14:54:35 +02:00
|
|
|
<div
|
2024-04-20 23:17:11 +02:00
|
|
|
class="w-fit flex flex-row flex-wrap 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-04-24 16:12:50 +02:00
|
|
|
<Menubar.Trigger>{$_('menu.file')}</Menubar.Trigger>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.Content>
|
|
|
|
<Menubar.Item>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Plus size="16" class="mr-1" />
|
|
|
|
{$_('menu.new')}
|
|
|
|
<Menubar.Shortcut>⌘N</Menubar.Shortcut>
|
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')}
|
|
|
|
<Menubar.Shortcut>⌘O</Menubar.Shortcut>
|
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-04-18 15:30:19 +02:00
|
|
|
<Menubar.Item on:click={duplicateSelectedFiles} disabled={$selectedFiles.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Copy size="16" class="mr-1" />
|
|
|
|
{$_('menu.duplicate')}
|
|
|
|
<Menubar.Shortcut>⌘D</Menubar.Shortcut>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Separator />
|
2024-04-18 15:30:19 +02:00
|
|
|
<Menubar.Item on:click={exportSelectedFiles} disabled={$selectedFiles.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Download size="16" class="mr-1" />
|
|
|
|
{$_('menu.export')}
|
|
|
|
<Menubar.Shortcut>⌘S</Menubar.Shortcut>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
2024-04-22 17:22:21 +02:00
|
|
|
<Menubar.Item on:click={exportAllFiles} disabled={$fileCollection.files.length == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Download size="16" class="mr-1" />
|
|
|
|
{$_('menu.export_all')}
|
|
|
|
<Menubar.Shortcut>⇧⌘S</Menubar.Shortcut>
|
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-09 17:21:26 +02:00
|
|
|
<Menubar.Content>
|
|
|
|
<Menubar.Item>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Undo2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.undo')}
|
|
|
|
<Menubar.Shortcut>⌘Z</Menubar.Shortcut>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Item>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Redo2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.redo')}
|
|
|
|
<Menubar.Shortcut>⇧⌘Z</Menubar.Shortcut>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Item>
|
|
|
|
<Menubar.Separator />
|
2024-04-18 15:30:19 +02:00
|
|
|
<Menubar.Item on:click={removeSelectedFiles} disabled={$selectedFiles.size == 0}>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Trash2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.delete')}
|
|
|
|
<Menubar.Shortcut>⌘⌫</Menubar.Shortcut></Menubar.Item
|
2024-04-15 10:33:47 +02:00
|
|
|
>
|
2024-04-18 15:30:19 +02:00
|
|
|
<Menubar.Item
|
|
|
|
class="text-destructive data-[highlighted]:text-destructive"
|
|
|
|
on:click={removeAllFiles}
|
2024-04-22 17:22:21 +02:00
|
|
|
disabled={$fileCollection.files.length == 0}
|
2024-04-18 15:30:19 +02:00
|
|
|
>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Trash2 size="16" class="mr-1" />
|
|
|
|
{$_('menu.delete_all')}<Menubar.Shortcut>⇧⌘⌫</Menubar.Shortcut></Menubar.Item
|
2024-04-15 10:33:47 +02:00
|
|
|
>
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.Content>
|
|
|
|
</Menubar.Menu>
|
|
|
|
<Menubar.Menu>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.Trigger>{$_('menu.settings')}</Menubar.Trigger>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.Content
|
|
|
|
><Menubar.Sub>
|
2024-04-24 17:39:56 +02:00
|
|
|
<Menubar.SubTrigger inset>{$_('menu.distance_units')}</Menubar.SubTrigger>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.SubContent>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$settings.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-04-24 17:39:56 +02:00
|
|
|
<Menubar.SubTrigger inset>{$_('menu.velocity_units')}</Menubar.SubTrigger>
|
2024-04-09 17:21:26 +02:00
|
|
|
<Menubar.SubContent>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Menubar.RadioGroup bind:value={$settings.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-04-24 17:39:56 +02:00
|
|
|
<Menubar.SubTrigger inset>{$_('menu.temperature_units')}</Menubar.SubTrigger>
|
2024-04-24 16:12:50 +02:00
|
|
|
<Menubar.SubContent>
|
|
|
|
<Menubar.RadioGroup bind:value={$settings.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 />
|
|
|
|
<Menubar.CheckboxItem bind:checked={showDistanceMarkers}>
|
2024-04-24 17:39:56 +02:00
|
|
|
{$_('menu.distance_markers')}
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.CheckboxItem>
|
|
|
|
<Menubar.CheckboxItem bind:checked={showDirectionMarkers}>
|
2024-04-24 17:39:56 +02:00
|
|
|
{$_('menu.direction_markers')}
|
2024-04-09 17:21:26 +02:00
|
|
|
</Menubar.CheckboxItem>
|
|
|
|
</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-04-09 18:46:01 +02:00
|
|
|
<Button variant="ghost" href="/about" target="_blank" class="cursor-default h-fit rounded-sm"
|
2024-04-24 17:39:56 +02:00
|
|
|
>{$_('menu.about')}</Button
|
2024-04-09 17:21:26 +02:00
|
|
|
>
|
|
|
|
<Button
|
|
|
|
variant="ghost"
|
|
|
|
href="https://ko-fi.com/gpxstudio"
|
|
|
|
target="_blank"
|
2024-04-09 18:46:01 +02:00
|
|
|
class="cursor-default h-fit rounded-sm"
|
2024-04-24 17:39:56 +02:00
|
|
|
>{$_('menu.donate')} <HeartHandshake size="16" class="ml-1" /></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-04-18 15:30:19 +02:00
|
|
|
<svelte:window
|
|
|
|
on:keydown={(e) => {
|
|
|
|
e.stopImmediatePropagation();
|
|
|
|
if (e.key === 'o' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
triggerFileInput();
|
|
|
|
e.preventDefault();
|
|
|
|
} else if (e.key === 'd' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
duplicateSelectedFiles();
|
|
|
|
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();
|
|
|
|
} else if ((e.key === 'Backspace' || e.key === 'Delete') && (e.metaKey || e.ctrlKey)) {
|
|
|
|
if (e.shiftKey) {
|
|
|
|
removeAllFiles();
|
|
|
|
} else {
|
|
|
|
removeSelectedFiles();
|
|
|
|
}
|
|
|
|
e.preventDefault();
|
2024-04-22 11:45:57 +02:00
|
|
|
} else if (e.key === 'a' && (e.metaKey || e.ctrlKey)) {
|
|
|
|
$selectFiles.selectAllFiles();
|
|
|
|
e.preventDefault();
|
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>
|