This commit is contained in:
vcoppe
2026-10-04 08:21:39 +02:00
parent f1904bc12f
commit 74b674e8e8
4 changed files with 227 additions and 25 deletions
@@ -1,9 +1,9 @@
use std::{
collections::{HashMap, HashSet, hash_map::Entry},
rc::Rc,
};
use std::collections::{HashMap, HashSet, hash_map::Entry};
use crate::{File, Selection, StackEntry, Statistics, Track, TrackSegment, TrackSegmentRevisionId};
use crate::{
File, GlobalStatistics, Selection, StackEntry, Statistics, Track, TrackSegment,
TrackSegmentRevisionId,
};
#[derive(Debug, Default)]
pub struct StatisticsCache {
@@ -95,7 +95,18 @@ impl StatisticsCache {
stats
}
fn add_file_stats<'a>(&'a self, file: &Rc<File>, stats: &mut Vec<&'a Statistics>) {
/// Global statistics of a file: its segments merged, in order.
pub fn file_global(&self, file: &File) -> GlobalStatistics {
let mut stats = vec![];
self.add_file_stats(file, &mut stats);
let mut global = GlobalStatistics::default();
for s in stats {
global.merge(&s.global);
}
global
}
fn add_file_stats<'a>(&'a self, file: &File, stats: &mut Vec<&'a Statistics>) {
for trk in file.trk.iter() {
self.add_track_stats(trk, stats);
}
@@ -116,7 +127,7 @@ impl StatisticsCache {
#[cfg(test)]
mod tests {
use std::collections::HashSet;
use std::{collections::HashSet, rc::Rc};
use crate::{FileId, parse};
+7 -1
View File
@@ -2,7 +2,7 @@
use crate::{
Action, Apply, Command, CoordinatesCache, Diff, FileId, FileOrder, FileStructure,
FileStructureCache, Selection, Stack, State, StatisticsBuffer, StatisticsCache, TrackSegmentId,
FileStructureCache, GlobalStatistics, Selection, Stack, State, StatisticsBuffer, StatisticsCache, TrackSegmentId,
};
#[derive(Debug, Default)]
@@ -34,6 +34,12 @@ impl Engine {
self.structure_cache.get(id)
}
/// Global statistics (distance, time, elevation, bounds...) of a file.
pub fn file_statistics(&self, id: &FileId) -> Option<GlobalStatistics> {
let file = self.stack.current()?.get(id)?;
Some(self.statistics_cache.file_global(file))
}
/// Which files the last action added, removed or modified.
pub fn last_diff(&self) -> Option<&Diff> {
self.diff.as_ref()