This commit is contained in:
vcoppe
2024-05-24 22:53:30 +02:00
parent fb21347e63
commit 980bd8b79a
5 changed files with 29 additions and 27 deletions

View File

@@ -110,8 +110,8 @@ export class GPXFiles extends GPXTreeNode<GPXFile> {
export class GPXFile extends GPXTreeNode<Track>{
[immerable] = true;
readonly attributes: GPXFileAttributes;
readonly metadata: Metadata;
attributes: GPXFileAttributes;
metadata: Metadata;
readonly wpt: ReadonlyArray<Readonly<Waypoint>>;
readonly trk: ReadonlyArray<Track>;

View File

@@ -95,7 +95,7 @@
<div class="absolute top-2 left-0 right-0 z-20 flex flex-row justify-center pointer-events-none">
<div
class="w-fit flex flex-row flex-wrap mx-16 items-center justify-center p-1 bg-background rounded-md pointer-events-auto shadow-md"
class="w-fit flex flex-row mx-16 items-center justify-center p-1 bg-background rounded-md pointer-events-auto shadow-md"
>
<Logo class="h-5 mt-0.5 mx-2" />
<Menubar.Root class="border-none h-fit p-0">
@@ -104,8 +104,8 @@
<Menubar.Content class="border-none">
<Menubar.Item on:click={createFile}>
<Plus size="16" class="mr-1" />
{$_('menu.new')}
<Shortcut key="N" ctrl={true} />
{$_('menu.create')}
<Shortcut key="C" ctrl={true} />
</Menubar.Item>
<Menubar.Separator />
<Menubar.Item on:click={triggerFileInput}>
@@ -295,7 +295,7 @@
<svelte:window
on:keydown={(e) => {
if (e.key === 'n' && (e.metaKey || e.ctrlKey)) {
if (e.key === 'c' && (e.metaKey || e.ctrlKey)) {
createFile();
e.preventDefault();
} else if (e.key === 'o' && (e.metaKey || e.ctrlKey)) {

View File

@@ -66,30 +66,34 @@ export function selectAll() {
});
}
export function applyToOrderedSelectedItemsFromFile(callback: (fileId: string, level: ListLevel | undefined, items: ListItem[]) => void) {
export function applyToOrderedSelectedItemsFromFile(callback: (fileId: string, level: ListLevel | undefined, items: ListItem[]) => void, reverse: boolean = true) {
get(settings.fileOrder).forEach((fileId) => {
let level: ListLevel | undefined = undefined;
let items: ListItem[] = [];
get(selection).forEach((item) => {
if (item.getFileId() === fileId) {
level = item.level;
if (item instanceof ListTrackItem || item instanceof ListTrackSegmentItem || item instanceof ListWaypointItem) {
if (item instanceof ListFileItem || item instanceof ListTrackItem || item instanceof ListTrackSegmentItem || item instanceof ListWaypointItem) {
items.push(item);
}
}
});
items.sort((a, b) => { // Process the items in reverse order to avoid index conflicts
if (a instanceof ListTrackItem && b instanceof ListTrackItem) {
return b.getTrackIndex() - a.getTrackIndex();
} else if (a instanceof ListTrackSegmentItem && b instanceof ListTrackSegmentItem) {
return b.getSegmentIndex() - a.getSegmentIndex();
} else if (a instanceof ListWaypointItem && b instanceof ListWaypointItem) {
return b.getWaypointIndex() - a.getWaypointIndex();
if (items.length > 0) {
if (reverse) {
items.sort((a, b) => { // Process the items in reverse order to avoid index conflicts
if (a instanceof ListTrackItem && b instanceof ListTrackItem) {
return b.getTrackIndex() - a.getTrackIndex();
} else if (a instanceof ListTrackSegmentItem && b instanceof ListTrackSegmentItem) {
return b.getSegmentIndex() - a.getSegmentIndex();
} else if (a instanceof ListWaypointItem && b instanceof ListWaypointItem) {
return b.getWaypointIndex() - a.getWaypointIndex();
}
return b.level - a.level;
});
}
return b.level - a.level;
});
callback(fileId, level, items);
callback(fileId, level, items);
}
});
}

View File

@@ -5,8 +5,8 @@ import { GPXFile, buildGPX, parseGPX, GPXStatistics, type Coordinates } from 'gp
import { tick } from 'svelte';
import { _ } from 'svelte-i18n';
import type { GPXLayer } from '$lib/components/gpx-layer/GPXLayer';
import { settings, dbUtils, fileObservers } from './db';
import { selectFile, selection } from '$lib/components/file-list/Selection';
import { dbUtils, fileObservers } from './db';
import { applyToOrderedSelectedItemsFromFile, selectFile, selection } from '$lib/components/file-list/Selection';
import { ListFileItem, ListWaypointItem } from '$lib/components/file-list/FileList';
import type { RoutingControls } from '$lib/components/toolbar/tools/routing/RoutingControls';
@@ -15,17 +15,15 @@ export const selectFiles = writable<{ [key: string]: (fileId?: string) => void }
export const gpxStatistics: Writable<GPXStatistics> = writable(new GPXStatistics());
const { fileOrder } = settings;
function updateGPXData() {
let statistics = new GPXStatistics();
get(fileOrder).forEach((fileId) => { // Get statistics in the order of the file list
applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
let fileStore = get(fileObservers).get(fileId);
if (fileStore) {
let stats = get(fileStore)?.statistics;
if (stats !== undefined) {
if (stats) {
let first = true;
get(selection).getChild(fileId)?.getSelected().forEach((item) => { // Get statistics for selected items within the file
items.forEach((item) => {
if (!(item instanceof ListWaypointItem) || first) {
statistics.mergeWith(stats.getStatisticsFor(item));
first = false;
@@ -33,7 +31,7 @@ function updateGPXData() {
});
}
}
});
}, false);
gpxStatistics.set(statistics);
}

View File

@@ -1,7 +1,7 @@
{
"menu": {
"file": "File",
"new": "New",
"create": "Create",
"new_filename": "new",
"load_desktop": "Load from desktop...",
"load_drive": "Load from Google Drive...",