diff --git a/website/src/lib/components/file-list/FileListNodeLabel.svelte b/website/src/lib/components/file-list/FileListNodeLabel.svelte index cb4516f1..a84115d3 100644 --- a/website/src/lib/components/file-list/FileListNodeLabel.svelte +++ b/website/src/lib/components/file-list/FileListNodeLabel.svelte @@ -2,19 +2,28 @@ import { Button } from '$lib/components/ui/button'; import * as ContextMenu from '$lib/components/ui/context-menu'; import Shortcut from '$lib/components/Shortcut.svelte'; - import { dbUtils, fileObservers } from '$lib/db'; - import { Copy, MapPin, Trash2, Waypoints } from 'lucide-svelte'; - import { ListLevel, ListWaypointItem, type ListItem } from './FileList'; + import { dbUtils, fileObservers, settings } from '$lib/db'; + import { Copy, MapPin, Plus, Trash2, Waypoints } from 'lucide-svelte'; + import { + ListFileItem, + ListLevel, + ListTrackItem, + ListWaypointItem, + type ListItem + } from './FileList'; import { selectItem, selection } from './Selection'; import { _ } from 'svelte-i18n'; import { getContext } from 'svelte'; import { get } from 'svelte/store'; import { gpxLayers } from '$lib/stores'; + import { Track, TrackSegment } from 'gpx'; export let item: ListItem; export let label: string | undefined; let orientation = getContext<'vertical' | 'horizontal'>('orientation'); + + const { verticalFileView } = settings; @@ -77,6 +86,41 @@ + {#if $verticalFileView && $selection.size === 1} + {#if item instanceof ListFileItem} + + dbUtils.applyToFile( + item.getFileId(), + (file) => file.replaceTracks(file.trk.length, file.trk.length, [new Track()])[0] + )} + > + + {$_('menu.new_track')} + + + {:else if item instanceof ListTrackItem} + { + let trackIndex = item.getTrackIndex(); + dbUtils.applyToFile( + item.getFileId(), + (file) => + file.replaceTrackSegments( + trackIndex, + file.trk[trackIndex].trkseg.length, + file.trk[trackIndex].trkseg.length, + [new TrackSegment()] + )[0] + ); + }} + > + + {$_('menu.new_segment')} + + + {/if} + {/if} {#if item.level !== ListLevel.WAYPOINTS} diff --git a/website/src/lib/components/toolbar/tools/routing/RoutingControls.ts b/website/src/lib/components/toolbar/tools/routing/RoutingControls.ts index b8225be2..4945762a 100644 --- a/website/src/lib/components/toolbar/tools/routing/RoutingControls.ts +++ b/website/src/lib/components/toolbar/tools/routing/RoutingControls.ts @@ -9,7 +9,7 @@ import { toast } from "svelte-sonner"; import { _ } from "svelte-i18n"; import { dbUtils, type GPXFileWithStatistics } from "$lib/db"; import { selection } from "$lib/components/file-list/Selection"; -import { ListFileItem, ListTrackSegmentItem } from "$lib/components/file-list/FileList"; +import { ListFileItem, ListTrackItem, ListTrackSegmentItem } from "$lib/components/file-list/FileList"; import { currentTool, Tool } from "$lib/stores"; import { resetCursor, setCrosshairCursor, setGrabbingCursor } from "$lib/utils"; @@ -391,16 +391,25 @@ export class RoutingControls { if (!lastAnchor) { dbUtils.applyToFile(this.fileId, (file) => { + let item = get(selection).getSelected()[0]; + let trackIndex = file.trk.length > 0 ? file.trk.length - 1 : 0; + if (item instanceof ListTrackItem || item instanceof ListTrackSegmentItem) { + trackIndex = item.getTrackIndex(); + } + let segmentIndex = file.trk[trackIndex].trkseg.length > 0 ? file.trk[trackIndex].trkseg.length - 1 : 0; + if (item instanceof ListTrackSegmentItem) { + segmentIndex = item.getSegmentIndex(); + } if (file.trk.length === 0) { let track = new Track(); track = track.replaceTrackPoints(0, 0, 0, [newPoint]); return file.replaceTracks(0, 0, [track])[0]; - } else if (file.trk[0].trkseg.length === 0) { + } else if (file.trk[trackIndex].trkseg.length === 0) { let segment = new TrackSegment(); segment = segment.replaceTrackPoints(0, 0, [newPoint]); - return file.replaceTrackSegments(0, 0, 0, [segment])[0]; + return file.replaceTrackSegments(trackIndex, 0, 0, [segment])[0]; } else { - return file.replaceTrackPoints(0, 0, 0, 0, [newPoint]); + return file.replaceTrackPoints(trackIndex, segmentIndex, 0, 0, [newPoint]); } }); return; diff --git a/website/src/locales/en.json b/website/src/locales/en.json index d526075b..09781343 100644 --- a/website/src/locales/en.json +++ b/website/src/locales/en.json @@ -2,6 +2,8 @@ "menu": { "new": "New", "new_filename": "new", + "new_track": "New track", + "new_segment": "New segment", "load_desktop": "Load...", "load_drive": "Load from Google Drive...", "duplicate": "Duplicate",