Files
gpx.studio/website/src/lib/logic/statistics-tree.ts

47 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-10-18 00:31:14 +02:00
import { ListItem, ListLevel } from '$lib/components/file-list/file-list';
import { GPXFile, GPXStatistics, GPXStatisticsGroup, type Track } from 'gpx';
2025-10-18 00:31:14 +02:00
export class GPXStatisticsTree {
level: ListLevel;
statistics: {
[key: string]: GPXStatisticsTree | GPXStatistics;
} = {};
constructor(element: GPXFile | Track) {
if (element instanceof GPXFile) {
this.level = ListLevel.FILE;
element.children.forEach((child, index) => {
this.statistics[index] = new GPXStatisticsTree(child);
});
} else {
this.level = ListLevel.TRACK;
element.children.forEach((child, index) => {
this.statistics[index] = child.getStatistics();
});
}
}
getStatisticsFor(item: ListItem): GPXStatisticsGroup {
let statistics = new GPXStatisticsGroup();
2025-10-18 00:31:14 +02:00
let id = item.getIdAtLevel(this.level);
if (id === undefined || id === 'waypoints') {
Object.keys(this.statistics).forEach((key) => {
if (this.statistics[key] instanceof GPXStatistics) {
statistics.add(this.statistics[key]);
2025-10-18 00:31:14 +02:00
} else {
statistics.add(this.statistics[key].getStatisticsFor(item));
2025-10-18 00:31:14 +02:00
}
});
} else {
let child = this.statistics[id];
if (child instanceof GPXStatistics) {
statistics.add(child);
2025-10-18 00:31:14 +02:00
} else if (child !== undefined) {
statistics.add(child.getStatisticsFor(item));
2025-10-18 00:31:14 +02:00
}
}
return statistics;
2025-10-18 00:31:14 +02:00
}
}
export type GPXFileWithStatistics = { file: GPXFile; statistics: GPXStatisticsTree };