This commit is contained in:
vcoppe
2024-06-05 23:37:55 +02:00
parent fa3099c4b0
commit 316012cfe4
7 changed files with 25 additions and 21 deletions

View File

@@ -221,7 +221,7 @@ export class GPXFile extends GPXTreeNode<Track>{
} }
reverse() { reverse() {
return this._reverse(); return this._reverse(this.getEndTimestamp(), this.getStartTimestamp());
} }
reverseTrack(trackIndex: number) { reverseTrack(trackIndex: number) {
@@ -349,7 +349,7 @@ export class Track extends GPXTreeNode<TrackSegment> {
return produce(this, (draft) => { return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
let trkseg = og.trkseg.slice(); let trkseg = og.trkseg.slice();
trkseg[segmentIndex] = trkseg[segmentIndex]._reverse(); trkseg[segmentIndex] = trkseg[segmentIndex]._reverse(trkseg[segmentIndex].getEndTimestamp(), trkseg[segmentIndex].getStartTimestamp());
draft.trkseg = freeze(trkseg); // Pre-freeze the array, faster as well draft.trkseg = freeze(trkseg); // Pre-freeze the array, faster as well
}); });
} }

View File

@@ -2,7 +2,7 @@
import * as Collapsible from '$lib/components/ui/collapsible'; import * as Collapsible from '$lib/components/ui/collapsible';
import { Button } from '$lib/components/ui/button'; import { Button } from '$lib/components/ui/button';
import { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-svelte'; import { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-svelte';
import { getContext, setContext } from 'svelte'; import { getContext, onMount, setContext } from 'svelte';
import { get, type Writable } from 'svelte/store'; import { get, type Writable } from 'svelte/store';
export let id: string | number; export let id: string | number;
@@ -18,15 +18,16 @@
let fullId = `${parentId}.${id}`; let fullId = `${parentId}.${id}`;
setContext('collapsible-tree-parent-id', fullId); setContext('collapsible-tree-parent-id', fullId);
open.update((value) => { onMount(() => {
if (!value.hasOwnProperty(fullId)) { if (!get(open).hasOwnProperty(fullId)) {
value[fullId] = defaultState === 'open'; open.update((value) => {
value[fullId] = defaultState === 'open';
return value;
});
} }
return value;
}); });
export function openNode() { export function openNode() {
if (get(open)[fullId]) return;
open.update((value) => { open.update((value) => {
value[fullId] = true; value[fullId] = true;
return value; return value;

View File

@@ -9,13 +9,15 @@
}; };
let dragging: Writable<ListLevel | null> = writable(null); let dragging: Writable<ListLevel | null> = writable(null);
let updating = false;
</script> </script>
<script lang="ts"> <script lang="ts">
import { GPXFile, Track, Waypoint, type AnyGPXTreeElement, type GPXTreeElement } from 'gpx'; import { GPXFile, Track, Waypoint, type AnyGPXTreeElement, type GPXTreeElement } from 'gpx';
import { afterUpdate, getContext, onMount } from 'svelte'; import { afterUpdate, getContext, onMount } from 'svelte';
import Sortable from 'sortablejs/Sortable'; import Sortable from 'sortablejs/Sortable';
import { fileObservers, getFileIds, settings, type GPXFileWithStatistics } from '$lib/db'; import { getFileIds, settings, type GPXFileWithStatistics } from '$lib/db';
import { get, writable, type Readable, type Writable } from 'svelte/store'; import { get, writable, type Readable, type Writable } from 'svelte/store';
import FileListNodeStore from './FileListNodeStore.svelte'; import FileListNodeStore from './FileListNodeStore.svelte';
import FileListNode from './FileListNode.svelte'; import FileListNode from './FileListNode.svelte';
@@ -46,6 +48,8 @@
let orientation = getContext<'vertical' | 'horizontal'>('orientation'); let orientation = getContext<'vertical' | 'horizontal'>('orientation');
function updateToSelection() { function updateToSelection() {
if (updating) return;
updating = true;
// Sortable updates selection // Sortable updates selection
let changed = getChangedIds(); let changed = getChangedIds();
if (changed.length > 0) { if (changed.length > 0) {
@@ -60,9 +64,12 @@
return $selection; return $selection;
}); });
} }
updating = false;
} }
async function updateFromSelection() { function updateFromSelection() {
if (updating) return;
updating = true;
// Selection updates sortable // Selection updates sortable
let changed = getChangedIds(); let changed = getChangedIds();
for (let id of changed) { for (let id of changed) {
@@ -79,6 +86,7 @@
} }
} }
} }
updating = false;
} }
$: if ($selection) { $: if ($selection) {
@@ -198,10 +206,8 @@
}); });
} }
let firstUpdateAfterMount = false;
onMount(() => { onMount(() => {
createSortable(); createSortable();
firstUpdateAfterMount = true;
}); });
afterUpdate(() => { afterUpdate(() => {
@@ -220,10 +226,7 @@
}); });
syncFileOrder(); syncFileOrder();
if (firstUpdateAfterMount) { updateFromSelection();
firstUpdateAfterMount = false;
updateFromSelection();
}
}); });
function getChangedIds() { function getChangedIds() {

View File

@@ -272,7 +272,7 @@ export class GPXLayer {
} }
let item = undefined; let item = undefined;
if (get(verticalFileView) && file.children.length > 1) { // Select inner item if (get(verticalFileView) && file.getSegments().length > 1) { // Select inner item
let trackIndex = e.features[0].properties.trackIndex; let trackIndex = e.features[0].properties.trackIndex;
let segmentIndex = e.features[0].properties.segmentIndex; let segmentIndex = e.features[0].properties.segmentIndex;
item = file.children[trackIndex].children.length > 1 ? new ListTrackSegmentItem(this.fileId, trackIndex, segmentIndex) : new ListTrackItem(this.fileId, trackIndex); item = file.children[trackIndex].children.length > 1 ? new ListTrackSegmentItem(this.fileId, trackIndex, segmentIndex) : new ListTrackItem(this.fileId, trackIndex);

View File

@@ -63,7 +63,7 @@ async function getRoute(points: Coordinates[], brouterProfile: string, privateRo
const latIdx = messages[0].indexOf("Latitude"); const latIdx = messages[0].indexOf("Latitude");
const tagIdx = messages[0].indexOf("WayTags"); const tagIdx = messages[0].indexOf("WayTags");
let messageIdx = 1; let messageIdx = 1;
let surface = getSurface(messages[messageIdx][tagIdx]); let surface = messageIdx < messages.length ? getSurface(messages[messageIdx][tagIdx]) : "unknown";
for (let i = 0; i < coordinates.length; i++) { for (let i = 0; i < coordinates.length; i++) {
let coord = coordinates[i]; let coord = coordinates[i];

View File

@@ -402,7 +402,7 @@ export class RoutingControls {
dbUtils.applyToFile(this.fileId, (file) => { dbUtils.applyToFile(this.fileId, (file) => {
let segment = original(file).getSegment(lastAnchor.trackIndex, lastAnchor.segmentIndex); let segment = original(file).getSegment(lastAnchor.trackIndex, lastAnchor.segmentIndex);
let newSegment = segment.clone(); let newSegment = segment.clone();
newSegment = newSegment.reverse(segment.getEndTimestamp(), segment.getEndTimestamp()); newSegment = newSegment._reverse(segment.getEndTimestamp(), segment.getEndTimestamp());
return file.replaceTrackPoints(lastAnchor.trackIndex, lastAnchor.segmentIndex, segment.trkpt.length, segment.trkpt.length, newSegment.trkpt.map((point) => point)); return file.replaceTrackPoints(lastAnchor.trackIndex, lastAnchor.segmentIndex, segment.trkpt.length, segment.trkpt.length, newSegment.trkpt.map((point) => point));
}); });
} }

View File

@@ -7,7 +7,7 @@ import { _ } from 'svelte-i18n';
import type { GPXLayer } from '$lib/components/gpx-layer/GPXLayer'; import type { GPXLayer } from '$lib/components/gpx-layer/GPXLayer';
import { dbUtils, fileObservers } from './db'; import { dbUtils, fileObservers } from './db';
import { applyToOrderedSelectedItemsFromFile, selectFile, selection } from '$lib/components/file-list/Selection'; import { applyToOrderedSelectedItemsFromFile, selectFile, selection } from '$lib/components/file-list/Selection';
import { ListFileItem, ListWaypointItem } from '$lib/components/file-list/FileList'; import { ListFileItem, ListWaypointItem, ListWaypointsItem } from '$lib/components/file-list/FileList';
import type { RoutingControls } from '$lib/components/toolbar/tools/routing/RoutingControls'; import type { RoutingControls } from '$lib/components/toolbar/tools/routing/RoutingControls';
export const map = writable<mapboxgl.Map | null>(null); export const map = writable<mapboxgl.Map | null>(null);
@@ -24,7 +24,7 @@ function updateGPXData() {
if (stats) { if (stats) {
let first = true; let first = true;
items.forEach((item) => { items.forEach((item) => {
if (!(item instanceof ListWaypointItem) || first) { if (!(item instanceof ListWaypointItem || item instanceof ListWaypointsItem) || first) {
statistics.mergeWith(stats.getStatisticsFor(item)); statistics.mergeWith(stats.getStatisticsFor(item));
first = false; first = false;
} }