From 52c6773b7e2d550d5798a35e6f5b9930162183e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Wed, 11 Sep 2024 23:52:30 +0200 Subject: [PATCH] Added support for map layers selection Enable selecting only raster or only vector layers when showing Garmin maps. --- src/GUI/gui.cpp | 56 +++++++++++++++++++++++++++++++++++--- src/GUI/gui.h | 4 +++ src/GUI/mapview.cpp | 16 +++++++++-- src/GUI/mapview.h | 16 +++++++++-- src/GUI/settings.cpp | 4 +++ src/GUI/settings.h | 1 + src/map/IMG/rastertile.cpp | 30 ++++++++++++++++++-- src/map/IMG/rastertile.h | 8 ++++-- src/map/imgmap.cpp | 3 +- src/map/map.h | 4 ++- 10 files changed, 125 insertions(+), 17 deletions(-) diff --git a/src/GUI/gui.cpp b/src/GUI/gui.cpp index 5fe55aa1..d29ed9ce 100644 --- a/src/GUI/gui.cpp +++ b/src/GUI/gui.cpp @@ -364,6 +364,21 @@ void GUI::createActions() _showCoordinatesAction->setCheckable(true); connect(_showCoordinatesAction, &QAction::triggered, _mapView, &MapView::showCursorCoordinates); + QActionGroup *mapLayersGroup = new QActionGroup(this); + connect(mapLayersGroup, &QActionGroup::triggered, this, + &GUI::selectMapLayers); + _drawAllAction = new QAction(tr("All"), this); + _drawAllAction->setMenuRole(QAction::NoRole); + _drawAllAction->setCheckable(true); + _drawAllAction->setActionGroup(mapLayersGroup); + _drawRastersAction = new QAction(tr("Raster only"), this); + _drawRastersAction->setMenuRole(QAction::NoRole); + _drawRastersAction->setCheckable(true); + _drawRastersAction->setActionGroup(mapLayersGroup); + _drawVectorsAction = new QAction(tr("Vector only"), this); + _drawVectorsAction->setMenuRole(QAction::NoRole); + _drawVectorsAction->setCheckable(true); + _drawVectorsAction->setActionGroup(mapLayersGroup); // Position _showPositionAction = new QAction(QIcon::fromTheme(SHOW_POS_NAME, @@ -677,6 +692,11 @@ void GUI::createMenus() _mapMenu->addAction(_loadMapDirAction); _mapMenu->addAction(_clearMapCacheAction); _mapMenu->addSeparator(); + QMenu *layersMenu = _mapMenu->addMenu(tr("Layers")); + layersMenu->menuAction()->setMenuRole(QAction::NoRole); + layersMenu->addAction(_drawAllAction); + layersMenu->addAction(_drawRastersAction); + layersMenu->addAction(_drawVectorsAction); _mapMenu->addAction(_showCoordinatesAction); _mapMenu->addSeparator(); _mapMenu->addAction(_showMapAction); @@ -1462,7 +1482,7 @@ void GUI::plotMainPage(QPainter *painter, const QRectF &rect, qreal ratio, sc = 1; } - MapView::PlotFlags flags; + MapView::Flags flags; if (_options.hiresPrint) flags |= MapView::HiRes; if (expand) @@ -1718,6 +1738,16 @@ void GUI::showPathMarkerInfo(QAction *action) } } +void GUI::selectMapLayers(QAction *action) +{ + if (action == _drawVectorsAction) + _mapView->selectLayers(MapView::Layer::Vector); + else if (action == _drawRastersAction) + _mapView->selectLayers(MapView::Layer::Raster); + else + _mapView->selectLayers(MapView::Layer::Raster | MapView::Layer::Vector); +} + void GUI::loadMap() { #ifdef Q_OS_ANDROID @@ -2478,10 +2508,19 @@ void GUI::writeSettings() #endif // Q_OS_ANDROID /* Map */ + MapView::Layers ml; + if (_drawRastersAction->isChecked()) + ml = MapView::Layer::Raster; + else if (_drawVectorsAction->isChecked()) + ml = MapView::Layer::Vector; + else + ml = MapView::Layer::Raster | MapView::Layer::Vector; + settings.beginGroup(SETTINGS_MAP); WRITE(activeMap, _map->name()); WRITE(showMap, _showMapAction->isChecked()); WRITE(cursorCoordinates, _showCoordinatesAction->isChecked()); + WRITE(layers, (int)ml); settings.endGroup(); /* Graph */ @@ -2716,6 +2755,15 @@ void GUI::readSettings(QString &activeMap, QStringList &disabledPOIs, _showCoordinatesAction->setChecked(true); _mapView->showCursorCoordinates(true); } + int layers = READ(layers).toInt(); + if (layers == MapView::Layer::Raster) { + _drawRastersAction->setChecked(true); + _mapView->selectLayers(MapView::Layer::Raster); + } else if (layers == MapView::Layer::Vector) { + _drawVectorsAction->setChecked(true); + _mapView->selectLayers(MapView::Layer::Vector); + } else + _drawAllAction->setChecked(true); activeMap = READ(activeMap).toString(); settings.endGroup(); @@ -2831,10 +2879,10 @@ void GUI::readSettings(QString &activeMap, QStringList &disabledPOIs, /* DEM */ settings.beginGroup(SETTINGS_DEM); - if (READ(drawHillShading).toBool()) { + if (READ(drawHillShading).toBool()) _drawHillShadingAction->setChecked(true); - _mapView->drawHillShading(true); - } + else + _mapView->drawHillShading(false); settings.endGroup(); /* Position */ diff --git a/src/GUI/gui.h b/src/GUI/gui.h index 1d96e311..3b3dd7cc 100644 --- a/src/GUI/gui.h +++ b/src/GUI/gui.h @@ -68,6 +68,7 @@ private slots: void showGraphGrids(bool show); void showGraphSliderInfo(bool show); void showPathMarkerInfo(QAction *action); + void selectMapLayers(QAction *action); #ifdef Q_OS_ANDROID void showGraphTabs(bool show); #else // Q_OS_ANDROID @@ -298,6 +299,9 @@ private: QAction *_downloadMapDEMAction; QAction *_showDEMTilesAction; QAction *_drawHillShadingAction; + QAction *_drawRastersAction; + QAction *_drawVectorsAction; + QAction *_drawAllAction; QAction *_mapsEnd; QAction *_poisEnd; #ifndef Q_OS_ANDROID diff --git a/src/GUI/mapview.cpp b/src/GUI/mapview.cpp index 9d91f052..04e439fa 100644 --- a/src/GUI/mapview.cpp +++ b/src/GUI/mapview.cpp @@ -62,7 +62,8 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent) : QGraphicsView(parent) _outputProjection = PCS::pcs(3857); _inputProjection = GCS::gcs(4326); _hidpi = true; - _hillShading = false; + _hillShading = true; + _layers = Layer::Raster | Layer::Vector; _map = map; _map->load(_inputProjection, _outputProjection, _deviceRatio, _hidpi); connect(_map, &Map::tilesLoaded, this, &MapView::reloadMap); @@ -683,7 +684,7 @@ void MapView::keyReleaseEvent(QKeyEvent *event) } void MapView::plot(QPainter *painter, const QRectF &target, qreal scale, - PlotFlags flags) + Flags flags) { QRect orig, adj; qreal ratio, diff, q, p; @@ -1115,6 +1116,10 @@ void MapView::drawBackground(QPainter *painter, const QRectF &rect) flags = Map::OpenGL; if (_hillShading) flags |= Map::HillShading; + if (_layers & Layer::Raster) + flags |= Map::Rasters; + if (_layers & Layer::Vector) + flags |= Map::Vectors; _map->draw(painter, ir, flags); } @@ -1252,6 +1257,13 @@ void MapView::drawHillShading(bool draw) setMap(_map); } +void MapView::selectLayers(Layers layers) +{ + _layers = layers; + + setMap(_map); +} + void MapView::useStyles(bool use) { GraphicsItem::useStyle(use); diff --git a/src/GUI/mapview.h b/src/GUI/mapview.h index 3cd51067..2bee70e3 100644 --- a/src/GUI/mapview.h +++ b/src/GUI/mapview.h @@ -51,7 +51,14 @@ public: HiRes = 1, Expand = 2 }; - Q_DECLARE_FLAGS(PlotFlags, Flag) + Q_DECLARE_FLAGS(Flags, Flag) + + enum Layer { + NoLayers = 0, + Raster = 1, + Vector = 2 + }; + Q_DECLARE_FLAGS(Layers, Layer) MapView(Map *map, POI *poi, QWidget *parent = 0); @@ -66,8 +73,7 @@ public: void setGraph(int index); void showExtendedInfo(bool show) {_scene->showExtendedInfo(show);} - void plot(QPainter *painter, const QRectF &target, qreal scale, - PlotFlags flags); + void plot(QPainter *painter, const QRectF &target, qreal scale, Flags flags); void clear(); @@ -130,6 +136,7 @@ public slots: void showMotionInfo(bool show); void useStyles(bool use); void drawHillShading(bool draw); + void selectLayers(Layers layers); private slots: void updatePOI(); @@ -209,6 +216,7 @@ private: bool _infoBackground; bool _hillShading; + Layers _layers; int _digitalZoom; bool _plot; @@ -222,4 +230,6 @@ private: int _wheelDelta; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(MapView::Layers) + #endif // MAPVIEW_H diff --git a/src/GUI/settings.cpp b/src/GUI/settings.cpp index 2f44299c..a367ca85 100644 --- a/src/GUI/settings.cpp +++ b/src/GUI/settings.cpp @@ -5,6 +5,7 @@ #include #include "common/config.h" #include "data/graph.h" +#include "GUI/mapview.h" #include "format.h" #include "units.h" #include "timetype.h" @@ -31,6 +32,8 @@ ? QPageSize::PageSizeId::Letter \ : QPageSize::PageSizeId::A4) +#define ALL_LAYERS (int)(MapView::Layer::Raster | MapView::Layer::Vector) + #ifdef Q_OS_ANDROID #define PIXMAP_CACHE 384 #define DEM_CACHE 128 @@ -144,6 +147,7 @@ SETTING(showToolbars, "toolbar", true ); SETTING(activeMap, "map", "Open Street Map" ); SETTING(showMap, "show", true ); SETTING(cursorCoordinates, "coordinates", false ); +SETTING(layers, "layers", ALL_LAYERS ); /* Graph */ SETTING(showGraphs, "show", true ); diff --git a/src/GUI/settings.h b/src/GUI/settings.h index ec4a238b..10433693 100644 --- a/src/GUI/settings.h +++ b/src/GUI/settings.h @@ -95,6 +95,7 @@ public: static const Setting activeMap; static const Setting showMap; static const Setting cursorCoordinates; + static const Setting layers; /* Graph */ static const Setting showGraphs; diff --git a/src/map/IMG/rastertile.cpp b/src/map/IMG/rastertile.cpp index f07e8ceb..936fd6b0 100644 --- a/src/map/IMG/rastertile.cpp +++ b/src/map/IMG/rastertile.cpp @@ -114,8 +114,11 @@ const QFont *RasterTile::poiFont(Style::FontSize size, int zoom, } } -void RasterTile::ll2xy(QList &polys) const +void RasterTile::ll2xy(QList &polys, bool polygons) 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++) { @@ -127,6 +130,9 @@ void RasterTile::ll2xy(QList &polys) const void RasterTile::ll2xy(QList &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()); @@ -145,6 +151,9 @@ void RasterTile::drawPolygons(QPainter *painter, continue; if (poly.raster.isValid()) { + if (!_rasters) + continue; + RectC r(poly.raster.rect()); QPointF tl(ll2xy(r.topLeft())); QPointF br(ll2xy(r.bottomRight())); @@ -173,6 +182,9 @@ void RasterTile::drawPolygons(QPainter *painter, //painter->drawRect(QRectF(tl, br)); //painter->setRenderHint(QPainter::Antialiasing); } else { + if (!_vectors) + continue; + const Style::Polygon &style = _data->style()->polygon(poly.type); painter->setPen(style.pen()); @@ -186,6 +198,9 @@ void RasterTile::drawPolygons(QPainter *painter, void RasterTile::drawLines(QPainter *painter, const QList &lines) const { + if (!_vectors) + return; + painter->setBrush(Qt::NoBrush); for (int i = 0; i < lines.size(); i++) { @@ -238,6 +253,9 @@ void RasterTile::processPolygons(const QList &polygons, QSet set; QList labels; + if (!_vectors) + return; + for (int i = 0; i < polygons.size(); i++) { const MapData::Poly &poly = polygons.at(i); bool exists = set.contains(poly.label.text()); @@ -272,6 +290,9 @@ void RasterTile::processPolygons(const QList &polygons, void RasterTile::processLines(QList &lines, QList &textItems, const QImage (&arrows)[2]) { + if (!_vectors) + return; + std::stable_sort(lines.begin(), lines.end()); if (_zoom >= 22) @@ -390,6 +411,9 @@ void RasterTile::processShields(const QList &lines, void RasterTile::processPoints(QList &points, QList &textItems) { + if (!_vectors) + return; + std::sort(points.begin(), points.end()); for (int i = 0; i < points.size(); i++) { @@ -511,8 +535,8 @@ void RasterTile::render() arrows[WATER] = HIDPI_IMG(":/map", "water-arrow", _ratio); fetchData(polygons, lines, points); - ll2xy(polygons); - ll2xy(lines); + ll2xy(polygons, true); + ll2xy(lines, false); ll2xy(points); processPoints(points, textItems); diff --git a/src/map/IMG/rastertile.h b/src/map/IMG/rastertile.h index 40422a69..2a828a24 100644 --- a/src/map/IMG/rastertile.h +++ b/src/map/IMG/rastertile.h @@ -19,9 +19,10 @@ class RasterTile public: RasterTile(const Projection &proj, const Transform &transform, MapData *data, int zoom, const QRect &rect, qreal ratio, const QString &key, - bool hillShading) + bool hillShading, bool rasters, bool vectors) : _proj(proj), _transform(transform), _data(data), _zoom(zoom), - _rect(rect), _ratio(ratio), _key(key), _hillShading(hillShading) {} + _rect(rect), _ratio(ratio), _key(key), _hillShading(hillShading), + _rasters(rasters), _vectors(vectors) {} const QString &key() const {return _key;} QPoint xy() const {return _rect.topLeft();} @@ -53,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 &polys) const; + void ll2xy(QList &polys, bool polygons) const; void ll2xy(QList &points) const; void drawPolygons(QPainter *painter, const QList &polygons) const; @@ -86,6 +87,7 @@ private: QString _key; QPixmap _pixmap; bool _hillShading; + bool _rasters, _vectors; }; } diff --git a/src/map/imgmap.cpp b/src/map/imgmap.cpp index 1d027166..d120ccf5 100644 --- a/src/map/imgmap.cpp +++ b/src/map/imgmap.cpp @@ -246,7 +246,8 @@ void IMGMap::draw(QPainter *painter, const QRectF &rect, Flags flags) else { tiles.append(RasterTile(_projection, _transform, _data.at(n), _zoom, QRect(ttl, QSize(TILE_SIZE, TILE_SIZE)), _tileRatio, - key, !n && flags & Map::HillShading)); + key, !n && flags & Map::HillShading, flags & Map::Rasters, + flags & Map::Vectors)); } } } diff --git a/src/map/map.h b/src/map/map.h index ddbea2fa..0b8e5963 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -21,7 +21,9 @@ public: NoFlags = 0, Block = 1, OpenGL = 2, - HillShading = 4 + HillShading = 4, + Rasters = 8, + Vectors = 16 }; Q_DECLARE_FLAGS(Flags, Flag)