mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-03-16 17:52:59 +00:00
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { ListWaypointItem } from '$lib/components/file-list/file-list';
|
|
import { fileStateCollection } from '$lib/logic/file-state';
|
|
import { selection } from '$lib/logic/selection';
|
|
import { settings } from '$lib/logic/settings';
|
|
import type { Waypoint } from 'gpx';
|
|
import { get, writable, type Writable } from 'svelte/store';
|
|
|
|
export class WaypointSelection {
|
|
private _selection: Writable<[Waypoint, string] | undefined>;
|
|
private _fileUnsubscribe: (() => void) | undefined;
|
|
|
|
constructor() {
|
|
this._selection = writable(undefined);
|
|
settings.treeFileView.subscribe(() => {
|
|
this.update();
|
|
});
|
|
selection.subscribe(() => {
|
|
this.update();
|
|
});
|
|
}
|
|
|
|
subscribe(
|
|
run: (value: [Waypoint, string] | undefined) => void,
|
|
invalidate?: (value?: [Waypoint, string] | undefined) => void
|
|
) {
|
|
return this._selection.subscribe(run, invalidate);
|
|
}
|
|
|
|
set(value: [Waypoint, string] | undefined) {
|
|
this._selection.set(value);
|
|
}
|
|
|
|
update() {
|
|
if (this._fileUnsubscribe) {
|
|
this._fileUnsubscribe();
|
|
this._fileUnsubscribe = undefined;
|
|
}
|
|
this._selection.update(() => {
|
|
if (get(settings.treeFileView) && get(selection).size === 1) {
|
|
let item = get(selection).getSelected()[0];
|
|
if (item instanceof ListWaypointItem) {
|
|
let fileState = fileStateCollection.getFileState(item.getFileId());
|
|
if (fileState) {
|
|
let first = true;
|
|
this._fileUnsubscribe = fileState.subscribe(() => {
|
|
if (first) first = false;
|
|
else this.update();
|
|
});
|
|
let waypoint = fileState.file?.wpt[item.getWaypointIndex()];
|
|
if (waypoint) {
|
|
return [waypoint, item.getFileId()];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
});
|
|
}
|
|
|
|
reset() {
|
|
this._selection.set(undefined);
|
|
}
|
|
|
|
get wpt(): Waypoint | undefined {
|
|
const selection = get(this._selection);
|
|
return selection ? selection[0] : undefined;
|
|
}
|
|
|
|
get fileId(): string | undefined {
|
|
const selection = get(this._selection);
|
|
return selection ? selection[1] : undefined;
|
|
}
|
|
}
|
|
|
|
export const selectedWaypoint = new WaypointSelection();
|