1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-29 18:04:24 +02:00

Compare commits

..

18 Commits

Author SHA1 Message Date
225e6da48b Use the "Round" HiDPI scaling policy (the default in Qt5) in Qt6
As of Qt 6.7.2 the rendering is completely broken and full of various render
artifacts when the default "PassThrough" policy is used and the user has
a fractional screen size like 125% set.
2024-09-21 13:38:56 +02:00
23c398caf7 Add a comment for the splitter refresh hack 2024-09-21 13:20:32 +02:00
17ef334c4c Revert "Clean up the splitter/graph tabs logic"
This reverts commit b01dcc4569.
2024-09-21 13:14:49 +02:00
b01dcc4569 Clean up the splitter/graph tabs logic 2024-09-21 11:36:51 +02:00
762e374adf Significantly improved tracks/graps rendering performance 2024-09-20 22:29:15 +02:00
c68a2a1ac4 Improve the graph clearing logic 2024-09-20 09:34:54 +02:00
672fca9dd5 Merge branch 'origin/master' into Weblate. 2024-09-20 07:10:25 +00:00
8c2e2f65c3 Fixed display artifact in the graph tab bar
Yet another workaroud for the Qt 6.7 bug that draws QGraphicsScene items
to the graph tab bar. Follow up to 6ce0b03295.
2024-09-20 09:05:55 +02:00
c5a7a4bb0e Version++ 2024-09-20 09:05:42 +02:00
4f77d7a40e Translated using Weblate (Esperanto)
Currently translated at 91.5% (447 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/eo/
2024-09-18 19:40:56 +02:00
285a9a55f3 Translated using Weblate (Russian)
Currently translated at 100.0% (488 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2024-09-18 19:40:55 +02:00
9c00ff53c2 Translated using Weblate (Finnish)
Currently translated at 95.4% (466 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2024-09-18 19:40:55 +02:00
531b37bc70 Always draw the light icon of lights, not only when class data is present
Some charts have the lights info in the lcl data section that we do not
parse.
2024-09-17 21:25:17 +02:00
87c5a255c8 Merge remote-tracking branch 'weblate/master' 2024-09-16 23:27:45 +02:00
raf
ce826966cf Translated using Weblate (Catalan)
Currently translated at 100.0% (488 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ca/
2024-09-16 23:27:33 +02:00
a56a558f37 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (488 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2024-09-16 23:27:33 +02:00
e3d603e8d7 Added missing building point style 2024-09-16 23:25:58 +02:00
344e665bed Use a cleaner vector/raster layer filtering code 2024-09-16 23:25:15 +02:00
19 changed files with 99 additions and 83 deletions

View File

@ -1,4 +1,4 @@
version: 13.25.{build}
version: 13.26.{build}
configuration:
- Release

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 13.25
VERSION = 13.26
QT += core \

View File

@ -486,17 +486,17 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Tot</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>
<source>Raster only</source>
<translation type="unfinished"></translation>
<translation>Només ràster</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="378"/>
<source>Vector only</source>
<translation type="unfinished"></translation>
<translation>Només vector</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="385"/>
@ -733,7 +733,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="695"/>
<source>Layers</source>
<translation type="unfinished"></translation>
<translation>Capes</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="704"/>

View File

@ -486,7 +486,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Ĉiuj</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>

View File

@ -492,17 +492,17 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Kaikki</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>
<source>Raster only</source>
<translation type="unfinished"></translation>
<translation>Vain rasteri</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="378"/>
<source>Vector only</source>
<translation type="unfinished"></translation>
<translation>Vain vektori</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="385"/>

View File

@ -492,17 +492,17 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Все</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>
<source>Raster only</source>
<translation type="unfinished"></translation>
<translation>Только растр</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="378"/>
<source>Vector only</source>
<translation type="unfinished"></translation>
<translation>Только вектор</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="385"/>
@ -699,7 +699,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="695"/>
<source>Layers</source>
<translation type="unfinished"></translation>
<translation>Слои</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="721"/>

View File

@ -486,17 +486,17 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Все</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>
<source>Raster only</source>
<translation type="unfinished"></translation>
<translation>Лише растр</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="378"/>
<source>Vector only</source>
<translation type="unfinished"></translation>
<translation>Лише вектор</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="385"/>
@ -723,7 +723,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="695"/>
<source>Layers</source>
<translation type="unfinished"></translation>
<translation>Шари</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="704"/>
@ -1894,12 +1894,12 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="388"/>
<source>Detect pauses</source>
<translation type="unfinished"></translation>
<translation>Визначити паузи</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="537"/>
<source>Detection:</source>
<translation type="unfinished"></translation>
<translation>Визначення:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="656"/>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "13.25"
!define VERSION "13.26"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"

View File

@ -248,30 +248,33 @@ void GraphItem::setScale(qreal sx, qreal sy)
if (_sx == sx && _sy == sy)
return;
prepareGeometryChange();
_sx = sx; _sy = sy;
updatePath();
}
void GraphItem::updatePath()
{
if (_sx == 0 && _sy == 0)
return;
prepareGeometryChange();
_path = QPainterPath();
if (!(_type == Time && !_time)) {
if (!((_type == Time && !_time) || _sx == 0 || _sy == 0)) {
for (int i = 0; i < _graph.size(); i++) {
const GraphSegment &segment = _graph.at(i);
_path.moveTo(segment.first().x(_type) * _sx, -segment.first().y()
QPointF p1(segment.first().x(_type) * _sx, -segment.first().y()
* _sy);
for (int i = 1; i < segment.size(); i++)
_path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y()
_path.moveTo(p1);
for (int i = 1; i < segment.size(); i++) {
QPointF p2(segment.at(i).x(_type) * _sx, -segment.at(i).y()
* _sy);
QPointF diff(p1 - p2);
if (qAbs(diff.x()) >= 1.0 || qAbs(diff.y()) >= 1.0) {
_path.lineTo(p2);
p1 = p2;
}
}
}
}

View File

@ -264,8 +264,7 @@ QRectF GraphView::bounds() const
void GraphView::redraw()
{
if (!_graphs.isEmpty())
redraw(viewport()->size() - QSizeF(MARGIN, MARGIN));
redraw(viewport()->size() - QSizeF(MARGIN, MARGIN));
}
void GraphView::redraw(const QSizeF &size)
@ -275,7 +274,6 @@ void GraphView::redraw(const QSizeF &size)
RangeF rx, ry;
qreal sx, sy;
if (_bounds.isNull()) {
removeItem(_xAxis);
removeItem(_yAxis);
@ -284,7 +282,10 @@ void GraphView::redraw(const QSizeF &size)
removeItem(_slider);
removeItem(_info);
removeItem(_grid);
addItem(_message);
if (_graphs.isEmpty())
removeItem(_message);
else
addItem(_message);
_scene->setSceneRect(_scene->itemsBoundingRect());
return;
}

View File

@ -1171,6 +1171,8 @@ void GUI::loadData(const Data &data)
for (int i = 0; i < _tabs.count(); i++)
graphs.append(_tabs.at(i)->loadData(data, _map));
/* Refreshing the splitter is necessary to update the map viewport and
properly fit the data! */
if (updateGraphTabs())
_splitter->refresh();
paths = _mapView->loadData(data);

View File

@ -69,7 +69,7 @@ void PathItem::updateShape()
_shape = s.createStroke(_painterPath);
}
void PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
bool PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
{
if (fabs(c1.lon() - c2.lon()) > 180.0) {
// Split segment on date line crossing
@ -91,8 +91,21 @@ void PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
_painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y())));
}
_painterPath.lineTo(_map->ll2xy(c2));
} else
_painterPath.lineTo(_map->ll2xy(c2));
return true;
} else {
QPointF p(_map->ll2xy(c2));
const QPainterPath::Element &e = _painterPath.elementAt(
_painterPath.elementCount() - 1);
qreal dx = qAbs(p.x() - e.x);
qreal dy = qAbs(p.y() - e.y);
if (dx >= 1.0 || dy >= 1.0) {
_painterPath.lineTo(p);
return true;
} else
return false;
}
}
void PathItem::updatePainterPath()
@ -101,24 +114,29 @@ void PathItem::updatePainterPath()
for (int i = 0; i < _path.size(); i++) {
const PathSegment &segment = _path.at(i);
_painterPath.moveTo(_map->ll2xy(segment.first().coordinates()));
const PathPoint *p1 = &segment.first();
_painterPath.moveTo(_map->ll2xy(p1->coordinates()));
for (int j = 1; j < segment.size(); j++) {
const PathPoint &p1 = segment.at(j-1);
const PathPoint &p2 = segment.at(j);
unsigned n = segments(p2.distance() - p1.distance());
const PathPoint *p2 = &segment.at(j);
double dist = p2->distance() - p1->distance();
if (n > 1) {
GreatCircle gc(p1.coordinates(), p2.coordinates());
Coordinates last = p1.coordinates();
if (dist > GEOGRAPHICAL_MILE) {
GreatCircle gc(p1->coordinates(), p2->coordinates());
Coordinates last(p1->coordinates());
unsigned n = segments(dist);
for (unsigned k = 1; k <= n; k++) {
Coordinates c(gc.pointAt(k/(double)n));
addSegment(last, c);
last = c;
}
} else
addSegment(p1.coordinates(), p2.coordinates());
p1 = p2;
} else {
if (addSegment(p1->coordinates(), p2->coordinates()))
p1 = p2;
}
}
}
}
@ -289,12 +307,14 @@ QPointF PathItem::position(qreal x) const
p1 = seg->at(mid-1).distance(); p2 = seg->at(mid).distance();
}
unsigned n = segments(p2 - p1);
if (n > 1) {
qreal dist = p2 - p1;
if (dist > GEOGRAPHICAL_MILE) {
GreatCircle gc(c1, c2);
unsigned n = segments(dist);
// Great circle point
double f = (x - p1) / (p2 - p1);
double f = (x - p1) / (dist);
QPointF p(_map->ll2xy(gc.pointAt(f)));
// Segment line of the great circle path
@ -310,7 +330,7 @@ QPointF PathItem::position(qreal x) const
+ l.p1().y());
} else {
QLineF l(_map->ll2xy(c1), _map->ll2xy(c2));
return l.pointAt((x - p1) / (p2 - p1));
return l.pointAt((x - p1) / (dist));
}
}

View File

@ -75,7 +75,7 @@ private:
QPointF position(qreal distance) const;
void updatePainterPath();
void updateShape();
void addSegment(const Coordinates &c1, const Coordinates &c2);
bool addSegment(const Coordinates &c1, const Coordinates &c2);
void setMarkerInfo(qreal pos);
void updateColor();
void updateWidth();

View File

@ -12,6 +12,8 @@ int main(int argc, char *argv[])
qRegisterMetaTypeStreamOperators<TimeZoneInfo>("TimeZoneInfo");
#else // QT6
qRegisterMetaType<TimeZoneInfo>("TimeZoneInfo");
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(
Qt::HighDpiScaleFactorRoundingPolicy::Round);
#endif // QT6
QSurfaceFormat fmt;

View File

@ -114,11 +114,8 @@ const QFont *RasterTile::poiFont(Style::FontSize size, int zoom,
}
}
void RasterTile::ll2xy(QList<MapData::Poly> &polys, bool polygons) const
void RasterTile::ll2xy(QList<MapData::Poly> &polys) const
{
if (!_vectors && !polygons)
return;
for (int i = 0; i < polys.size(); i++) {
MapData::Poly &poly = polys[i];
for (int j = 0; j < poly.points.size(); j++) {
@ -130,9 +127,6 @@ void RasterTile::ll2xy(QList<MapData::Poly> &polys, bool polygons) const
void RasterTile::ll2xy(QList<MapData::Point> &points) const
{
if (!_vectors)
return;
for (int i = 0; i < points.size(); i++) {
QPointF p(ll2xy(points.at(i).coordinates));
points[i].coordinates = Coordinates(p.x(), p.y());
@ -198,9 +192,6 @@ void RasterTile::drawPolygons(QPainter *painter,
void RasterTile::drawLines(QPainter *painter,
const QList<MapData::Poly> &lines) const
{
if (!_vectors)
return;
painter->setBrush(Qt::NoBrush);
for (int i = 0; i < lines.size(); i++) {
@ -290,9 +281,6 @@ void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
void RasterTile::processLines(QList<MapData::Poly> &lines,
QList<TextItem*> &textItems, const QImage (&arrows)[2])
{
if (!_vectors)
return;
std::stable_sort(lines.begin(), lines.end());
if (_zoom >= 22)
@ -411,9 +399,6 @@ void RasterTile::processShields(const QList<MapData::Poly> &lines,
void RasterTile::processPoints(QList<MapData::Point> &points,
QList<TextItem*> &textItems)
{
if (!_vectors)
return;
std::sort(points.begin(), points.end());
for (int i = 0; i < points.size(); i++) {
@ -444,7 +429,7 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
color, hcolor, 0, ICON_PADDING);
if (item->isValid() && !item->collides(textItems)) {
textItems.append(item);
if (point.flags & MapData::Point::Light)
if (Style::isLight(point.type) || point.flags & MapData::Point::Light)
textItems.append(new TextPointItem(pos + style->lightOffset(),
0, 0, style->light(), 0, 0, 0, 0));
} else
@ -462,14 +447,16 @@ void RasterTile::fetchData(QList<MapData::Poly> &polygons,
RectD polyRectD(_transform.img2proj(polyRect.topLeft()),
_transform.img2proj(polyRect.bottomRight()));
_data->polys(polyRectD.toRectC(_proj, 20), _zoom,
&polygons, &lines);
&polygons, _vectors ? &lines : 0);
QRectF pointRect(QPointF(ttl.x() - TEXT_EXTENT, ttl.y() - TEXT_EXTENT),
QPointF(ttl.x() + _rect.width() + TEXT_EXTENT, ttl.y() + _rect.height()
+ TEXT_EXTENT));
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
_transform.img2proj(pointRect.bottomRight()));
_data->points(pointRectD.toRectC(_proj, 20), _zoom, &points);
if (_vectors) {
QRectF pointRect(QPointF(ttl.x() - TEXT_EXTENT, ttl.y() - TEXT_EXTENT),
QPointF(ttl.x() + _rect.width() + TEXT_EXTENT, ttl.y() + _rect.height()
+ TEXT_EXTENT));
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
_transform.img2proj(pointRect.bottomRight()));
_data->points(pointRectD.toRectC(_proj, 20), _zoom, &points);
}
}
MatrixD RasterTile::elevation(int extend) const
@ -540,8 +527,8 @@ void RasterTile::render()
arrows[WATER] = HIDPI_IMG(":/map", "water-arrow", _ratio);
fetchData(polygons, lines, points);
ll2xy(polygons, true);
ll2xy(lines, false);
ll2xy(polygons);
ll2xy(lines);
ll2xy(points);
processPoints(points, textItems);

View File

@ -54,7 +54,7 @@ private:
{return _transform.proj2img(_proj.ll2xy(c));}
Coordinates xy2ll(const QPointF &p) const
{return _proj.xy2ll(_transform.img2proj(p));}
void ll2xy(QList<MapData::Poly> &polys, bool polygons) const;
void ll2xy(QList<MapData::Poly> &polys) const;
void ll2xy(QList<MapData::Point> &points) const;
void drawPolygons(QPainter *painter, const QList<MapData::Poly> &polygons) const;

View File

@ -184,8 +184,6 @@ bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
readObstructionInfo(hdl, flags, rs, point);
if (point && Style::isBuoy(point->type))
readBuoyInfo(hdl, flags, point);
if (point && Style::isLight(point->type))
point->flags |= MapData::Point::Light;
return seek(hdl, off + rs);
}

View File

@ -709,6 +709,7 @@ void Style::defaultPointStyle(qreal ratio)
_points[0x10214] = Point(QImage(":/marine/beacon.png"), QPoint(0, -8));
_points[0x10215] = Point(QImage(":/marine/beacon.png"), QPoint(0, -8));
_points[0x10216] = Point(QImage(":/marine/mooring-buoy.png"), QPoint(0, -5));
_points[0x10304] = Point(QImage(":/marine/building.png"));
_points[0x10305] = Point(QImage(":/marine/chimney.png"), QPoint(0, -11));
_points[0x10306] = Point(QImage(":/marine/church.png"));
_points[0x10307] = Point(QImage(":/marine/silo.png"));

View File

@ -183,12 +183,14 @@ void VectorTile::polys(const RectC &rect, const Zoom &zoom,
}
copyPolys(rect, &polys->polygons, polygons);
copyPolys(rect, &polys->lines, lines);
if (lines)
copyPolys(rect, &polys->lines, lines);
cache->insert(subdiv, polys);
} else {
copyPolys(rect, &polys->polygons, polygons);
copyPolys(rect, &polys->lines, lines);
if (lines)
copyPolys(rect, &polys->lines, lines);
}
}