mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-11-04 13:31:13 +00:00
fix metadata and style dialogs
This commit is contained in:
@@ -4,12 +4,12 @@
|
|||||||
import { Textarea } from '$lib/components/ui/textarea';
|
import { Textarea } from '$lib/components/ui/textarea';
|
||||||
import { Label } from '$lib/components/ui/label/index.js';
|
import { Label } from '$lib/components/ui/label/index.js';
|
||||||
import * as Popover from '$lib/components/ui/popover';
|
import * as Popover from '$lib/components/ui/popover';
|
||||||
import { dbUtils } from '$lib/db';
|
|
||||||
import { Save } from '@lucide/svelte';
|
import { Save } from '@lucide/svelte';
|
||||||
import { ListFileItem, ListTrackItem, type ListItem } from '../file-list';
|
import { ListFileItem, ListTrackItem, type ListItem } from '../file-list';
|
||||||
import { GPXTreeElement, Track, type AnyGPXTreeElement, Waypoint, GPXFile } from 'gpx';
|
import { GPXTreeElement, Track, type AnyGPXTreeElement, Waypoint, GPXFile } from 'gpx';
|
||||||
import { i18n } from '$lib/i18n.svelte';
|
import { i18n } from '$lib/i18n.svelte';
|
||||||
import { editMetadata } from '$lib/components/file-list/metadata/utils.svelte';
|
import { editMetadata } from '$lib/components/file-list/metadata/utils.svelte';
|
||||||
|
import { fileActionManager } from '$lib/logic/file-action-manager';
|
||||||
|
|
||||||
let {
|
let {
|
||||||
node,
|
node,
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onclick={() => {
|
onclick={() => {
|
||||||
dbUtils.applyToFile(item.getFileId(), (file) => {
|
fileActionManager.applyToFile(item.getFileId(), (file) => {
|
||||||
if (item instanceof ListFileItem && node instanceof GPXFile) {
|
if (item instanceof ListFileItem && node instanceof GPXFile) {
|
||||||
file.metadata.name = name;
|
file.metadata.name = name;
|
||||||
file.metadata.desc = description;
|
file.metadata.desc = description;
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
import { Label } from '$lib/components/ui/label/index.js';
|
import { Label } from '$lib/components/ui/label/index.js';
|
||||||
import { Slider } from '$lib/components/ui/slider';
|
import { Slider } from '$lib/components/ui/slider';
|
||||||
import * as Popover from '$lib/components/ui/popover';
|
import * as Popover from '$lib/components/ui/popover';
|
||||||
import { dbUtils, getFile, settings } from '$lib/db';
|
|
||||||
import { Save } from '@lucide/svelte';
|
import { Save } from '@lucide/svelte';
|
||||||
import {
|
import {
|
||||||
ListFileItem,
|
ListFileItem,
|
||||||
@@ -12,10 +11,14 @@
|
|||||||
type ListItem,
|
type ListItem,
|
||||||
} from '$lib/components/file-list/file-list';
|
} from '$lib/components/file-list/file-list';
|
||||||
import { editStyle } from '$lib/components/file-list/style/utils.svelte';
|
import { editStyle } from '$lib/components/file-list/style/utils.svelte';
|
||||||
import { selection } from '../Selection';
|
|
||||||
import { gpxLayers } from '$lib/stores';
|
|
||||||
import { i18n } from '$lib/i18n.svelte';
|
import { i18n } from '$lib/i18n.svelte';
|
||||||
import type { LineStyleExtension } from 'gpx';
|
import type { LineStyleExtension } from 'gpx';
|
||||||
|
import { settings } from '$lib/logic/settings';
|
||||||
|
import { selection } from '$lib/logic/selection';
|
||||||
|
import { fileStateCollection } from '$lib/logic/file-state';
|
||||||
|
import { gpxLayers } from '$lib/components/map/gpx-layer/gpx-layers';
|
||||||
|
import { untrack } from 'svelte';
|
||||||
|
import { fileActions } from '$lib/logic/file-actions';
|
||||||
|
|
||||||
let {
|
let {
|
||||||
item,
|
item,
|
||||||
@@ -40,8 +43,8 @@
|
|||||||
|
|
||||||
$selection.forEach((item) => {
|
$selection.forEach((item) => {
|
||||||
if (item instanceof ListFileItem) {
|
if (item instanceof ListFileItem) {
|
||||||
let file = getFile(item.getFileId());
|
let file = fileStateCollection.getFile(item.getFileId());
|
||||||
let layer = gpxLayers.get(item.getFileId());
|
let layer = gpxLayers.getLayer(item.getFileId());
|
||||||
if (file && layer) {
|
if (file && layer) {
|
||||||
let style = file.getStyle();
|
let style = file.getStyle();
|
||||||
color = layer.layerColor;
|
color = layer.layerColor;
|
||||||
@@ -53,8 +56,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (item instanceof ListTrackItem) {
|
} else if (item instanceof ListTrackItem) {
|
||||||
let file = getFile(item.getFileId());
|
let file = fileStateCollection.getFile(item.getFileId());
|
||||||
let layer = gpxLayers.get(item.getFileId());
|
let layer = gpxLayers.getLayer(item.getFileId());
|
||||||
if (file && layer) {
|
if (file && layer) {
|
||||||
color = layer.layerColor;
|
color = layer.layerColor;
|
||||||
let track = file.trk[item.getTrackIndex()];
|
let track = file.trk[item.getTrackIndex()];
|
||||||
@@ -81,7 +84,7 @@
|
|||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
if ($selection && open) {
|
if ($selection && open) {
|
||||||
setStyleInputs();
|
untrack(() => setStyleInputs());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -102,9 +105,9 @@
|
|||||||
if (widthChanged) {
|
if (widthChanged) {
|
||||||
style['gpx_style:width'] = width;
|
style['gpx_style:width'] = width;
|
||||||
}
|
}
|
||||||
dbUtils.setStyleToSelection(style);
|
fileActions.setStyleToSelection(style);
|
||||||
|
|
||||||
if (item instanceof ListFileItem && $selection.size === gpxLayers.size) {
|
if (item instanceof ListFileItem && $selection.size === fileStateCollection.size) {
|
||||||
if (style['gpx_style:opacity']) {
|
if (style['gpx_style:opacity']) {
|
||||||
$defaultOpacity = style['gpx_style:opacity'];
|
$defaultOpacity = style['gpx_style:opacity'];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,10 @@ export class GPXLayerCollection {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getLayer(fileId: string): GPXLayer | undefined {
|
||||||
|
return this._layers.get(fileId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const gpxLayers = new GPXLayerCollection();
|
export const gpxLayers = new GPXLayerCollection();
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ export class FileActionManager {
|
|||||||
.filter((file) => file !== undefined) as GPXFile[];
|
.filter((file) => file !== undefined) as GPXFile[];
|
||||||
updatedFileIds = updatedFiles.map((file) => file._data.id);
|
updatedFileIds = updatedFiles.map((file) => file._data.id);
|
||||||
|
|
||||||
selection.update(updatedFiles, deletedFileIds);
|
selection.updateFiles(updatedFiles, deletedFileIds);
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return db.transaction('rw', db.fileids, db.files, async () => {
|
return db.transaction('rw', db.fileids, db.files, async () => {
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ export class Selection {
|
|||||||
return this._selection.subscribe(run, invalidate);
|
return this._selection.subscribe(run, invalidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update(updater: (value: SelectionTreeType) => SelectionTreeType) {
|
||||||
|
this._selection.update(updater);
|
||||||
|
}
|
||||||
|
|
||||||
selectItem(item: ListItem) {
|
selectItem(item: ListItem) {
|
||||||
this._selection.update(($selection) => {
|
this._selection.update(($selection) => {
|
||||||
$selection.clear();
|
$selection.clear();
|
||||||
@@ -119,7 +123,7 @@ export class Selection {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
update(updatedFiles: GPXFile[], deletedFileIds: string[]) {
|
updateFiles(updatedFiles: GPXFile[], deletedFileIds: string[]) {
|
||||||
let removedItems: ListItem[] = [];
|
let removedItems: ListItem[] = [];
|
||||||
applyToOrderedItemsFromFile(get(this._selection).getSelected(), (fileId, level, items) => {
|
applyToOrderedItemsFromFile(get(this._selection).getSelected(), (fileId, level, items) => {
|
||||||
let file = updatedFiles.find((file) => file._data.id === fileId);
|
let file = updatedFiles.find((file) => file._data.id === fileId);
|
||||||
|
|||||||
Reference in New Issue
Block a user