mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-09-01 08:12:32 +00:00
create new file
This commit is contained in:
@@ -14,7 +14,8 @@
|
||||
removeSelectedFiles,
|
||||
triggerFileInput,
|
||||
selectFiles,
|
||||
settings
|
||||
settings,
|
||||
createFile
|
||||
} from '$lib/stores';
|
||||
|
||||
import { mode, resetMode, setMode } from 'mode-watcher';
|
||||
@@ -51,7 +52,7 @@
|
||||
<Menubar.Menu>
|
||||
<Menubar.Trigger>{$_('menu.file')}</Menubar.Trigger>
|
||||
<Menubar.Content class="border-none">
|
||||
<Menubar.Item>
|
||||
<Menubar.Item on:click={createFile}>
|
||||
<Plus size="16" class="mr-1" />
|
||||
{$_('menu.new')}
|
||||
<Menubar.Shortcut>⌘N</Menubar.Shortcut>
|
||||
@@ -183,7 +184,10 @@
|
||||
<svelte:window
|
||||
on:keydown={(e) => {
|
||||
e.stopImmediatePropagation();
|
||||
if (e.key === 'o' && (e.metaKey || e.ctrlKey)) {
|
||||
if (e.key === 'n' && (e.metaKey || e.ctrlKey)) {
|
||||
createFile();
|
||||
e.preventDefault();
|
||||
} else if (e.key === 'o' && (e.metaKey || e.ctrlKey)) {
|
||||
triggerFileInput();
|
||||
e.preventDefault();
|
||||
} else if (e.key === 'd' && (e.metaKey || e.ctrlKey)) {
|
||||
|
@@ -339,6 +339,13 @@ export class RoutingControls {
|
||||
this.createMarker(newAnchor);
|
||||
segment._data.anchors.push(newAnchor);
|
||||
|
||||
if (!lastAnchor) {
|
||||
applyToFileElement(this.file, segment, (segment) => {
|
||||
segment.replace(0, 0, [newPoint]);
|
||||
}, true);
|
||||
return;
|
||||
}
|
||||
|
||||
let success = await this.routeBetweenAnchors([lastAnchor, newAnchor], [lastAnchor.point.getCoordinates(), newAnchor.point.getCoordinates()]);
|
||||
|
||||
if (!success) { // Route failed, remove the anchor
|
||||
|
@@ -25,6 +25,14 @@ export function computeAnchorPoints(segment: TrackSegment) {
|
||||
}
|
||||
|
||||
export function ramerDouglasPeucker(points: TrackPoint[], epsilon: number = 50, start: number = 0, end: number = points.length - 1): SimplifiedTrackPoint[] {
|
||||
if (points.length == 0) {
|
||||
return [];
|
||||
} else if (points.length == 1) {
|
||||
return [{
|
||||
point: points[0]
|
||||
}];
|
||||
}
|
||||
|
||||
let simplified = [{
|
||||
point: points[start]
|
||||
}];
|
||||
|
@@ -2,6 +2,8 @@ import { writable, get, type Writable } from 'svelte/store';
|
||||
|
||||
import mapboxgl from 'mapbox-gl';
|
||||
import { GPXFile, buildGPX, parseGPX, type AnyGPXTreeElement } from 'gpx';
|
||||
import { tick } from 'svelte';
|
||||
import { _ } from 'svelte-i18n';
|
||||
|
||||
export const map = writable<mapboxgl.Map | null>(null);
|
||||
export const files = writable<Writable<GPXFile>[]>([]);
|
||||
@@ -72,6 +74,15 @@ export function addFile(file: GPXFile): Writable<GPXFile> {
|
||||
return fileStore;
|
||||
}
|
||||
|
||||
export function createFile(): Writable<GPXFile> {
|
||||
let file = new GPXFile();
|
||||
file.metadata.name = get(_)("menu.new_filename");
|
||||
let fileStore = addFile(file);
|
||||
tick().then(() => get(selectFiles).select(file));
|
||||
currentTool.set(Tool.ROUTING);
|
||||
return fileStore;
|
||||
}
|
||||
|
||||
export function triggerFileInput() {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
|
@@ -2,6 +2,7 @@
|
||||
"menu": {
|
||||
"file": "File",
|
||||
"new": "New",
|
||||
"new_filename": "new",
|
||||
"load_desktop": "Load from desktop...",
|
||||
"load_drive": "Load from Google Drive...",
|
||||
"duplicate": "Duplicate",
|
||||
|
Reference in New Issue
Block a user