1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-04-19 19:59:11 +02:00

Compare commits

...

7 Commits

Author SHA1 Message Date
9f1808274f Use Qt 6.8.2 for the OS X builds 2025-02-19 00:49:40 +01:00
5d2465cffc Remove all Qt5 < 5.15 workarounds.
Qt 5.15 is now the minimal required Qt version.
2025-02-19 00:20:18 +01:00
2ab7bff3f8 Cosmetics 2025-02-18 23:11:13 +01:00
060cfb574d Build both release and debug configurations on Linux 2025-02-18 22:44:55 +01:00
5c178b4088 Fixed debug builds 2025-02-18 22:24:43 +01:00
2f4a7f8053 Improved IMG marine style 2025-02-18 22:09:59 +01:00
5f1838ea30 Code cleanup 2025-02-18 22:09:16 +01:00
22 changed files with 200 additions and 272 deletions

View File

@ -8,7 +8,10 @@ on:
jobs:
build:
name: GPXSee
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
strategy:
matrix:
config: ['release', 'debug']
steps:
- name: Checkout
uses: actions/checkout@v4
@ -19,6 +22,6 @@ jobs:
- name: Create localization
run: lrelease gpxsee.pro
- name: Configure build
run: qmake gpxsee.pro
run: qmake CONFIG+=${{ matrix.config }} gpxsee.pro
- name: Build project
run: make -j2

View File

@ -15,7 +15,7 @@ jobs:
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.8.1'
version: '6.8.2'
modules: qtpositioning qtserialport qtimageformats
- name: Create localization
run: lrelease gpxsee.pro

View File

@ -29,8 +29,8 @@ GPS log file formats.
## Build
Build requirements:
* Qt5 >= 5.11 or Qt6 >= 6.2 (Android builds require Qt6)
* C++11 or newer compiler (tested: msvc2019, gcc 7.5.0, clang/Apple LLVM version
* Qt5 >= 5.15 or Qt6 >= 6.2 (Android builds require Qt6)
* C++11 or newer compiler (tested: msvc2022, gcc 11, clang/Apple LLVM version
10.0.0)
Build steps:

View File

@ -5,7 +5,6 @@ unix:!macx:!android {
}
VERSION = 13.36
QT += core \
gui \
gui-private \

View File

@ -73,9 +73,7 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
QIcon::setThemeName(APP_NAME);
#endif // Q_OS_WIN32 || Q_OS_MAC
#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
QIcon::setFallbackThemeName(APP_NAME);
#endif // QT 5.12
_gui = new GUI();

View File

@ -25,15 +25,6 @@
#define IW(item) ((item)->boundingRect().width())
#define IH(item) ((item)->boundingRect().height())
static inline QPoint POS(QWheelEvent *e)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
return e->pos();
#else // QT 5.15
return e->position().toPoint();
#endif // QT 5.15
}
static inline QPoint POS(QMouseEvent *e)
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@ -393,7 +384,7 @@ void GraphView::wheelEvent(QWheelEvent *e)
return;
_angleDelta = _angleDelta % (15 * 8);
QPointF pos = mapToScene(POS(e));
QPointF pos = mapToScene(e->position().toPoint());
QRectF gr(_grid->boundingRect());
QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
@ -404,7 +395,8 @@ void GraphView::wheelEvent(QWheelEvent *e)
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
r.y() * ngr.height())));
QScrollBar *sb = horizontalScrollBar();
sb->setSliderPosition(sb->sliderPosition() + npos.x() - POS(e).x());
sb->setSliderPosition(sb->sliderPosition() + npos.x()
- e->position().toPoint().x());
QGraphicsView::wheelEvent(e);
}

View File

@ -2498,12 +2498,8 @@ QGeoPositionInfoSource *GUI::positionSource(const Options &options)
{
QGeoPositionInfoSource *source;
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
source = QGeoPositionInfoSource::createSource(options.plugin, this);
#else // QT 5.14
source = QGeoPositionInfoSource::createSource(options.plugin,
options.pluginParams.value(options.plugin), this);
#endif // QT 5.14
if (source)
source->setPreferredPositioningMethods(
QGeoPositionInfoSource::SatellitePositioningMethods);

View File

@ -638,11 +638,7 @@ void MapView::wheelEvent(QWheelEvent *event)
return;
_wheelDelta = _wheelDelta % (15 * 8);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
zoom((delta > 0) ? 1 : -1, event->pos(), shift);
#else // QT 5.15
zoom((delta > 0) ? 1 : -1, event->position().toPoint(), shift);
#endif // QT 5.15
/* Do not call QGraphicsView::wheelEvent() here as this would shift the
view ! */

View File

@ -676,21 +676,17 @@ QWidget *OptionsDialog::createPositionPage()
_positionPlugin = new QComboBox();
_positionPlugin->addItems(plugins);
_positionPlugin->setCurrentIndex(_positionPlugin->findText(_options.plugin));
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
_pluginParameters = new PluginParameters(_positionPlugin->currentText(),
_options.pluginParams);
connect(_positionPlugin, &QComboBox::currentTextChanged, _pluginParameters,
&PluginParameters::setPlugin);
#endif // QT 5.14
QFormLayout *pluginLayout = new QFormLayout();
pluginLayout->addRow(tr("Plugin:"), _positionPlugin);
QVBoxLayout *sourceLayout = new QVBoxLayout();
sourceLayout->addLayout(pluginLayout);
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
sourceLayout->addWidget(_pluginParameters);
#endif // QT 5.14
sourceLayout->addStretch();
QWidget *sourceTab = new QWidget();
@ -1009,9 +1005,7 @@ void OptionsDialog::accept()
_options.hillshadingZFactor = _hillshadingZFactor->value();
_options.plugin = _positionPlugin->currentText();
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
_options.pluginParams = _pluginParameters->parameters();
#endif // QT 5.14
_options.useOpenGL = _useOpenGL->isChecked();
_options.enableHTTP2 = _enableHTTP2->isChecked();

View File

@ -193,9 +193,7 @@ private:
QDoubleSpinBox *_hillshadingZFactor;
// Position
QComboBox *_positionPlugin;
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
PluginParameters *_pluginParameters;
#endif // QT 5.14
// System
QSpinBox *_pixmapCache;
QSpinBox *_demCache;

View File

@ -10,13 +10,6 @@
#include "markeritem.h"
#include "pathitem.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#define INTERSECTS intersect
#else // QT 5.15
#define INTERSECTS intersects
#endif // QT 5.15
#define GEOGRAPHICAL_MILE 1855.3248
Units PathItem::_units = Metric;
@ -79,14 +72,14 @@ bool PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360,
c2.lat()));
QLineF dl(QPointF(180, -90), QPointF(180, 90));
l.INTERSECTS(dl, &p);
l.intersects(dl, &p);
_painterPath.lineTo(_map->ll2xy(Coordinates(180, p.y())));
_painterPath.moveTo(_map->ll2xy(Coordinates(-180, p.y())));
} else {
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360,
c2.lat()));
QLineF dl(QPointF(-180, -90), QPointF(-180, 90));
l.INTERSECTS(dl, &p);
l.intersects(dl, &p);
_painterPath.lineTo(_map->ll2xy(Coordinates(-180, p.y())));
_painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y())));
}

View File

@ -9,9 +9,6 @@
#include <QVBoxLayout>
#include <QFormLayout>
#include <QApplication>
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#include <QDesktopWidget>
#endif // QT 5.15
#include "tooltip.h"
#include "thumbnail.h"
#include "flowlayout.h"
@ -184,11 +181,7 @@ bool PopupFrame::eventFilter(QObject *o, QEvent *ev)
void PopupFrame::place(const QPoint &pos, QWidget *w)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
QRect screen = QApplication::desktop()->screenGeometry(w);
#else // QT 5.15
QRect screen = w->screen()->geometry();
#endif // QT 5.15
QPoint p(pos.x() + 2, pos.y() + 16);
if (p.x() + width() > screen.x() + screen.width())

View File

@ -2,13 +2,6 @@
#include "map/gcs.h"
#include "twonavparser.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
#define SKIP_EMPTY QString::SkipEmptyParts
#else // Qt 5.14
#define SKIP_EMPTY Qt::SkipEmptyParts
#endif
static double lon(const QString &str)
{
QStringList l(str.split(QChar(0xBA)));
@ -123,7 +116,8 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
}}
break;
case 'T':
{QStringList list(codec.toString(line).split(' ', SKIP_EMPTY));
{QStringList list(codec.toString(line).split(' ',
Qt::SkipEmptyParts));
if (list.size() < 4) {
_errorString = "Parse error";
return false;
@ -159,7 +153,8 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
tracks.last().last().append(t);}
break;
case 'W':
{QStringList list(codec.toString(line).split(' ', SKIP_EMPTY));
{QStringList list(codec.toString(line).split(' ',
Qt::SkipEmptyParts));
if (list.size() < 5) {
_errorString = "Parse error";
return false;

View File

@ -6,30 +6,41 @@
namespace IMG {
struct Light
class Light
{
public:
enum Color {None, Red, Green, White, Blue, Yellow, Violet, Amber};
struct Sector
class Sector
{
public:
Sector() : color(None), angle(0), range(0) {}
Sector() : _color(None), _angle(0), _range(0) {}
Sector(Color color, quint32 angle, quint32 range)
: color(color), angle(angle), range(range) {}
: _color(color), _angle(angle), _range(range) {}
Color color;
quint32 angle;
quint32 range;
Color color() const {return _color;}
quint32 angle() const {return _angle;}
quint32 range() const {return _range;}
private:
Color _color;
quint32 _angle;
quint32 _range;
};
Light() : color(None), range(0) {}
Light(Color color, quint32 range) : color(color), range(range) {}
Light() : _color(None), _range(0) {}
Light(Color color, quint32 range) : _color(color), _range(range) {}
Light(const QVector<Sector> &sectors)
: color(None), range(0), sectors(sectors) {}
: _color(None), _range(0), _sectors(sectors) {}
Color color;
quint32 range;
QVector<Sector> sectors;
Color color() const {return _color;}
quint32 range() const {return _range;}
const QVector<Sector> &sectors() const {return _sectors;}
private:
Color _color;
quint32 _range;
QVector<Sector> _sectors;
};
}
@ -37,15 +48,15 @@ struct Light
#ifndef QT_NO_DEBUG
inline QDebug operator<<(QDebug dbg, const IMG::Light::Sector &sector)
{
dbg.nospace() << "Sector(" << sector.color << ", " << sector.angle
<< ", " << sector.range << ")";
dbg.nospace() << "Sector(" << sector.color() << ", " << sector.angle()
<< ", " << sector.range() << ")";
return dbg.space();
}
inline QDebug operator<<(QDebug dbg, const IMG::Light &light)
{
dbg.nospace() << "Light(" << light.color << ", " << light.range << ", "
<< light.sectors << ")";
dbg.nospace() << "Light(" << light.color() << ", " << light.range() << ", "
<< light.sectors() << ")";
return dbg.space();
}
#endif // QT_NO_DEBUG

View File

@ -243,28 +243,28 @@ void RasterTile::drawSectorLights(QPainter *painter,
for (int j = 0; j < p->lights.size(); j++) {
const Light &l = p->lights.at(j);
if (l.sectors.size()) {
for (int k = 0; k < l.sectors.size(); k++) {
const Light::Sector &start = l.sectors.at(k);
const Light::Sector &end = (k == l.sectors.size() - 1)
? l.sectors.at(0) : l.sectors.at(k+1);
if (l.sectors().size()) {
for (int k = 0; k < l.sectors().size(); k++) {
const Light::Sector &start = l.sectors().at(k);
const Light::Sector &end = (k == l.sectors().size() - 1)
? l.sectors().at(0) : l.sectors().at(k+1);
if (start.color) {
double a1 = -(end.angle / 10.0 + 90.0);
double a2 = -(start.angle / 10.0 + 90.0);
if (start.color()) {
double a1 = -(end.angle() / 10.0 + 90.0);
double a2 = -(start.angle() / 10.0 + 90.0);
if (a1 > a2)
a2 += 360;
double as = (a2 - a1);
if (as == 0)
as = 360;
QRect rect(lightRect(pos, start.range
? start.range : RANGE_MIN));
QRect rect(lightRect(pos, start.range()
? start.range() : RANGE_MIN));
painter->setPen(QPen(Qt::black, 6, Qt::SolidLine,
Qt::FlatCap));
painter->drawArc(rect, a1 * 16, as * 16);
painter->setPen(QPen(Style::color(start.color), 4,
painter->setPen(QPen(Style::color(start.color()), 4,
Qt::SolidLine, Qt::FlatCap));
painter->drawArc(rect, a1 * 16, as * 16);
@ -279,12 +279,12 @@ void RasterTile::drawSectorLights(QPainter *painter,
}
}
}
} else if (l.range > RANGE_MIN) {
QRect rect(lightRect(pos, l.range));
} else if (l.range() > RANGE_MIN) {
QRect rect(lightRect(pos, l.range()));
painter->setPen(QPen(Qt::black, 6, Qt::SolidLine, Qt::FlatCap));
painter->drawArc(rect, 0, 360 * 16);
painter->setPen(QPen(Style::color(l.color), 4, Qt::SolidLine,
painter->setPen(QPen(Style::color(l.color()), 4, Qt::SolidLine,
Qt::FlatCap));
painter->drawArc(rect, 0, 360 * 16);
}
@ -467,7 +467,7 @@ static bool showAsSector(const QVector<Light> &lights)
{
for (int i = 0; i < lights.size(); i++) {
const Light &l = lights.at(i);
if ((l.color && l.range > RANGE_MIN) || !l.sectors.isEmpty())
if ((l.color() && l.range() > RANGE_MIN) || !l.sectors().isEmpty())
return true;
}
@ -513,9 +513,9 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
textItems.append(item);
for (int j = 0; j < point.lights.size(); j++) {
const Light &l = point.lights.at(j);
if (l.color && l.range <= RANGE_MIN) {
if (l.color() && l.range() <= RANGE_MIN) {
textItems.append(new TextPointItem(pos + style->lightOffset(),
0, 0, style->light(l.color), 0, 0, 0, 0));
0, 0, style->light(l.color()), 0, 0, 0, 0));
break;
}
}

View File

@ -13,6 +13,7 @@ using namespace Garmin;
using namespace IMG;
#define MASK(bits) ((1U << (bits)) - 1U)
#define COLOR(color) static_cast<Light::Color>(color)
static quint64 pointId(const QPoint &pos, quint32 type, const QString &label)
{
@ -124,7 +125,7 @@ bool RGNFile::readBuoyInfo(Handle &hdl, quint8 flags, quint32 size,
lc = (val >> 6) & 7;
if (lc)
point->lights.append(Light((Light::Color)lc, 0));
point->lights.append(Light(COLOR(lc), 0));
return true;
}
@ -198,7 +199,7 @@ bool RGNFile::readLightInfo(Handle &hdl, quint8 flags, quint32 size,
size -= 2;
cf = la >> 8;
Light::Color c = (Light::Color)(cf >> 4 & 7);
Light::Color c = COLOR(cf >> 4 & 7);
if (c) {
if (!(size >= 1 && readUInt8(hdl, range)))
return false;
@ -223,7 +224,7 @@ bool RGNFile::readLightInfo(Handle &hdl, quint8 flags, quint32 size,
range += v2;
}
point->lights.append(Light((Light::Color)(v1 >> 5), range));
point->lights.append(Light(COLOR(v1 >> 5), range));
}
return true;
@ -291,11 +292,123 @@ bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
return seek(hdl, off + rs);
}
bool RGNFile::readLclSectors(Handle &hdl, quint32 &size, quint32 flags,
Light &light) const
{
quint32 unused, cnt = flags & 0x1f;
QVector<Light::Sector> sectors;
for (quint32 j = 0; j < cnt; j++) {
quint32 cf, range = 0;
if (!(size >= 1 && readUInt8(hdl, cf)))
return false;
size--;
if (cf >> 6) {
if (!(size >= (cf >> 6) && readVUInt32(hdl, cf >> 6, range)))
return false;
size -= (cf >> 6);
}
if (cnt > 1) {
quint32 angle;
if (!(size >= 2 && readUInt16(hdl, angle)))
return false;
size -= 2;
if ((flags >> 0x13) & 1) {
quint32 sflags;
if (!(size >= 1 && readUInt8(hdl, sflags)))
return false;
size--;
if (0x3f < sflags) {
if (sflags & 0x80) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
unused |= (sflags & 0x40) << 2;
} else {
if (!(size >= 2 && readUInt16(hdl, unused)))
return false;
size -= 2;
}
}
}
sectors.append(Light::Sector(COLOR(cf & 0x7), angle, range));
} else {
light = Light(COLOR(cf & 0x7), range);
return true;
}
}
light = Light(sectors);
return true;
}
bool RGNFile::readLclLights(Handle &hdl, quint32 &size, quint32 lights,
MapData::Point *point) const
{
quint32 unused;
for (quint32 i = 0; i < lights; i++) {
quint32 fs, vs, flags;
Light light;
if (!(readVUInt32(hdl, fs, &vs) && size >= vs))
return false;
size -= vs;
if (!(size >= 4 && readUInt32(hdl, flags)))
return false;
size -= 4;
if (flags >> 0x11 & 3) {
if (!(size >= (flags >> 0x11 & 3)
&& readVUInt32(hdl, flags >> 0x11 & 3, unused)))
return false;
size -= (flags >> 0x11 & 3);
}
if (flags & 0x3000) {
if (flags & 0x2000) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
unused |= (flags >> 4) & 0x100;
} else {
if (!(size >= 2 && readUInt16(hdl, unused)))
return false;
size -= 2;
}
}
if (flags & 0x100000) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
if (unused & 0x80) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
}
}
if (!readLclSectors(hdl, size, flags, light))
return false;
point->lights.append(light);
}
return true;
}
bool RGNFile::readLclNavaid(Handle &hdl, quint32 size,
MapData::Point *point) const
{
quint32 unused, flags;
// Discard the class lights info if any (marine points may have both!)
point->lights.clear();
if (!(size >= 4 && readUInt32(hdl, flags)))
return false;
size -= 4;
@ -338,97 +451,8 @@ bool RGNFile::readLclNavaid(Handle &hdl, quint32 size,
} while (b & 0x80);
}
quint8 lights = (flags >> 6) & 7;
for (quint32 i = 0; i < lights; i ++) {
quint32 fs, vs, lflags;
Light light;
if (!(readVUInt32(hdl, fs, &vs) && size >= vs))
return false;
size -= vs;
if (!(size >= 4 && readUInt32(hdl, lflags)))
return false;
size -= 4;
if (lflags >> 0x11 & 3) {
if (!(size >= (lflags >> 0x11 & 3)
&& readVUInt32(hdl, lflags >> 0x11 & 3, unused)))
return false;
size -= (lflags >> 0x11 & 3);
}
if (lflags & 0x3000) {
if (lflags & 0x2000) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
unused |= (lflags >> 4) & 0x100;
} else {
if (!(size >= 2 && readUInt16(hdl, unused)))
return false;
size -= 2;
}
}
if (lflags & 0x100000) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
if (unused & 0x80) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
}
}
quint8 sectors = lflags & 0x1f;
for (quint32 j = 0; j < sectors; j++) {
quint32 cf, range = 0;
if (!(size >= 1 && readUInt8(hdl, cf)))
return false;
size--;
if (cf >> 6) {
if (!(size >= (cf >> 6) && readVUInt32(hdl, cf >> 6, range)))
return false;
size -= (cf >> 6);
}
if (sectors > 1) {
quint32 angle;
if (!(size >= 2 && readUInt16(hdl, angle)))
return false;
size -= 2;
if ((lflags >> 0x13) & 1) {
quint32 sflags;
if (!(size >= 1 && readUInt8(hdl, sflags)))
return false;
size--;
if (0x3f < sflags) {
if (sflags & 0x80) {
if (!(size >= 1 && readUInt8(hdl, unused)))
return false;
size--;
unused |= (sflags & 0x40) << 2;
} else {
if (!(size >= 2 && readUInt16(hdl, unused)))
return false;
size -= 2;
}
}
}
light.sectors.append(Light::Sector((Light::Color)(cf & 0x7),
angle, range));
} else {
light.color = (Light::Color)(cf & 0x7);
light.range = range;
}
}
point->lights.append(light);
}
if (!readLclLights(hdl, size, (flags >> 6) & 7, point))
return false;
return (size == 0);
}
@ -457,7 +481,6 @@ bool RGNFile::readLclFields(Handle &hdl, const quint32 flags[3],
size = m + 1;
if (i == 2 && point) {
point->lights.clear();
if (!readLclNavaid(hdl, size, point))
return false;
} else {

View File

@ -73,6 +73,10 @@ private:
quint8 flags, quint32 size, MapData::Point *point) const;
bool readLclNavaid(Handle &hdl, quint32 size,
MapData::Point *point) const;
bool readLclSectors(Handle &hdl, quint32 &size, quint32 flags,
Light &light) const;
bool readLclLights(Handle &hdl, quint32 &size, quint32 lights,
MapData::Point *point) const;
HuffmanTable *_huffmanTable;
Section _base, _dict, _polygons, _lines, _points;

View File

@ -323,6 +323,8 @@ void Style::defaultPolygonStyle()
Qt::FDiagPattern));
_polygons[0x10503] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
Qt::FDiagPattern));
_polygons[0x10504] = Polygon(QBrush(QColor(0xff, 0x40, 0x40),
Qt::FDiagPattern));
_polygons[0x10601] = Polygon(QBrush(QColor(0xaa, 0xaa, 0xaa)));
_polygons[0x1060a] = Polygon(QBrush(QColor(0xfc, 0xb4, 0xfc)));
_polygons[0x10614] = Polygon(QBrush(QColor(0xff, 0xff, 0xff)));
@ -348,7 +350,8 @@ void Style::defaultPolygonStyle()
<< TYPE(0x0a) << 0x10907 << TYPE(0x0b) << 0x10908 << TYPE(0x0c) << 0x10909
<< TYPE(0x26) << TYPE(0x0d) << 0x1090a << TYPE(0x0e) << 0x1090b << TYPE(0x0f)
<< TYPE(0x10) << TYPE(0x11) << TYPE(0x12) << TYPE(0x19) << 0x1090d
<< TYPE(0x13) << 0x10900 << 0x10613 << 0x10409 << 0x10503 << 0x1060a;
<< TYPE(0x13) << 0x10900 << 0x10613 << 0x10409 << 0x10503 << 0x10504
<< 0x1060a;
}
void Style::defaultLineStyle(qreal ratio)
@ -464,7 +467,9 @@ void Style::defaultLineStyle(qreal ratio)
_lines[0x10409] = Line(QPen(QColor(0, 0, 0), 1, Qt::DotLine));
_lines[0x10501] = Line(QImage(":/marine/noanchor-line.png"));
_lines[0x10503] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine));
_lines[0x10504] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine));
_lines[0x10505] = Line(QImage(":/marine/safety-zone-line.png"));
_lines[0x10506] = Line(QImage(":/marine/nature-reserve-line.png"));
_lines[0x10507] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 1, Qt::DashLine));
_lines[0x10601] = Line(QPen(QColor(0, 0, 0), 1, Qt::SolidLine));
_lines[0x10603] = Line(QPen(QColor(0xe7, 0x28, 0xe7), 2, Qt::DashDotLine));

View File

@ -27,14 +27,6 @@
#define MAX_REDIRECT_LEVEL 5
#define RETRIES 3
#define ATTR_REDIRECT_POLICY QNetworkRequest::RedirectPolicyAttribute
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#define ATTR_HTTP2_ALLOWED QNetworkRequest::HTTP2AllowedAttribute
#else // QT 5.15
#define ATTR_HTTP2_ALLOWED QNetworkRequest::Http2AllowedAttribute
#endif // QT 5.15
#define TMP_SUFFIX ".download"
// QNetworkReply::errorString() returns bullshit, use our own reporting
@ -129,31 +121,6 @@ Authorization::Authorization(const QString &username, const QString &password)
_header = HTTPHeader("Authorization", "Basic " + data);
}
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
NetworkTimeout::NetworkTimeout(int timeout, QNetworkReply *reply)
: QObject(reply), _timeout(timeout)
{
connect(reply, &QIODevice::readyRead, this, &NetworkTimeout::reset);
_timer.start(timeout * 1000, this);
}
void NetworkTimeout::reset()
{
_timer.start(_timeout * 1000, this);
}
void NetworkTimeout::timerEvent(QTimerEvent *ev)
{
if (!_timer.isActive() || ev->timerId() != _timer.timerId())
return;
QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
if (reply->isRunning())
reply->abort();
_timer.stop();
}
#endif // QT 5.15
QNetworkAccessManager *Downloader::_manager = 0;
int Downloader::_timeout = 30;
bool Downloader::_http2 = true;
@ -176,12 +143,10 @@ bool Downloader::doDownload(const Download &dl, const QList<HTTPHeader> &headers
QNetworkRequest request(url);
request.setMaximumRedirectsAllowed(MAX_REDIRECT_LEVEL);
request.setAttribute(ATTR_REDIRECT_POLICY,
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute,
QNetworkRequest::NoLessSafeRedirectPolicy);
request.setAttribute(ATTR_HTTP2_ALLOWED, QVariant(_http2));
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, QVariant(_http2));
request.setTransferTimeout(_timeout * 1000);
#endif // QT 5.15
for (int i = 0; i < headers.size(); i++) {
const HTTPHeader &hdr = headers.at(i);
@ -208,9 +173,6 @@ bool Downloader::doDownload(const Download &dl, const QList<HTTPHeader> &headers
_currentDownloads.insert(url, file);
if (reply->isRunning()) {
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
new NetworkTimeout(_timeout, reply);
#endif // QT 5.15
connect(reply, &QIODevice::readyRead, this, &Downloader::emitReadReady);
connect(reply, &QNetworkReply::finished, this, &Downloader::emitFinished);
} else {

View File

@ -3,9 +3,6 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#include <QBasicTimer>
#endif // QT 5.15
#include <QUrl>
#include <QList>
#include <QHash>
@ -41,25 +38,6 @@ private:
HTTPHeader _header;
};
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
class NetworkTimeout : public QObject
{
Q_OBJECT
public:
NetworkTimeout(int timeout, QNetworkReply *reply);
private slots:
void reset();
private:
void timerEvent(QTimerEvent *ev);
QBasicTimer _timer;
int _timeout;
};
#endif // QT 5.15
class Downloader : public QObject
{
Q_OBJECT

View File

@ -39,9 +39,7 @@ static QPainterPath parallelPath(const QPainterPath &p, double dy)
QVector<QPointF> u(n);
QPainterPath h;
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
h.reserve(p.elementCount());
#endif // QT 5.13
for (int k = 0; k < n; k++) {
qreal c = p.elementAt(k + 1).x - p.elementAt(k).x;
@ -251,12 +249,10 @@ QPainterPath RasterTile::painterPath(const Polygon &polygon, bool curve) const
QPainterPath path;
if (curve) {
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
int size = 0;
for (int i = 0; i < polygon.size(); i++)
size += polygon.at(i).size();
path.reserve(size);
#endif // QT 5.13
for (int i = 0; i < polygon.size(); i++) {
const QVector<Coordinates> &subpath = polygon.at(i);

View File

@ -6,16 +6,8 @@
#define MAX_ANGLE 30
#define PADDING 2
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#define INTERSECTS intersect
#else // QT 5.15
#define INTERSECTS intersects
#endif // QT 5.15
static void swap(const QLineF &line, QPointF *p1, QPointF *p2)
{
QPointF lp1(line.p1());
QPointF lp2(line.p2());
@ -34,10 +26,10 @@ static bool intersection(const QLineF &line, const QRectF &rect, QPointF *p1,
{
QPointF *p = p1;
if (line.INTERSECTS(QLineF(rect.topLeft(), rect.topRight()), p)
if (line.intersects(QLineF(rect.topLeft(), rect.topRight()), p)
== QLineF::BoundedIntersection)
p = p2;
if (line.INTERSECTS(QLineF(rect.topLeft(), rect.bottomLeft()), p)
if (line.intersects(QLineF(rect.topLeft(), rect.bottomLeft()), p)
== QLineF::BoundedIntersection) {
if (p == p2) {
swap(line, p1, p2);
@ -45,7 +37,7 @@ static bool intersection(const QLineF &line, const QRectF &rect, QPointF *p1,
}
p = p2;
}
if (line.INTERSECTS(QLineF(rect.bottomRight(), rect.bottomLeft()), p)
if (line.intersects(QLineF(rect.bottomRight(), rect.bottomLeft()), p)
== QLineF::BoundedIntersection) {
if (p == p2) {
swap(line, p1, p2);
@ -53,7 +45,7 @@ static bool intersection(const QLineF &line, const QRectF &rect, QPointF *p1,
}
p = p2;
}
if (line.INTERSECTS(QLineF(rect.bottomRight(), rect.topRight()), p)
if (line.intersects(QLineF(rect.bottomRight(), rect.topRight()), p)
== QLineF::BoundedIntersection) {
if (p == p2) {
swap(line, p1, p2);
@ -68,16 +60,16 @@ static bool intersection(const QLineF &line, const QRectF &rect, QPointF *p1,
static bool intersection(const QLineF &line, const QRectF &rect, QPointF *p)
{
if (line.INTERSECTS(QLineF(rect.topLeft(), rect.topRight()), p)
if (line.intersects(QLineF(rect.topLeft(), rect.topRight()), p)
== QLineF::BoundedIntersection)
return true;
if (line.INTERSECTS(QLineF(rect.topLeft(), rect.bottomLeft()), p)
if (line.intersects(QLineF(rect.topLeft(), rect.bottomLeft()), p)
== QLineF::BoundedIntersection)
return true;
if (line.INTERSECTS(QLineF(rect.bottomRight(), rect.bottomLeft()), p)
if (line.intersects(QLineF(rect.bottomRight(), rect.bottomLeft()), p)
== QLineF::BoundedIntersection)
return true;
if (line.INTERSECTS(QLineF(rect.bottomRight(), rect.topRight()), p)
if (line.intersects(QLineF(rect.bottomRight(), rect.topRight()), p)
== QLineF::BoundedIntersection)
return true;