mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-09-02 16:52:31 +00:00
rework stores
This commit is contained in:
@@ -230,10 +230,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
$: if (chart && $settings) {
|
$: if (chart && $settings) {
|
||||||
let gpxFiles = new GPXFiles(Array.from($selectedFiles));
|
let gpxFiles = new GPXFiles(get(fileOrder).filter((f) => $selectedFiles.has(f)));
|
||||||
gpxFiles.files.sort(function (a, b) {
|
|
||||||
return get(fileOrder).indexOf(a) - get(fileOrder).indexOf(b);
|
|
||||||
});
|
|
||||||
|
|
||||||
// update data
|
// update data
|
||||||
let trackPointsAndStatistics = gpxFiles.getTrackPointsAndStatistics();
|
let trackPointsAndStatistics = gpxFiles.getTrackPointsAndStatistics();
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
import type { GPXFile } from 'gpx';
|
import type { GPXFile } from 'gpx';
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { afterUpdate, onMount } from 'svelte';
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
|
||||||
let tabs: HTMLDivElement;
|
let tabs: HTMLDivElement;
|
||||||
@@ -44,6 +44,21 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateFileOrder() {
|
||||||
|
let newFileOrder = sortable.toArray().map((index: string) => get(get(files)[parseInt(index)]));
|
||||||
|
if (newFileOrder.length !== get(fileOrder).length) {
|
||||||
|
fileOrder.set(newFileOrder);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < newFileOrder.length; i++) {
|
||||||
|
if (newFileOrder[i] !== get(fileOrder)[i]) {
|
||||||
|
fileOrder.set(newFileOrder);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
sortable = Sortable.create(tabs, {
|
sortable = Sortable.create(tabs, {
|
||||||
forceAutoScrollFallback: true,
|
forceAutoScrollFallback: true,
|
||||||
@@ -69,7 +84,7 @@
|
|||||||
deselectFile(get($files[index]));
|
deselectFile(get($files[index]));
|
||||||
},
|
},
|
||||||
onSort: () => {
|
onSort: () => {
|
||||||
$fileOrder = sortable.toArray().map((index: string) => $files[parseInt(index)]);
|
updateFileOrder();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -104,6 +119,8 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterUpdate(updateFileOrder);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="h-10 -translate-y-10 w-full pointer-events-none">
|
<div class="h-10 -translate-y-10 w-full pointer-events-none">
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
import * as Alert from '$lib/components/ui/alert';
|
import * as Alert from '$lib/components/ui/alert';
|
||||||
import { CircleHelp } from 'lucide-svelte';
|
import { CircleHelp } from 'lucide-svelte';
|
||||||
|
|
||||||
import { map, selectedFiles, getFileStore, applyToFile } from '$lib/stores';
|
import { map, selectedFiles, applyToFile } from '$lib/stores';
|
||||||
import { AnchorPointHierarchy, getMarker, route } from './routing';
|
import { AnchorPointHierarchy, getMarker, route } from './routing';
|
||||||
import { onDestroy } from 'svelte';
|
import { onDestroy } from 'svelte';
|
||||||
import mapboxgl from 'mapbox-gl';
|
import mapboxgl from 'mapbox-gl';
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
privateRoads,
|
privateRoads,
|
||||||
routing
|
routing
|
||||||
);
|
);
|
||||||
applyToFile(file, (f) => f.append(response));
|
applyToFile(file, (f) => f.append(response), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,10 +116,17 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
$: if ($selectedFiles.size == 1 && $map) {
|
$: if ($selectedFiles.size == 1 && $map) {
|
||||||
|
let selectedFile = $selectedFiles.values().next().value;
|
||||||
|
|
||||||
|
if (selectedFile !== file) {
|
||||||
clean();
|
clean();
|
||||||
|
file = selectedFile;
|
||||||
|
} else {
|
||||||
|
// update markers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file = $selectedFiles.values().next().value;
|
$: if ($map && file) {
|
||||||
|
|
||||||
// record time
|
// record time
|
||||||
let start = performance.now();
|
let start = performance.now();
|
||||||
anchorPointHierarchy = AnchorPointHierarchy.create(file);
|
anchorPointHierarchy = AnchorPointHierarchy.create(file);
|
||||||
|
@@ -22,14 +22,27 @@ export function getFileIndex(file: GPXFile): number {
|
|||||||
return get(files).findIndex(store => get(store) === file);
|
return get(files).findIndex(store => get(store) === file);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function applyToFile(file: GPXFile, callback: (file: GPXFile) => void) {
|
export function applyToFile(file: GPXFile, callback: (file: GPXFile) => void, updateSelected: boolean) {
|
||||||
let store = getFileStore(file);
|
let store = getFileStore(file);
|
||||||
store.update($file => {
|
store.update($file => {
|
||||||
callback($file)
|
callback($file)
|
||||||
return $file;
|
return $file;
|
||||||
});
|
});
|
||||||
|
if (updateSelected) {
|
||||||
selectedFiles.update($selected => $selected);
|
selectedFiles.update($selected => $selected);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyToSelectedFiles(callback: (file: GPXFile) => void, updateSelected: boolean) {
|
||||||
|
get(fileOrder).forEach(file => {
|
||||||
|
if (get(selectedFiles).has(file)) {
|
||||||
|
applyToFile(file, callback, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (updateSelected) {
|
||||||
|
selectedFiles.update($selected => $selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function addFile(file: GPXFile): Writable<GPXFile> {
|
export function addFile(file: GPXFile): Writable<GPXFile> {
|
||||||
let fileStore = writable(file);
|
let fileStore = writable(file);
|
||||||
@@ -84,14 +97,10 @@ export async function loadFile(file: File) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function duplicateSelectedFiles() {
|
export function duplicateSelectedFiles() {
|
||||||
let selected: GPXFile[] = [];
|
applyToSelectedFiles(file => {
|
||||||
get(selectedFiles).forEach(file => selected.push(file));
|
|
||||||
selected.forEach(file => duplicateFile(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function duplicateFile(file: GPXFile) {
|
|
||||||
let clone = file.clone();
|
let clone = file.clone();
|
||||||
addFile(clone);
|
addFile(clone);
|
||||||
|
}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function removeSelectedFiles() {
|
export function removeSelectedFiles() {
|
||||||
@@ -145,5 +154,8 @@ export function exportFile(file: GPXFile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function reverseSelectedFiles() {
|
export function reverseSelectedFiles() {
|
||||||
get(selectedFiles).forEach(file => applyToFile(file, file => file.reverse()));
|
selectedFiles.update($selected => {
|
||||||
|
$selected.forEach(file => applyToFile(file, file => file.reverse(), false));
|
||||||
|
return $selected;
|
||||||
|
});
|
||||||
}
|
}
|
Reference in New Issue
Block a user