This commit is contained in:
vcoppe
2026-10-04 08:53:00 +02:00
parent 86aba8f4b1
commit 9ac2a2b69c
6 changed files with 141 additions and 19 deletions
+2 -2
View File
@@ -291,7 +291,7 @@ pub fn parse(data: &[u8]) -> Result<File, Error> {
Some(GPXElement::Color) => {
stack.pop();
if let Some(GPXElement::Track(trk)) = stack.last_mut() {
trk.info.color = Some(format!("#{}", &*e));
trk.info.color = Some(e.to_string());
}
}
Some(GPXElement::Opacity) => {
@@ -572,7 +572,7 @@ mod tests {
assert_eq!(gpx.trk.len(), 1);
let trk = &gpx.trk[0];
assert_eq!(trk.trkseg.len(), 1);
assert!(trk.info.color.as_ref().is_some_and(|c| c == "#2d3ee9"));
assert!(trk.info.color.as_ref().is_some_and(|c| c == "2d3ee9"));
assert!(trk.info.opacity.is_some_and(|o| o == 0.5));
assert!(trk.info.width.is_some_and(|w| w == 6.0));
}
@@ -22,6 +22,10 @@ pub struct FileStructure {
pub struct TrackNode {
pub id: TrackId,
pub name: Option<String>,
/// Style of the track, only when the file defines it.
pub color: Option<String>,
pub opacity: Option<f64>,
pub width: Option<f64>,
pub segments: Vec<SegmentNode>,
}
@@ -37,6 +41,7 @@ pub struct SegmentNode {
pub struct WaypointNode {
pub id: WaypointId,
pub name: Option<String>,
pub sym: Option<String>,
}
impl FileStructure {
@@ -50,6 +55,9 @@ impl FileStructure {
.map(|trk| TrackNode {
id: trk.id,
name: trk.info.name.clone(),
color: trk.info.color.clone(),
opacity: trk.info.opacity,
width: trk.info.width,
segments: trk
.trkseg
.iter()
@@ -68,6 +76,7 @@ impl FileStructure {
.map(|wpt| WaypointNode {
id: wpt.id,
name: wpt.name.clone(),
sym: wpt.sym.clone(),
})
.collect(),
wpt_rev_id: file.wpt_rev_id,
@@ -94,6 +103,10 @@ mod tests {
assert_eq!(node.tracks.len(), file.trk.len());
for (n, t) in node.tracks.iter().zip(&file.trk) {
assert_eq!((n.id, &n.name), (t.id, &t.info.name));
assert_eq!(
(&n.color, n.opacity, n.width),
(&t.info.color, t.info.opacity, t.info.width)
);
assert_eq!(n.segments.len(), t.trkseg.len());
for (n, s) in n.segments.iter().zip(&t.trkseg) {
assert_eq!((n.id, n.rev_id, n.len), (s.id, s.rev_id, s.len()));
+2 -1
View File
@@ -2,7 +2,8 @@
use crate::{
Action, Apply, Command, CoordinatesCache, Diff, FileId, FileOrder, FileStructure,
FileStructureCache, GlobalStatistics, Selection, Stack, State, StatisticsBuffer, StatisticsCache, TrackSegmentId,
FileStructureCache, GlobalStatistics, Selection, Stack, State, StatisticsBuffer,
StatisticsCache, TrackSegmentId,
};
#[derive(Debug, Default)]
+19 -1
View File
@@ -375,6 +375,10 @@ export interface FileStatistics {
export interface TrackNode {
id: string;
name?: string;
/** Style of the track, only present when the file defines it. */
color?: string;
opacity?: number;
width?: number;
segments: SegmentNode[];
}
export interface SegmentNode {
@@ -387,6 +391,7 @@ export interface SegmentNode {
export interface WaypointNode {
id: string;
name?: string;
sym?: string;
}
"#;
@@ -432,6 +437,15 @@ fn structure_object(file: &engine::FileStructure) -> Object {
"tracks",
array(&file.tracks, |trk| {
let node = named_node(trk.id.0, trk.name.as_deref());
if let Some(color) = &trk.color {
set(&node, "color", color.as_str());
}
if let Some(opacity) = trk.opacity {
set(&node, "opacity", opacity);
}
if let Some(width) = trk.width {
set(&node, "width", width);
}
set(
&node,
"segments",
@@ -449,7 +463,11 @@ fn structure_object(file: &engine::FileStructure) -> Object {
&node,
"waypoints",
array(&file.waypoints, |wpt| {
named_node(wpt.id.0, wpt.name.as_deref()).into()
let node = named_node(wpt.id.0, wpt.name.as_deref());
if let Some(sym) = &wpt.sym {
set(&node, "sym", sym.as_str());
}
node.into()
}),
);
set(&node, "waypointsRev", file.wpt_rev_id.0.to_string());