1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-06-27 03:29:16 +02:00

Show track/route source file info when multiple files are opened

Closes #559
This commit is contained in:
2024-09-06 00:05:36 +02:00
parent 36f8f94f15
commit 649d972aec
56 changed files with 198 additions and 92 deletions

View File

@ -86,7 +86,7 @@ bool CUPParser::waypoint(const QByteArrayList &entry,
return true;
}
bool CUPParser::task(const QByteArrayList &entry,
bool CUPParser::task(const QString &fileName, const QByteArrayList &entry,
const QVector<Waypoint> &waypoints, QList<RouteData> &routes)
{
if (entry.size() < 3) {
@ -96,6 +96,7 @@ bool CUPParser::task(const QByteArrayList &entry,
RouteData r;
r.setName(entry.at(0));
r.setFile(fileName);
for (int i = 1; i < entry.size(); i++) {
if (entry.at(i) == "???")
continue;
@ -155,7 +156,7 @@ bool CUPParser::parse(QFile *file, QList<TrackData> &tracks,
return false;
} else if (segment == Tasks) {
if (entry.at(0) != "Options" && !entry.at(0).startsWith("ObsZone=")
&& !task(entry, waypoints, routes))
&& !task(file->fileName(), entry, waypoints, routes))
return false;
}

View File

@ -15,8 +15,8 @@ public:
private:
bool waypoint(const QByteArrayList &entry, QVector<Waypoint> &waypoints);
bool task(const QByteArrayList &entry, const QVector<Waypoint> &waypoints,
QList<RouteData> &routes);
bool task(const QString &fileName, const QByteArrayList &entry,
const QVector<Waypoint> &waypoints, QList<RouteData> &routes);
QString _errorString;
int _errorLine;

View File

@ -481,6 +481,7 @@ bool FITParser::parse(QFile *file, QList<TrackData> &tracks,
return false;
tracks.append(ctx.segment);
tracks.last().setFile(file->fileName());
return true;
}

View File

@ -330,7 +330,7 @@ bool GeoJSONParser::multiPoint(const QJsonObject &object,
return true;
}
bool GeoJSONParser::lineString(const QJsonObject &object,
bool GeoJSONParser::lineString(const QJsonObject &object, const QString &file,
const Projection &parent, const QJsonValue &properties,
QList<TrackData> &tracks)
{
@ -367,6 +367,7 @@ bool GeoJSONParser::lineString(const QJsonObject &object,
setSegmentProperties(segment, -1, properties);
TrackData track(segment);
track.setFile(file);
setTrackProperties(track, properties);
tracks.append(track);
@ -374,7 +375,7 @@ bool GeoJSONParser::lineString(const QJsonObject &object,
}
bool GeoJSONParser::multiLineString(const QJsonObject &object,
const Projection &parent, const QJsonValue &properties,
const QString &file, const Projection &parent, const QJsonValue &properties,
QList<TrackData> &tracks)
{
if (!object.contains("coordinates")) {
@ -421,6 +422,7 @@ bool GeoJSONParser::multiLineString(const QJsonObject &object,
}
}
track.setFile(file);
setTrackProperties(track, properties);
tracks.append(track);
@ -539,7 +541,7 @@ bool GeoJSONParser::multiPolygon(const QJsonObject &object,
}
bool GeoJSONParser::geometryCollection(const QJsonObject &object,
const Projection &parent, const QJsonValue &properties,
const QString &file, const Projection &parent, const QJsonValue &properties,
QList<TrackData> &tracks, QList<Area> &areas, QVector<Waypoint> &waypoints)
{
if (!object["geometries"].isArray()) {
@ -567,13 +569,13 @@ bool GeoJSONParser::geometryCollection(const QJsonObject &object,
return false;
break;
case LineString:
if (!lineString(geometry, PROJ(proj, parent), properties,
if (!lineString(geometry, file, PROJ(proj, parent), properties,
tracks))
return false;
break;
case MultiLineString:
if (!multiLineString(geometry, PROJ(proj, parent), properties,
tracks))
if (!multiLineString(geometry, file, PROJ(proj, parent),
properties, tracks))
return false;
break;
case Polygon:
@ -586,7 +588,7 @@ bool GeoJSONParser::geometryCollection(const QJsonObject &object,
return false;
break;
case GeometryCollection:
if (!geometryCollection(geometry, PROJ(proj, parent),
if (!geometryCollection(geometry, file, PROJ(proj, parent),
properties, tracks, areas, waypoints))
return false;
break;
@ -600,8 +602,9 @@ bool GeoJSONParser::geometryCollection(const QJsonObject &object,
return true;
}
bool GeoJSONParser::feature(const QJsonObject &object, const Projection &parent,
QList<TrackData> &tracks, QList<Area> &areas, QVector<Waypoint> &waypoints)
bool GeoJSONParser::feature(const QJsonObject &object, const QString &file,
const Projection &parent, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
{
if (object["geometry"].isNull())
return true;
@ -623,13 +626,14 @@ bool GeoJSONParser::feature(const QJsonObject &object, const Projection &parent,
return multiPoint(geometry, PROJ(proj, parent), properties,
waypoints);
case LineString:
return lineString(geometry, PROJ(proj, parent), properties, tracks);
case MultiLineString:
return multiLineString(geometry, PROJ(proj, parent), properties,
return lineString(geometry, file, PROJ(proj, parent), properties,
tracks);
case MultiLineString:
return multiLineString(geometry, file, PROJ(proj, parent),
properties, tracks);
case GeometryCollection:
return geometryCollection(geometry, PROJ(proj, parent), properties,
tracks, areas, waypoints);
return geometryCollection(geometry, file, PROJ(proj, parent),
properties, tracks, areas, waypoints);
case Polygon:
return polygon(geometry, PROJ(proj, parent), properties, areas);
case MultiPolygon:
@ -642,8 +646,8 @@ bool GeoJSONParser::feature(const QJsonObject &object, const Projection &parent,
}
bool GeoJSONParser::featureCollection(const QJsonObject &object,
const Projection &parent, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
const QString &file, const Projection &parent, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{
if (!object["features"].isArray()) {
_errorString = "Invalid/missing FeatureCollection features array";
@ -656,8 +660,8 @@ bool GeoJSONParser::featureCollection(const QJsonObject &object,
return false;
for (int i = 0; i < features.size(); i++)
if (!feature(features.at(i).toObject(), PROJ(proj, parent), tracks,
areas, waypoints))
if (!feature(features.at(i).toObject(), file, PROJ(proj, parent),
tracks, areas, waypoints))
return false;
return true;
@ -686,6 +690,7 @@ bool GeoJSONParser::parse(QFile *file, QList<TrackData> &tracks,
QJsonObject object(doc.object());
Projection proj(GCS::WGS84());
QString fileName(file->fileName());
switch (type(object)) {
case Point:
@ -693,16 +698,17 @@ bool GeoJSONParser::parse(QFile *file, QList<TrackData> &tracks,
case MultiPoint:
return multiPoint(object, proj, QJsonValue(), waypoints);
case LineString:
return lineString(object, proj, QJsonValue(), tracks);
return lineString(object, fileName, proj, QJsonValue(), tracks);
case MultiLineString:
return multiLineString(object, proj, QJsonValue(), tracks);
return multiLineString(object, fileName, proj, QJsonValue(), tracks);
case GeometryCollection:
return geometryCollection(object, proj, QJsonValue(), tracks, areas,
waypoints);
return geometryCollection(object, fileName, proj, QJsonValue(),
tracks, areas, waypoints);
case Feature:
return feature(object, proj, tracks, areas, waypoints);
return feature(object, fileName, proj, tracks, areas, waypoints);
case FeatureCollection:
return featureCollection(object, proj, tracks, areas, waypoints);
return featureCollection(object, fileName, proj, tracks, areas,
waypoints);
case Polygon:
return polygon(object, proj, QJsonValue(), areas);
case MultiPolygon:

View File

@ -37,22 +37,25 @@ private:
const QJsonValue &properties, QVector<Waypoint> &waypoints);
bool multiPoint(const QJsonObject &object, const Projection &parent,
const QJsonValue &properties, QVector<Waypoint> &waypoints);
bool lineString(const QJsonObject &coordinates, const Projection &parent,
const QJsonValue &properties, QList<TrackData> &tracks);
bool multiLineString(const QJsonObject &object, const Projection &proj,
const QJsonValue &properties, QList<TrackData> &tracks);
bool lineString(const QJsonObject &coordinates, const QString &file,
const Projection &parent, const QJsonValue &properties,
QList<TrackData> &tracks);
bool multiLineString(const QJsonObject &object, const QString &file,
const Projection &proj, const QJsonValue &properties,
QList<TrackData> &tracks);
bool polygon(const QJsonObject &object, const Projection &parent,
const QJsonValue &properties, QList<Area> &areas);
bool multiPolygon(const QJsonObject &object, const Projection &proj,
const QJsonValue &properties, QList<Area> &areas);
bool geometryCollection(const QJsonObject &json, const Projection &parent,
const QJsonValue &properties, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints);
bool feature(const QJsonObject &json, const Projection &parent,
QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
bool featureCollection(const QJsonObject &object, const Projection &parent,
bool geometryCollection(const QJsonObject &json, const QString &file,
const Projection &parent, const QJsonValue &properties,
QList<TrackData> &tracks, QList<Area> &areas, QVector<Waypoint> &waypoints);
bool feature(const QJsonObject &json, const QString &file,
const Projection &parent, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
bool featureCollection(const QJsonObject &object, const QString &file,
const Projection &parent, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
QString _errorString;
};

View File

@ -343,6 +343,10 @@ void GPXParser::track(TrackData &track)
if (!link10.URL().isEmpty())
track.addLink(link10);
QFile *file = qobject_cast<QFile *>(_reader.device());
if (file)
track.setFile(file->fileName());
}
void GPXParser::area(Area &area)
@ -388,6 +392,9 @@ void GPXParser::gpx(QList<TrackData> &tracks, QList<RouteData> &routes,
track(tracks.back());
} else if (_reader.name() == QLatin1String("rte")) {
routes.append(RouteData());
QFile *file = qobject_cast<QFile *>(_reader.device());
if (file)
routes.back().setFile(file->fileName());
routepoints(routes.back(), tracks);
} else if (_reader.name() == QLatin1String("wpt")) {
waypoints.append(Waypoint(coordinates()));

View File

@ -237,6 +237,7 @@ bool IGCParser::parse(QFile *file, QList<TrackData> &tracks,
} else {
route = true;
routes.append(RouteData());
routes.last().setFile(file->fileName());
}
} else if (line[0] == 'B') {
if (ctx.date.isNull()) {
@ -248,6 +249,7 @@ bool IGCParser::parse(QFile *file, QList<TrackData> &tracks,
}
if (!track) {
tracks.append(SegmentData());
tracks.last().setFile(file->fileName());
ctx.time = QTime(0, 0);
track = true;
}

View File

@ -40,6 +40,7 @@ bool ITNParser::parse(QFile *file, QList<TrackData> &tracks,
_errorLine++;
}
rd.setFile(file->fileName());
routes.append(rd);
return true;

View File

@ -594,8 +594,8 @@ void KMLParser::photoOverlay(const Ctx &ctx, QVector<Waypoint> &waypoints,
}
}
void KMLParser::multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints)
void KMLParser::multiGeometry(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{
TrackData *tp = 0;
Area *ap = 0;
@ -608,6 +608,7 @@ void KMLParser::multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
} else if (_reader.name() == QLatin1String("LineString")) {
if (!tp) {
tracks.append(TrackData());
tracks.last().setFile(ctx.path);
tp = &tracks.last();
}
tp->append(SegmentData());
@ -651,21 +652,24 @@ void KMLParser::placemark(const Ctx &ctx, QList<TrackData> &tracks,
} else if (_reader.name() == QLatin1String("StyleMap"))
styleMap(map);
else if (_reader.name() == QLatin1String("MultiGeometry"))
multiGeometry(tracks, areas, waypoints);
multiGeometry(ctx, tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Point")) {
waypoints.append(Waypoint());
point(waypoints.last());
} else if (_reader.name() == QLatin1String("LineString")
|| _reader.name() == QLatin1String("LinearRing")) {
tracks.append(TrackData());
tracks.last().setFile(ctx.path);
tracks.last().append(SegmentData());
lineString(tracks.last().last());
} else if (_reader.name() == QLatin1String("Track")) {
tracks.append(TrackData());
tracks.last().setFile(ctx.path);
tracks.last().append(SegmentData());
track(tracks.last().last());
} else if (_reader.name() == QLatin1String("MultiTrack")) {
tracks.append(TrackData());
tracks.last().setFile(ctx.path);
multiTrack(tracks.last());
} else if (_reader.name() == QLatin1String("Polygon")) {
areas.append(Area());

View File

@ -40,8 +40,8 @@ private:
QVector<Waypoint> &waypoints, PointStyleMap &pointStyles,
PolygonStyleMap &polyStyles, LineStyleMap &lineStyles,
QMap<QString, QString> &map);
void multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void multiGeometry(const Ctx &ctx, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints);
void photoOverlay(const Ctx &ctx, QVector<Waypoint> &waypoints,
PointStyleMap &pointStyles, QMap<QString, QString> &map);
void track(SegmentData &segment);

View File

@ -531,6 +531,7 @@ bool NMEAParser::parse(QFile *file, QList<TrackData> &tracks,
if (segment.size()) {
tracks.append(TrackData());
tracks.last().setFile(file->fileName());
tracks.last().append(segment);
}

View File

@ -276,6 +276,7 @@ bool GHPParser::parse(QFile *file, QList<TrackData> &tracks,
}
tracks.append(TrackData());
tracks.last().setFile(file->fileName());
tracks.last().append(segment);
return true;

View File

@ -41,6 +41,7 @@ bool PLTParser::parse(QFile *file, QList<TrackData> &tracks,
tracks.append(TrackData());
TrackData &track = tracks.last();
track.setFile(file->fileName());
track.append(SegmentData());
SegmentData &segment = track.last();
@ -159,6 +160,7 @@ bool RTEParser::parse(QFile *file, QList<TrackData> &tracks,
if (list.at(0).trimmed() == "R") {
routes.append(RouteData());
routes.last().setFile(file->fileName());
record = true;
if (list.size() >= 3) {

View File

@ -23,6 +23,7 @@ public:
const QString &comment() const {return _data.comment();}
const QVector<Link> &links() const {return _data.links();}
const LineStyle &style() const {return _data.style();}
const QString &file() const {return _data.file();}
bool isValid() const {return _data.size() >= 2;}

View File

@ -15,17 +15,20 @@ public:
const QString &comment() const {return _comment;}
const QVector<Link> &links() const {return _links;}
const LineStyle &style() const {return _style;}
const QString &file() const {return _file;}
void setName(const QString &name) {_name = name;}
void setDescription(const QString &desc) {_desc = desc;}
void setComment(const QString &comment) {_comment = comment;}
void addLink(const Link &link) {_links.append(link);}
void setStyle(const LineStyle &style) {_style = style;}
void setFile(const QString &file) {_file = file;}
private:
QString _name;
QString _desc;
QString _comment;
QString _file;
QVector<Link> _links;
LineStyle _style;
};

View File

@ -109,6 +109,7 @@ bool SLFParser::parse(QFile *file, QList<TrackData> &tracks,
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Activity")) {
tracks.append(TrackData());
tracks.last().setFile(file->fileName());
activity(tracks.last());
} else
_reader.raiseError("Not a SLF file");

View File

@ -136,6 +136,9 @@ void SMLParser::sml(QList<TrackData> &tracks)
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("DeviceLog")) {
tracks.append(TrackData());
QFile *file = qobject_cast<QFile*>(_reader.device());
if (file)
tracks.last().setFile(file->fileName());
deviceLog(tracks.last());
} else
_reader.skipCurrentElement();

View File

@ -196,7 +196,10 @@ void TCXParser::courses(QList<TrackData> &tracks, QVector<Waypoint> &waypoints)
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Course")) {
tracks.append(TrackData());
course(waypoints, tracks.back());
QFile *file = qobject_cast<QFile*>(_reader.device());
if (file)
tracks.last().setFile(file->fileName());
course(waypoints, tracks.last());
} else
_reader.skipCurrentElement();
}
@ -207,6 +210,9 @@ void TCXParser::sport(QList<TrackData> &tracks)
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Activity")) {
tracks.append(TrackData());
QFile *file = qobject_cast<QFile*>(_reader.device());
if (file)
tracks.last().setFile(file->fileName());
activity(tracks.last());
} else
_reader.skipCurrentElement();
@ -229,6 +235,9 @@ void TCXParser::activities(QList<TrackData> &tracks)
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Activity")) {
tracks.append(TrackData());
QFile *file = qobject_cast<QFile*>(_reader.device());
if (file)
tracks.last().setFile(file->fileName());
activity(tracks.last());
} else if (_reader.name() == QLatin1String("MultiSportSession"))
multiSportSession(tracks);

View File

@ -36,6 +36,7 @@ public:
const QString &comment() const {return _data.comment();}
const QVector<Link> &links() const {return _data.links();}
const LineStyle &style() const {return _data.style();}
const QString &file() const {return _data.file();}
bool isValid() const;

View File

@ -25,17 +25,20 @@ public:
const QString &comment() const {return _comment;}
const QVector<Link> &links() const {return _links;}
const LineStyle &style() const {return _style;}
const QString &file() const {return _file;}
void setName(const QString &name) {_name = name;}
void setDescription(const QString &desc) {_desc = desc;}
void setComment(const QString &comment) {_comment = comment;}
void addLink(const Link &link) {_links.append(link);}
void setStyle(const LineStyle &style) {_style = style;}
void setFile(const QString &path) {_file = path;}
private:
QString _name;
QString _desc;
QString _comment;
QString _file;
QVector<Link> _links;
LineStyle _style;
};

View File

@ -152,6 +152,7 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
if (!track) {
tracks.append(SegmentData());
tracks.last().setFile(file->fileName());
track = true;
}
@ -205,6 +206,7 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
case 'R':
{QStringList list(codec.toString(line).split(','));
routes.append(RouteData());
routes.last().setFile(file->fileName());
if (list.size() > 1)
routes.last().setName(list.at(1));
route = true;}