diff --git a/gpx/src/gpx.ts b/gpx/src/gpx.ts index 6884ab82..3643d455 100644 --- a/gpx/src/gpx.ts +++ b/gpx/src/gpx.ts @@ -23,7 +23,7 @@ export abstract class GPXTreeElement> { abstract toGeoJSON(): GeoJSON.Feature | GeoJSON.Feature[] | GeoJSON.FeatureCollection | GeoJSON.FeatureCollection[]; // Producers - abstract replace(segment: number, start: number, end: number, points: TrackPoint[]); + abstract replaceTrackPoints(segment: number, start: number, end: number, points: TrackPoint[]); abstract reverse(originalNextTimestamp?: Date, newPreviousTimestamp?: Date); } @@ -56,14 +56,14 @@ abstract class GPXTreeNode> extends GPXTreeElement } // Producers - replace(segment: number, start: number, end: number, points: TrackPoint[]) { + replaceTrackPoints(segment: number, start: number, end: number, points: TrackPoint[]) { return produce(this, (draft: Draft>) => { let og = getOriginal(draft); let cumul = 0; for (let i = 0; i < og.children.length; i++) { let childSegments = og.children[i].getSegments(); if (segment < cumul + childSegments.length) { - draft.children[i] = draft.children[i].replace(segment - cumul, start, end, points); + draft.children[i] = draft.children[i].replaceTrackPoints(segment - cumul, start, end, points); break; } cumul += childSegments.length; @@ -178,6 +178,34 @@ export class GPXFile extends GPXTreeNode{ trk: this.trk.map((track) => track.toTrackType()) }; } + + // Producers + replaceTracks(start: number, end: number, tracks: Track[]) { + return produce(this, (draft) => { + let og = getOriginal(draft); // Read as much as possible from the original object because it is faster + let trk = og.trk.slice(); + trk.splice(start, end - start + 1, ...tracks); + draft.trk = freeze(trk); // Pre-freeze the array, faster as well + }); + } + + replaceTrackSegments(trackIndex: number, start: number, end: number, segments: TrackSegment[]) { + return produce(this, (draft) => { + let og = getOriginal(draft); // Read as much as possible from the original object because it is faster + let trk = og.trk.slice(); + trk[trackIndex] = trk[trackIndex].replaceTrackSegments(start, end, segments); + draft.trk = freeze(trk); // Pre-freeze the array, faster as well + }); + } + + replaceWaypoints(start: number, end: number, waypoints: Waypoint[]) { + return produce(this, (draft) => { + let og = getOriginal(draft); // Read as much as possible from the original object because it is faster + let wpt = og.wpt.slice(); + wpt.splice(start, end - start + 1, ...waypoints); + draft.wpt = freeze(wpt); // Pre-freeze the array, faster as well + }); + } }; // A class that represents a Track in a GPX file @@ -260,6 +288,16 @@ export class Track extends GPXTreeNode { extensions: this.extensions, }; } + + // Producers + replaceTrackSegments(start: number, end: number, segments: TrackSegment[]) { + return produce(this, (draft) => { + let og = getOriginal(draft); // Read as much as possible from the original object because it is faster + let trkseg = og.trkseg.slice(); + trkseg.splice(start, end - start + 1, ...segments); + draft.trkseg = freeze(trkseg); // Pre-freeze the array, faster as well + }); + } }; // A class that represents a TrackSegment in a GPX file @@ -410,7 +448,7 @@ export class TrackSegment extends GPXTreeLeaf { } // Producers - replace(segment: number, start: number, end: number, points: TrackPoint[]) { + replaceTrackPoints(segment: number, start: number, end: number, points: TrackPoint[]) { return produce(this, (draft) => { let og = getOriginal(draft); // Read as much as possible from the original object because it is faster let trkpt = og.trkpt.slice(); diff --git a/website/src/lib/components/file-list/FileList.ts b/website/src/lib/components/file-list/FileList.ts index 60643997..a5dd30ac 100644 --- a/website/src/lib/components/file-list/FileList.ts +++ b/website/src/lib/components/file-list/FileList.ts @@ -189,12 +189,16 @@ export class ListTrackItem extends ListItem { return this.fileId; } - extend(id: number): ListSegmentItem { - return new ListSegmentItem(this.fileId, this.trackIndex, id); + getTrackIndex(): number { + return this.trackIndex; + } + + extend(id: number): ListTrackSegmentItem { + return new ListTrackSegmentItem(this.fileId, this.trackIndex, id); } } -export class ListSegmentItem extends ListItem { +export class ListTrackSegmentItem extends ListItem { fileId: string; trackIndex: number; segmentIndex: number; @@ -227,7 +231,15 @@ export class ListSegmentItem extends ListItem { return this.fileId; } - extend(): ListSegmentItem { + getTrackIndex(): number { + return this.trackIndex; + } + + getSegmentIndex(): number { + return this.segmentIndex; + } + + extend(): ListTrackSegmentItem { return this; } } @@ -295,6 +307,10 @@ export class ListWaypointItem extends ListItem { return this.fileId; } + getWaypointIndex(): number { + return this.waypointIndex; + } + extend(): ListWaypointItem { return this; } diff --git a/website/src/lib/components/file-list/FileListNodeLabel.svelte b/website/src/lib/components/file-list/FileListNodeLabel.svelte index c7124d84..b761776e 100644 --- a/website/src/lib/components/file-list/FileListNodeLabel.svelte +++ b/website/src/lib/components/file-list/FileListNodeLabel.svelte @@ -5,9 +5,10 @@ import { dbUtils } from '$lib/db'; import { Copy, Trash2 } from 'lucide-svelte'; import { type ListItem } from './FileList'; - import { selection } from './Selection'; + import { selectItem, selection } from './Selection'; import { _ } from 'svelte-i18n'; import { getContext } from 'svelte'; + import { get } from 'svelte/store'; export let item: ListItem; export let label: string | undefined; @@ -17,7 +18,13 @@ - + { + if (open && !get(selection).has(item)) { + selectItem(item); + } + }} +>