move tracks, segments and waypoints within same list

This commit is contained in:
vcoppe
2024-06-03 19:34:23 +02:00
parent c9363de0ab
commit 245ba07141
3 changed files with 122 additions and 29 deletions

View File

@@ -185,6 +185,18 @@ export class GPXFile extends GPXTreeNode<Track>{
});
}
moveTracks(indices: number[], dest: number) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
let trk = og.trk.slice();
let tracks = indices.map((index) => trk[index]);
indices.sort((a, b) => b - a);
indices.forEach((index) => trk.splice(index, 1));
trk.splice(dest, 0, ...tracks);
draft.trk = freeze(trk); // Pre-freeze the array, faster as well
});
}
replaceTrackSegments(trackIndex: number, start: number, end: number, segments: TrackSegment[]) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
@@ -194,6 +206,15 @@ export class GPXFile extends GPXTreeNode<Track>{
});
}
moveTrackSegments(trackIndex: number, indices: number[], dest: number) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
let trk = og.trk.slice();
trk[trackIndex] = trk[trackIndex].moveTrackSegments(indices, dest);
draft.trk = freeze(trk); // Pre-freeze the array, faster as well
});
}
replaceTrackPoints(trackIndex: number, segmentIndex: number, start: number, end: number, points: TrackPoint[]) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
@@ -212,6 +233,18 @@ export class GPXFile extends GPXTreeNode<Track>{
});
}
moveWaypoints(indices: number[], dest: number) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
let wpt = og.wpt.slice();
let waypoints = indices.map((index) => wpt[index]);
indices.sort((a, b) => b - a);
indices.forEach((index) => wpt.splice(index, 1));
wpt.splice(dest, 0, ...waypoints);
draft.wpt = freeze(wpt); // Pre-freeze the array, faster as well
});
}
reverse() {
return this._reverse();
}
@@ -326,6 +359,18 @@ export class Track extends GPXTreeNode<TrackSegment> {
});
}
moveTrackSegments(indices: number[], dest: number) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster
let trkseg = og.trkseg.slice();
let segments = indices.map((index) => trkseg[index]);
indices.sort((a, b) => b - a);
indices.forEach((index) => trkseg.splice(index, 1));
trkseg.splice(dest, 0, ...segments);
draft.trkseg = freeze(trkseg); // Pre-freeze the array, faster as well
});
}
replaceTrackPoints(segmentIndex: number, start: number, end: number, points: TrackPoint[]) {
return produce(this, (draft) => {
let og = getOriginal(draft); // Read as much as possible from the original object because it is faster