From 9905de67bde0d8231bda82861a12a383cbd43f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Sun, 20 Oct 2019 20:30:10 +0200 Subject: [PATCH] Added support for GPX 1.0 links --- src/GUI/routeitem.cpp | 6 ++---- src/GUI/trackitem.cpp | 6 ++---- src/GUI/waypointitem.cpp | 8 +++----- src/data/gpxparser.cpp | 42 ++++++++++++++++++++++++++++++++++------ src/data/link.h | 2 ++ src/data/locparser.cpp | 5 +++-- 6 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/GUI/routeitem.cpp b/src/GUI/routeitem.cpp index c2681ed2..d30c2623 100644 --- a/src/GUI/routeitem.cpp +++ b/src/GUI/routeitem.cpp @@ -19,10 +19,8 @@ QString RouteItem::info() const _units)); for (int i = 0; i < _links.size(); i++) { const Link &link = _links.at(i); - if (!link.URL().isEmpty()) { - tt.insert(tr("Link"), QString("%1").arg( - link.URL(), link.text().isEmpty() ? link.URL() : link.text())); - } + tt.insert(tr("Link"), QString("%1").arg( + link.URL(), link.text().isEmpty() ? link.URL() : link.text())); } return tt.toString(); diff --git a/src/GUI/trackitem.cpp b/src/GUI/trackitem.cpp index 63097ba0..ded2fb8c 100644 --- a/src/GUI/trackitem.cpp +++ b/src/GUI/trackitem.cpp @@ -23,10 +23,8 @@ QString TrackItem::info() const tt.insert(tr("Date"), _date.toString(Qt::SystemLocaleShortDate)); for (int i = 0; i < _links.size(); i++) { const Link &link = _links.at(i); - if (!link.URL().isEmpty()) { - tt.insert(tr("Link"), QString("%1").arg( - link.URL(), link.text().isEmpty() ? link.URL() : link.text())); - } + tt.insert(tr("Link"), QString("%1").arg( + link.URL(), link.text().isEmpty() ? link.URL() : link.text())); } return tt.toString(); diff --git a/src/GUI/waypointitem.cpp b/src/GUI/waypointitem.cpp index 0692a00c..39553016 100644 --- a/src/GUI/waypointitem.cpp +++ b/src/GUI/waypointitem.cpp @@ -32,11 +32,9 @@ QString WaypointItem::info() const _waypoint.description()); for (int i = 0; i < _waypoint.links().size(); i++) { const Link &link = _waypoint.links().at(i); - if (!link.URL().isEmpty()) { - tt.insert(qApp->translate("WaypointItem", "Link"), - QString("%1").arg(link.URL(), - link.text().isEmpty() ? link.URL() : link.text())); - } + tt.insert(qApp->translate("WaypointItem", "Link"), + QString("%1").arg(link.URL(), + link.text().isEmpty() ? link.URL() : link.text())); } tt.setImage(_waypoint.image()); diff --git a/src/data/gpxparser.cpp b/src/data/gpxparser.cpp index 5844352f..6e35c3e2 100644 --- a/src/data/gpxparser.cpp +++ b/src/data/gpxparser.cpp @@ -149,6 +149,7 @@ void GPXParser::trackpointData(Trackpoint &trackpoint) void GPXParser::waypointData(Waypoint &waypoint, SegmentData *autoRoute) { qreal gh = NAN; + Link link10; while (_reader.readNextStartElement()) { if (_reader.name() == QLatin1String("name")) @@ -161,14 +162,22 @@ void GPXParser::waypointData(Waypoint &waypoint, SegmentData *autoRoute) gh = number(); else if (_reader.name() == QLatin1String("time")) waypoint.setTimestamp(time()); - else if (_reader.name() == QLatin1String("link")) - waypoint.addLink(link()); + else if (_reader.name() == QLatin1String("link")) { + Link l(link()); + if (!l.URL().isEmpty()) + waypoint.addLink(l); + } else if (_reader.name() == QLatin1String("url")) + link10.setURL(_reader.readElementText()); + else if (_reader.name() == QLatin1String("urlname")) + link10.setText(_reader.readElementText()); else if (autoRoute && _reader.name() == QLatin1String("extensions")) rteptExtensions(autoRoute); else _reader.skipCurrentElement(); } + if (!link10.URL().isEmpty()) + waypoint.addLink(link10); if (!std::isnan(gh) && !std::isnan(waypoint.elevation())) waypoint.setElevation(waypoint.elevation() - gh); } @@ -189,6 +198,7 @@ void GPXParser::routepoints(RouteData &route, QList &tracks) TrackData autoRoute; autoRoute.append(SegmentData()); SegmentData &autoRouteSegment = autoRoute.last(); + Link link10; while (_reader.readNextStartElement()) { if (_reader.name() == QLatin1String("rtept")) { @@ -198,12 +208,21 @@ void GPXParser::routepoints(RouteData &route, QList &tracks) route.setName(_reader.readElementText()); else if (_reader.name() == QLatin1String("desc")) route.setDescription(_reader.readElementText()); - else if (_reader.name() == QLatin1String("link")) - route.addLink(link()); + else if (_reader.name() == QLatin1String("link")) { + Link l(link()); + if (!l.URL().isEmpty()) + route.addLink(l); + } else if (_reader.name() == QLatin1String("url")) + link10.setURL(_reader.readElementText()); + else if (_reader.name() == QLatin1String("urlname")) + link10.setText(_reader.readElementText()); else _reader.skipCurrentElement(); } + if (!link10.URL().isEmpty()) + route.addLink(link10); + if (!autoRouteSegment.isEmpty()) { autoRoute.setName(route.name()); autoRoute.setDescription(route.description()); @@ -213,6 +232,8 @@ void GPXParser::routepoints(RouteData &route, QList &tracks) void GPXParser::track(TrackData &track) { + Link link10; + while (_reader.readNextStartElement()) { if (_reader.name() == QLatin1String("trkseg")) { track.append(SegmentData()); @@ -221,11 +242,20 @@ void GPXParser::track(TrackData &track) track.setName(_reader.readElementText()); else if (_reader.name() == QLatin1String("desc")) track.setDescription(_reader.readElementText()); - else if (_reader.name() == QLatin1String("link")) - track.addLink(link()); + else if (_reader.name() == QLatin1String("link")) { + Link l(link()); + if (!l.URL().isEmpty()) + track.addLink(l); + } else if (_reader.name() == QLatin1String("url")) + link10.setURL(_reader.readElementText()); + else if (_reader.name() == QLatin1String("urlname")) + link10.setText(_reader.readElementText()); else _reader.skipCurrentElement(); } + + if (!link10.URL().isEmpty()) + track.addLink(link10); } void GPXParser::area(Area &area) diff --git a/src/data/link.h b/src/data/link.h index 20d5edf1..8ad5d8a7 100644 --- a/src/data/link.h +++ b/src/data/link.h @@ -9,6 +9,8 @@ public: Link(const QString &URL, const QString &text = QString()) : _URL(URL), _text(text) {} + void setURL(const QString &URL) {_URL = URL;} + void setText(const QString &text) {_text = text;} const QString &URL() const {return _URL;} const QString &text() const {return _text;} diff --git a/src/data/locparser.cpp b/src/data/locparser.cpp index 3e7672dd..4ab4b2ce 100644 --- a/src/data/locparser.cpp +++ b/src/data/locparser.cpp @@ -40,8 +40,9 @@ void LOCParser::waypoint(Waypoint &waypoint) _reader.skipCurrentElement(); } else if (_reader.name() == QLatin1String("link")) { const QXmlStreamAttributes &attr = _reader.attributes(); - waypoint.addLink(Link(_reader.readElementText(), - attr.value("text").toString())); + QString URL(_reader.readElementText()); + if (!URL.isEmpty()) + waypoint.addLink(Link(URL, attr.value("text").toString())); } else _reader.skipCurrentElement(); }