1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-02-22 10:20:47 +01:00

Compare commits

..

No commits in common. "589c602d2117c1f86d64a2961e5be359ce4e4ebe" and "1d5f7db12fff07b051fd18d04c8fbc48bd548972" have entirely different histories.

4 changed files with 43 additions and 174 deletions

View File

@ -99,26 +99,18 @@ void WaypointItem::updateCache()
QPainterPath p; QPainterPath p;
qreal pointSize = _font.bold() ? HS(_size) : _size; qreal pointSize = _font.bold() ? HS(_size) : _size;
if (_showLabel && !_waypoint.name().isEmpty()) { if (_showLabel) {
QFontMetrics fm(_font); QFontMetrics fm(_font);
_labelBB = fm.tightBoundingRect(_waypoint.name()); _labelBB = fm.tightBoundingRect(_waypoint.name());
if (_showIcon && _icon) { if (_showIcon && _icon) {
if (_font.bold()) if (_font.bold())
p.addRect(-_icon->width() * 0.625, _waypoint.icon().isNull() p.addRect(-_icon->width() * 0.625, -_icon->height() * 1.25,
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->width() * 1.25, _icon->height() * 1.25); _icon->width() * 1.25, _icon->height() * 1.25);
else else
p.addRect(-_icon->width()/2.0, _waypoint.icon().isNull() p.addRect(-_icon->width()/2.0, -_icon->height(), _icon->width(),
? -_icon->height() : -_icon->height()/2, _icon->width(),
_icon->height()); _icon->height());
p.addRect(0, 0, _labelBB.width(), _labelBB.height() + fm.descent());
if (_waypoint.icon().isNull())
p.addRect(0, 0, _labelBB.width(), _labelBB.height()
+ fm.descent());
else
p.addRect(_icon->width()/2, _icon->height()/2, _labelBB.width(),
_labelBB.height() + fm.descent());
} else { } else {
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize); p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
p.addRect(pointSize/2, pointSize/2, _labelBB.width(), p.addRect(pointSize/2, pointSize/2, _labelBB.width(),
@ -127,12 +119,10 @@ void WaypointItem::updateCache()
} else { } else {
if (_showIcon && _icon) { if (_showIcon && _icon) {
if (_font.bold()) if (_font.bold())
p.addRect(-_icon->width() * 0.625, _waypoint.icon().isNull() p.addRect(-_icon->width() * 0.625, -_icon->height() * 1.25,
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->width() * 1.25, _icon->height() * 1.25); _icon->width() * 1.25, _icon->height() * 1.25);
else else
p.addRect(-_icon->width()/2, _waypoint.icon().isNull() p.addRect(-_icon->width()/2, -_icon->height(), _icon->width(),
? -_icon->height() : -_icon->height()/2, _icon->width(),
_icon->height()); _icon->height());
} else } else
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize); p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
@ -150,16 +140,12 @@ void WaypointItem::paint(QPainter *painter,
painter->setPen(_color); painter->setPen(_color);
if (_showLabel && !_waypoint.name().isEmpty()) { if (_showLabel) {
painter->setFont(_font); painter->setFont(_font);
if (_showIcon && _icon) { if (_showIcon && _icon)
if (_waypoint.icon().isNull()) painter->drawText(-qMax(_labelBB.x(), 0), _labelBB.height(),
painter->drawText(-qMax(_labelBB.x(), 0), _labelBB.height(), _waypoint.name());
_waypoint.name()); else
else
painter->drawText(_icon->width()/2 - qMax(_labelBB.x(), 0),
_icon->height()/2 + _labelBB.height(), _waypoint.name());
} else
painter->drawText(pointSize/2 - qMax(_labelBB.x(), 0), pointSize/2 painter->drawText(pointSize/2 - qMax(_labelBB.x(), 0), pointSize/2
+ _labelBB.height(), _waypoint.name()); + _labelBB.height(), _waypoint.name());
} }
@ -167,13 +153,11 @@ void WaypointItem::paint(QPainter *painter,
painter->setBrush(QBrush(_color, Qt::SolidPattern)); painter->setBrush(QBrush(_color, Qt::SolidPattern));
if (_showIcon && _icon) { if (_showIcon && _icon) {
if (_font.bold()) if (_font.bold())
painter->drawPixmap(-_icon->width() * 0.625, _waypoint.icon().isNull() painter->drawPixmap(-_icon->width() * 0.625, -_icon->height() * 1.25,
? -_icon->height() * 1.25 : -_icon->height() * 0.625,
_icon->scaled(_icon->width() * 1.25, _icon->height() * 1.25, _icon->scaled(_icon->width() * 1.25, _icon->height() * 1.25,
Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
else else
painter->drawPixmap(-_icon->width()/2.0, _waypoint.icon().isNull() painter->drawPixmap(-_icon->width()/2.0, -_icon->height(), *_icon);
? -_icon->height() : -_icon->height()/2, *_icon);
} else } else
painter->drawEllipse(-pointSize/2, -pointSize/2, pointSize, pointSize); painter->drawEllipse(-pointSize/2, -pointSize/2, pointSize, pointSize);

View File

@ -53,7 +53,6 @@ static QMultiMap<QString, Parser*> parsers()
map.insert("gpx", &gpx); map.insert("gpx", &gpx);
map.insert("tcx", &tcx); map.insert("tcx", &tcx);
map.insert("kml", &kml); map.insert("kml", &kml);
map.insert("kmz", &kml);
map.insert("fit", &fit); map.insert("fit", &fit);
map.insert("csv", &csv); map.insert("csv", &csv);
map.insert("igc", &igc); map.insert("igc", &igc);
@ -163,7 +162,7 @@ QString Data::formats()
+ qApp->translate("Data", "IGC files") + " (*.igc);;" + qApp->translate("Data", "IGC files") + " (*.igc);;"
+ qApp->translate("Data", "ITN files") + " (*.itn);;" + qApp->translate("Data", "ITN files") + " (*.itn);;"
+ qApp->translate("Data", "JPEG images") + " (*.jpg *.jpeg);;" + qApp->translate("Data", "JPEG images") + " (*.jpg *.jpeg);;"
+ qApp->translate("Data", "KML files") + " (*.kml *.kmz);;" + qApp->translate("Data", "KML files") + " (*.kml);;"
+ qApp->translate("Data", "LOC files") + " (*.loc);;" + qApp->translate("Data", "LOC files") + " (*.loc);;"
+ qApp->translate("Data", "NMEA files") + " (*.nmea);;" + qApp->translate("Data", "NMEA files") + " (*.nmea);;"
+ qApp->translate("Data", "ONmove files") + " (*.omd *.ghp);;" + qApp->translate("Data", "ONmove files") + " (*.omd *.ghp);;"

View File

@ -1,28 +1,5 @@
/*
WARNING: This code uses internal Qt API - the QZipReader class for reading
ZIP files - and things may break if Qt changes the API. For Qt5 this is not
a problem as we can "see the future" now and there are no changes in all
the supported Qt5 versions up to the last one (5.15). In Qt6 the class
might change or even disappear in the future, but this is very unlikely
as there were no changes for several years and The Qt Company's policy
is: "do not invest any resources into any desktop related stuff unless
absolutely necessary". There is an issue (QTBUG-3897) since the year 2009 to
include the ZIP reader into the public API, which aptly illustrates the
effort The Qt Company is willing to make about anything desktop related...
*/
#include <QFileInfo>
#include <QDir>
#include <QTemporaryDir>
#include <private/qzipreader_p.h>
#include "kmlparser.h" #include "kmlparser.h"
#define ZIP_MAGIC 0x04034b50
static inline uint readUInt(const uchar *data)
{
return (data[0]) + (data[1]<<8) + (data[2]<<16) + (data[3]<<24);
}
qreal KMLParser::number() qreal KMLParser::number()
{ {
@ -513,9 +490,9 @@ void KMLParser::multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
} }
void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas, void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QMap<QString, QPixmap> &icons) QVector<Waypoint> &waypoints)
{ {
QString name, desc, phone, address, id; QString name, desc, phone, address;
QDateTime timestamp; QDateTime timestamp;
while (_reader.readNextStartElement()) { while (_reader.readNextStartElement()) {
@ -539,8 +516,6 @@ void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas,
w.setTimestamp(timestamp); w.setTimestamp(timestamp);
w.setAddress(address); w.setAddress(address);
w.setPhone(phone); w.setPhone(phone);
if (!id.isNull())
w.setIcon(icons.value(id));
point(w); point(w);
} else if (_reader.name() == QLatin1String("LineString") } else if (_reader.name() == QLatin1String("LineString")
|| _reader.name() == QLatin1String("LinearRing")) { || _reader.name() == QLatin1String("LinearRing")) {
@ -569,98 +544,49 @@ void KMLParser::placemark(QList<TrackData> &tracks, QList<Area> &areas,
a.setName(name); a.setName(name);
a.setDescription(desc); a.setDescription(desc);
polygon(a); polygon(a);
} else if (_reader.name() == QLatin1String("styleUrl")) {
id = _reader.readElementText();
id = (id.at(0) == '#') ? id.right(id.size() - 1) : QString();
} else } else
_reader.skipCurrentElement(); _reader.skipCurrentElement();
} }
} }
void KMLParser::icon(const QDir &dir, const QString &id, void KMLParser::folder(QList<TrackData> &tracks, QList<Area> &areas,
QMap<QString, QPixmap> &icons) QVector<Waypoint> &waypoints)
{
QString path;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("href"))
path = _reader.readElementText();
else
_reader.skipCurrentElement();
}
if (!path.isNull())
icons.insert(id, QPixmap(dir.absoluteFilePath(path)));
}
void KMLParser::iconStyle(const QDir &dir, const QString &id,
QMap<QString, QPixmap> &icons)
{ {
while (_reader.readNextStartElement()) { while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Icon")) if (_reader.name() == QLatin1String("Placemark"))
icon(dir, id, icons); placemark(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder"))
folder(tracks, areas, waypoints);
else else
_reader.skipCurrentElement(); _reader.skipCurrentElement();
} }
} }
void KMLParser::style(const QDir &dir, QMap<QString, QPixmap> &icons) void KMLParser::document(QList<TrackData> &tracks, QList<Area> &areas,
{ QVector<Waypoint> &waypoints)
QString id = _reader.attributes().value("id").toString();
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("IconStyle"))
iconStyle(dir, id, icons);
else
_reader.skipCurrentElement();
}
}
void KMLParser::folder(const QDir &dir, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints,
const QMap<QString, QPixmap> &icons)
{ {
while (_reader.readNextStartElement()) { while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document")) if (_reader.name() == QLatin1String("Document"))
document(dir, tracks, areas, waypoints); document(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Placemark")) else if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints, icons); placemark(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder")) else if (_reader.name() == QLatin1String("Folder"))
folder(dir, tracks, areas, waypoints, icons); folder(tracks, areas, waypoints);
else else
_reader.skipCurrentElement(); _reader.skipCurrentElement();
} }
} }
void KMLParser::document(const QDir &dir, QList<TrackData> &tracks, void KMLParser::kml(QList<TrackData> &tracks, QList<Area> &areas,
QList<Area> &areas, QVector<Waypoint> &waypoints) QVector<Waypoint> &waypoints)
{
QMap<QString, QPixmap> icons;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document"))
document(dir, tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints, icons);
else if (_reader.name() == QLatin1String("Folder"))
folder(dir, tracks, areas, waypoints, icons);
else if (_reader.name() == QLatin1String("Style"))
style(dir, icons);
else
_reader.skipCurrentElement();
}
}
void KMLParser::kml(const QDir &dir, QList<TrackData> &tracks,
QList<Area> &areas, QVector<Waypoint> &waypoints)
{ {
while (_reader.readNextStartElement()) { while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Document")) if (_reader.name() == QLatin1String("Document"))
document(dir, tracks, areas, waypoints); document(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Placemark")) else if (_reader.name() == QLatin1String("Placemark"))
placemark(tracks, areas, waypoints, QMap<QString, QPixmap>()); placemark(tracks, areas, waypoints);
else if (_reader.name() == QLatin1String("Folder")) else if (_reader.name() == QLatin1String("Folder"))
folder(dir, tracks, areas, waypoints, QMap<QString, QPixmap>()); folder(tracks, areas, waypoints);
else else
_reader.skipCurrentElement(); _reader.skipCurrentElement();
} }
@ -670,49 +596,15 @@ bool KMLParser::parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Area> &areas, QVector<Waypoint> &waypoints) QList<RouteData> &routes, QList<Area> &areas, QVector<Waypoint> &waypoints)
{ {
Q_UNUSED(routes); Q_UNUSED(routes);
uchar magic[4];
QFileInfo fi(*file);
_reader.clear(); _reader.clear();
_reader.setDevice(file);
if (file->read((char *)magic, 4) == 4 && readUInt(magic) == ZIP_MAGIC) { if (_reader.readNextStartElement()) {
QZipReader zip(fi.absoluteFilePath(), QIODevice::ReadOnly); if (_reader.name() == QLatin1String("kml"))
QTemporaryDir tempDir; kml(tracks, areas, waypoints);
if (!zip.extractAll(tempDir.path())) else
_reader.raiseError("Error extracting ZIP file"); _reader.raiseError("Not a KML file");
else {
QDir zipDir(tempDir.path());
QFileInfoList files(zipDir.entryInfoList(QStringList("*.kml"),
QDir::Files));
if (files.isEmpty())
_reader.raiseError("No KML file found in ZIP file");
else {
QFile kmlFile(files.first().absoluteFilePath());
if (!kmlFile.open(QIODevice::ReadOnly))
_reader.raiseError("Error opening KML file");
else {
_reader.setDevice(&kmlFile);
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("kml"))
kml(zipDir, tracks, areas, waypoints);
else
_reader.raiseError("Not a KML file");
}
}
}
}
} else {
file->reset();
_reader.setDevice(file);
if (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("kml"))
kml(fi.absoluteDir(), tracks, areas, waypoints);
else
_reader.raiseError("Not a KML file");
}
} }
return !_reader.error(); return !_reader.error();

View File

@ -5,8 +5,6 @@
#include <QDateTime> #include <QDateTime>
#include "parser.h" #include "parser.h"
class QDir;
class KMLParser : public Parser class KMLParser : public Parser
{ {
public: public:
@ -16,14 +14,14 @@ public:
int errorLine() const {return _reader.lineNumber();} int errorLine() const {return _reader.lineNumber();}
private: private:
void kml(const QDir &dir, QList<TrackData> &tracks, QList<Area> &areas, void kml(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints); QVector<Waypoint> &waypoints);
void document(const QDir &dir, QList<TrackData> &tracks, QList<Area> &areas, void document(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints);
void folder(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints); QVector<Waypoint> &waypoints);
void folder(const QDir &dir, QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QMap<QString, QPixmap> &icons);
void placemark(QList<TrackData> &tracks, QList<Area> &areas, void placemark(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QMap<QString, QPixmap> &icons); QVector<Waypoint> &waypoints);
void multiGeometry(QList<TrackData> &tracks, QList<Area> &areas, void multiGeometry(QList<TrackData> &tracks, QList<Area> &areas,
QVector<Waypoint> &waypoints, const QString &name, const QString &desc, QVector<Waypoint> &waypoints, const QString &name, const QString &desc,
const QDateTime &timestamp); const QDateTime &timestamp);
@ -47,10 +45,6 @@ private:
QDateTime timeStamp(); QDateTime timeStamp();
qreal number(); qreal number();
QDateTime time(); QDateTime time();
void style(const QDir &dir, QMap<QString, QPixmap> &icons);
void iconStyle(const QDir &dir, const QString &id,
QMap<QString, QPixmap> &icons);
void icon(const QDir &dir, const QString &id, QMap<QString, QPixmap> &icons);
QXmlStreamReader _reader; QXmlStreamReader _reader;
}; };