fix tools

This commit is contained in:
vcoppe
2025-10-18 16:10:08 +02:00
parent 9fa8fe5767
commit c59cd66141
60 changed files with 1289 additions and 1161 deletions

View File

@@ -6,16 +6,16 @@
import * as Select from '$lib/components/ui/select';
import { i18n } from '$lib/i18n.svelte';
import { ListWaypointItem } from '$lib/components/file-list/file-list';
import { dbUtils, fileObservers, getFile, settings, type GPXFileWithStatistics } from '$lib/db';
import { get } from 'svelte/store';
import Help from '$lib/components/Help.svelte';
import { onDestroy, onMount } from 'svelte';
import { map } from '$lib/stores';
import { getURLForLanguage, resetCursor, setCrosshairCursor } from '$lib/utils';
import { onDestroy, onMount, untrack } from 'svelte';
import { getURLForLanguage } from '$lib/utils';
import { MapPin, CircleX, Save } from '@lucide/svelte';
import { getSymbolKey, symbols } from '$lib/assets/symbols';
import { selection } from '$lib/logic/selection';
import { selectedWaypoint } from './waypoint';
import { fileActions } from '$lib/logic/file-actions';
import { map } from '$lib/components/map/map';
import { mapCursor, MapCursorState } from '$lib/logic/map-cursor';
let props: {
class?: string;
@@ -24,20 +24,46 @@
let name = $state('');
let description = $state('');
let link = $state('');
let symbolKey = $state('');
let sym = $state('');
let longitude = $state(0);
let latitude = $state(0);
let symbolKey = $derived(getSymbolKey(sym));
let canCreate = $derived(selection.value.size > 0);
let canCreate = $derived($selection.size > 0);
function resetWaypointData() {
name = '';
description = '';
link = '';
symbolKey = '';
longitude = 0;
latitude = 0;
}
let sortedSymbols = $derived(
Object.entries(symbols).sort((a, b) => {
return i18n
._(`gpx.symbol.${a[0]}`)
.localeCompare(i18n._(`gpx.symbol.${b[0]}`), i18n.lang);
})
);
$effect(() => {
if ($selectedWaypoint) {
const wpt = $selectedWaypoint[0];
untrack(() => {
name = wpt.name ?? '';
description = wpt.desc ?? '';
if (wpt.cmt !== undefined && wpt.cmt !== wpt.desc) {
description += '\n\n' + wpt.cmt;
}
link = wpt.link?.attributes?.href ?? '';
sym = wpt.sym ?? '';
longitude = parseFloat(wpt.getLongitude().toFixed(6));
latitude = parseFloat(wpt.getLatitude().toFixed(6));
});
} else {
untrack(() => {
name = '';
description = '';
link = '';
sym = '';
longitude = 0;
latitude = 0;
});
}
});
function createOrUpdateWaypoint() {
if (typeof latitude === 'string') {
@@ -49,7 +75,7 @@
latitude = parseFloat(latitude.toFixed(6));
longitude = parseFloat(longitude.toFixed(6));
dbUtils.addOrUpdateWaypoint(
fileActions.addOrUpdateWaypoint(
{
attributes: {
lat: latitude,
@@ -59,7 +85,7 @@
desc: description.length > 0 ? description : undefined,
cmt: description.length > 0 ? description : undefined,
link: link.length > 0 ? { attributes: { href: link } } : undefined,
sym: symbols[symbolKey]?.value ?? '',
sym: sym,
},
selectedWaypoint.wpt && selectedWaypoint.fileId
? new ListWaypointItem(selectedWaypoint.fileId, selectedWaypoint.wpt._data.index)
@@ -67,7 +93,6 @@
);
selectedWaypoint.reset();
resetWaypointData();
}
function setCoordinates(e: any) {
@@ -75,22 +100,18 @@
longitude = e.lngLat.lng.toFixed(6);
}
let sortedSymbols = $derived(
Object.entries(symbols).sort((a, b) => {
return i18n
._(`gpx.symbol.${a[0]}`)
.localeCompare(i18n._(`gpx.symbol.${b[0]}`), i18n.lang);
})
);
onMount(() => {
map.value?.on('click', setCoordinates);
// setCrosshairCursor();
if ($map) {
$map.on('click', setCoordinates);
mapCursor.notify(MapCursorState.TOOL_WITH_CROSSHAIR, true);
}
});
onDestroy(() => {
map.value?.off('click', setCoordinates);
// resetCursor();
if ($map) {
$map.off('click', setCoordinates);
mapCursor.notify(MapCursorState.TOOL_WITH_CROSSHAIR, false);
}
});
</script>
@@ -101,25 +122,25 @@
bind:value={name}
id="name"
class="font-semibold h-8"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
/>
<Label for="description">{i18n._('menu.metadata.description')}</Label>
<Textarea
bind:value={description}
id="description"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
/>
<Label for="symbol">{i18n._('toolbar.waypoint.icon')}</Label>
<Select.Root bind:value={symbolKey} type="single">
<Select.Root bind:value={sym} type="single">
<Select.Trigger
id="symbol"
class="w-full h-8"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
>
{#if symbolKey in symbols}
{#if symbolKey}
{i18n._(`gpx.symbol.${symbolKey}`)}
{:else}
{symbolKey}
{sym}
{/if}
</Select.Trigger>
<Select.Content class="max-h-60 overflow-y-scroll">
@@ -127,11 +148,8 @@
<Select.Item value={symbol.value}>
<span>
{#if symbol.icon}
<svelte:component
this={symbol.icon}
size="14"
class="inline-block align-sub mr-0.5"
/>
{@const Component = symbol.icon}
<Component size="14" class="inline-block align-sub mr-0.5" />
{:else}
<span class="w-4 inline-block"></span>
{/if}
@@ -146,7 +164,7 @@
bind:value={link}
id="link"
class="h-8"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
/>
<div class="flex flex-row gap-2">
<div class="grow">
@@ -159,7 +177,7 @@
min={-90}
max={90}
class="text-xs h-8"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
/>
</div>
<div class="grow">
@@ -172,7 +190,7 @@
min={-180}
max={180}
class="text-xs h-8"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
/>
</div>
</div>
@@ -180,11 +198,11 @@
<div class="flex flex-row gap-2 items-center">
<Button
variant="outline"
disabled={!canCreate && !selectedWaypoint.wpt}
disabled={!canCreate && !$selectedWaypoint}
class="grow whitespace-normal h-fit"
onclick={createOrUpdateWaypoint}
>
{#if selectedWaypoint.wpt}
{#if $selectedWaypoint}
<Save size="16" class="mr-1 shrink-0" />
{i18n._('menu.metadata.save')}
{:else}
@@ -192,18 +210,12 @@
{i18n._('toolbar.waypoint.create')}
{/if}
</Button>
<Button
variant="outline"
onclick={() => {
selectedWaypoint.reset();
resetWaypointData();
}}
>
<Button variant="outline" onclick={() => selectedWaypoint.reset()}>
<CircleX size="16" />
</Button>
</div>
<Help link={getURLForLanguage(i18n.lang, '/help/toolbar/poi')}>
{#if selectedWaypoint.wpt || canCreate}
{#if $selectedWaypoint || canCreate}
{i18n._('toolbar.waypoint.help')}
{:else}
{i18n._('toolbar.waypoint.help_no_selection')}