From 5b3d936521040149e343f81ed4bd2ce24b75e690 Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Sun, 3 Jul 2022 20:30:46 +0200 Subject: [PATCH] [qt] Rename QMapboxGL to QMapLibreGL (#338) * Rename QMapboxGL to QMapLibreGL * Add missing QDebug includes * Fix Qt CMake config * Fix geojson warning * Remove redundant OpenGL dependency * Put everything under QMapLibreGL namespace * Reorganise headers Co-authored-by: Rinigus --- ...ig.cmake.in => QMapLibreGLConfig.cmake.in} | 8 +- platform/qt/app/main.cpp | 2 +- platform/qt/app/mapwindow.cpp | 60 +- platform/qt/app/mapwindow.hpp | 21 +- platform/qt/config.qdocconf | 6 +- platform/qt/include/QMapLibreGL/Map | 1 + platform/qt/include/QMapLibreGL/Settings | 1 + platform/qt/include/QMapLibreGL/Types | 1 + platform/qt/include/QMapLibreGL/Utils | 1 + platform/qt/include/QMapLibreGL/export.hpp | 16 + .../{qmapboxgl.hpp => QMapLibreGL/map.hpp} | 177 +--- platform/qt/include/QMapLibreGL/settings.hpp | 112 +++ .../{qmapbox.hpp => QMapLibreGL/types.hpp} | 70 +- platform/qt/include/QMapLibreGL/utils.hpp | 25 + platform/qt/include/QMapbox | 1 - platform/qt/include/QMapboxGL | 1 - platform/qt/ninja.exe | Bin 504320 -> 0 bytes platform/qt/qt.cmake | 242 ++--- platform/qt/src/{qmapboxgl.cpp => map.cpp} | 851 +++++------------- .../qt/src/{qmapboxgl_p.hpp => map_p.hpp} | 33 +- platform/qt/src/{ => mbgl}/async_task.cpp | 0 .../qt/src/{ => mbgl}/async_task_impl.hpp | 0 platform/qt/src/{ => mbgl}/bidi.cpp | 0 platform/qt/src/{ => mbgl}/gl_functions.cpp | 0 .../qt/src/{ => mbgl}/headless_backend_qt.cpp | 0 .../qt/src/{ => mbgl}/http_file_source.cpp | 0 .../qt/src/{ => mbgl}/http_file_source.hpp | 0 platform/qt/src/{ => mbgl}/http_request.cpp | 2 +- platform/qt/src/{ => mbgl}/http_request.hpp | 0 .../qt/src/{qt_image.cpp => mbgl/image.cpp} | 0 .../src/{ => mbgl}/local_glyph_rasterizer.cpp | 0 .../{qt_logging.cpp => mbgl/logging_qt.cpp} | 0 platform/qt/src/{ => mbgl}/number_format.cpp | 0 platform/qt/src/{ => mbgl}/run_loop.cpp | 0 platform/qt/src/{ => mbgl}/run_loop_impl.hpp | 0 platform/qt/src/{ => mbgl}/sqlite3.cpp | 0 platform/qt/src/{ => mbgl}/string_stdlib.cpp | 0 platform/qt/src/{ => mbgl}/thread.cpp | 0 platform/qt/src/{ => mbgl}/thread_local.cpp | 0 platform/qt/src/{ => mbgl}/timer.cpp | 0 platform/qt/src/{ => mbgl}/timer_impl.hpp | 0 platform/qt/src/{ => mbgl}/utf.cpp | 0 platform/qt/src/qmapbox.cpp | 231 ----- platform/qt/src/qmapboxgl_map_observer.cpp | 118 --- .../qt/src/qmapboxgl_renderer_backend.cpp | 52 -- platform/qt/src/qt_geojson.hpp | 27 - platform/qt/src/settings.cpp | 411 +++++++++ platform/qt/src/types.cpp | 172 ++++ platform/qt/src/utils.cpp | 74 ++ .../conversion.hpp} | 28 +- .../src/{qt_geojson.cpp => utils/geojson.cpp} | 70 +- platform/qt/src/utils/geojson.hpp | 25 + platform/qt/src/utils/map_observer.cpp | 122 +++ .../map_observer.hpp} | 22 +- .../map_renderer.cpp} | 32 +- .../map_renderer.hpp} | 26 +- platform/qt/src/utils/renderer_backend.cpp | 56 ++ .../renderer_backend.hpp} | 18 +- .../renderer_observer.hpp} | 12 +- .../scheduler.cpp} | 14 +- .../scheduler.hpp} | 12 +- platform/qt/test/main.cpp | 4 +- platform/qt/test/qmapboxgl.test.cpp | 80 -- platform/qt/test/qmapboxgl.test.hpp | 30 - platform/qt/test/qmaplibregl.test.cpp | 80 ++ platform/qt/test/qmaplibregl.test.hpp | 30 + 66 files changed, 1740 insertions(+), 1637 deletions(-) rename platform/qt/{QMapboxGLConfig.cmake.in => QMapLibreGLConfig.cmake.in} (52%) create mode 100644 platform/qt/include/QMapLibreGL/Map create mode 100644 platform/qt/include/QMapLibreGL/Settings create mode 100644 platform/qt/include/QMapLibreGL/Types create mode 100644 platform/qt/include/QMapLibreGL/Utils create mode 100644 platform/qt/include/QMapLibreGL/export.hpp rename platform/qt/include/{qmapboxgl.hpp => QMapLibreGL/map.hpp} (51%) create mode 100644 platform/qt/include/QMapLibreGL/settings.hpp rename platform/qt/include/{qmapbox.hpp => QMapLibreGL/types.hpp} (63%) create mode 100644 platform/qt/include/QMapLibreGL/utils.hpp delete mode 100644 platform/qt/include/QMapbox delete mode 100644 platform/qt/include/QMapboxGL delete mode 100755 platform/qt/ninja.exe rename platform/qt/src/{qmapboxgl.cpp => map.cpp} (61%) rename platform/qt/src/{qmapboxgl_p.hpp => map_p.hpp} (65%) rename platform/qt/src/{ => mbgl}/async_task.cpp (100%) rename platform/qt/src/{ => mbgl}/async_task_impl.hpp (100%) rename platform/qt/src/{ => mbgl}/bidi.cpp (100%) rename platform/qt/src/{ => mbgl}/gl_functions.cpp (100%) rename platform/qt/src/{ => mbgl}/headless_backend_qt.cpp (100%) rename platform/qt/src/{ => mbgl}/http_file_source.cpp (100%) rename platform/qt/src/{ => mbgl}/http_file_source.hpp (100%) rename platform/qt/src/{ => mbgl}/http_request.cpp (97%) rename platform/qt/src/{ => mbgl}/http_request.hpp (100%) rename platform/qt/src/{qt_image.cpp => mbgl/image.cpp} (100%) rename platform/qt/src/{ => mbgl}/local_glyph_rasterizer.cpp (100%) rename platform/qt/src/{qt_logging.cpp => mbgl/logging_qt.cpp} (100%) rename platform/qt/src/{ => mbgl}/number_format.cpp (100%) rename platform/qt/src/{ => mbgl}/run_loop.cpp (100%) rename platform/qt/src/{ => mbgl}/run_loop_impl.hpp (100%) rename platform/qt/src/{ => mbgl}/sqlite3.cpp (100%) rename platform/qt/src/{ => mbgl}/string_stdlib.cpp (100%) rename platform/qt/src/{ => mbgl}/thread.cpp (100%) rename platform/qt/src/{ => mbgl}/thread_local.cpp (100%) rename platform/qt/src/{ => mbgl}/timer.cpp (100%) rename platform/qt/src/{ => mbgl}/timer_impl.hpp (100%) rename platform/qt/src/{ => mbgl}/utf.cpp (100%) delete mode 100644 platform/qt/src/qmapbox.cpp delete mode 100644 platform/qt/src/qmapboxgl_map_observer.cpp delete mode 100644 platform/qt/src/qmapboxgl_renderer_backend.cpp delete mode 100644 platform/qt/src/qt_geojson.hpp create mode 100644 platform/qt/src/settings.cpp create mode 100644 platform/qt/src/types.cpp create mode 100644 platform/qt/src/utils.cpp rename platform/qt/src/{qt_conversion.hpp => utils/conversion.hpp} (90%) rename platform/qt/src/{qt_geojson.cpp => utils/geojson.cpp} (60%) create mode 100644 platform/qt/src/utils/geojson.hpp create mode 100644 platform/qt/src/utils/map_observer.cpp rename platform/qt/src/{qmapboxgl_map_observer.hpp => utils/map_observer.hpp} (70%) rename platform/qt/src/{qmapboxgl_map_renderer.cpp => utils/map_renderer.cpp} (71%) rename platform/qt/src/{qmapboxgl_map_renderer.hpp => utils/map_renderer.hpp} (61%) create mode 100644 platform/qt/src/utils/renderer_backend.cpp rename platform/qt/src/{qmapboxgl_renderer_backend.hpp => utils/renderer_backend.hpp} (72%) rename platform/qt/src/{qmapboxgl_renderer_observer.hpp => utils/renderer_observer.hpp} (83%) rename platform/qt/src/{qmapboxgl_scheduler.cpp => utils/scheduler.cpp} (73%) rename platform/qt/src/{qmapboxgl_scheduler.hpp => utils/scheduler.hpp} (67%) delete mode 100644 platform/qt/test/qmapboxgl.test.cpp delete mode 100644 platform/qt/test/qmapboxgl.test.hpp create mode 100644 platform/qt/test/qmaplibregl.test.cpp create mode 100644 platform/qt/test/qmaplibregl.test.hpp diff --git a/platform/qt/QMapboxGLConfig.cmake.in b/platform/qt/QMapLibreGLConfig.cmake.in similarity index 52% rename from platform/qt/QMapboxGLConfig.cmake.in rename to platform/qt/QMapLibreGLConfig.cmake.in index f1ed73a38..dc44d5c4a 100644 --- a/platform/qt/QMapboxGLConfig.cmake.in +++ b/platform/qt/QMapLibreGLConfig.cmake.in @@ -6,10 +6,10 @@ find_dependency(Qt@QT_VERSION_MAJOR@ find_dependency(Qt@QT_VERSION_MAJOR@ COMPONENTS Network @REQUIRED_QT_VERSION@) -if(@MBGL_WITH_QT_HEADLESS@ OR NOT @MBGL_WITH_QT_LIB_ONLY@) - find_dependency(Qt@QT_VERSION_MAJOR@ - COMPONENTS OpenGL @REQUIRED_QT_VERSION@) +if(@MBGL_QT_STATIC@ AND NOT @MBGL_QT_INSIDE_PLUGIN@ AND NOT @MBGL_QT_WITH_INTERNAL_SQLITE@) + find_dependency(Qt@QT_VERSION_MAJOR@ + COMPONENTS Sql @REQUIRED_QT_VERSION@) endif() -include("${CMAKE_CURRENT_LIST_DIR}/QMapboxGLTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/QMapLibreGLTargets.cmake") @PACKAGE_INCLUDE_QCHTARGETS@ diff --git a/platform/qt/app/main.cpp b/platform/qt/app/main.cpp index 851674b5a..0ca5cd705 100644 --- a/platform/qt/app/main.cpp +++ b/platform/qt/app/main.cpp @@ -6,7 +6,7 @@ int main(int argc, char **argv) { QApplication app(argc, argv); - QMapboxGLSettings settings; + QMapLibreGL::Settings settings; settings.setCacheDatabasePath("/tmp/mbgl-cache.db"); settings.setCacheDatabaseMaximumSize(20 * 1024 * 1024); diff --git a/platform/qt/app/mapwindow.cpp b/platform/qt/app/mapwindow.cpp index 7f657ed08..b1d0ce148 100644 --- a/platform/qt/app/mapwindow.cpp +++ b/platform/qt/app/mapwindow.cpp @@ -11,7 +11,7 @@ int kAnimationDuration = 10000; -MapWindow::MapWindow(const QMapboxGLSettings &settings) +MapWindow::MapWindow(const QMapLibreGL::Settings &settings) : m_settings(settings) { setWindowIcon(QIcon(":icon.png")); @@ -20,7 +20,7 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) MapWindow::~MapWindow() { // Make sure we have a valid context so we - // can delete the QMapboxGL. + // can delete the QMapLibreGL::Map. makeCurrent(); } @@ -64,7 +64,7 @@ void MapWindow::changeStyle() auto& styles = m_map->defaultStyles(); m_map->setStyleUrl(styles[currentStyleIndex].first); - setWindowTitle(QString("Mapbox GL: ") + styles[currentStyleIndex].second); + setWindowTitle(QString("MapLibre GL: ") + styles[currentStyleIndex].second); if (++currentStyleIndex == styles.size()) { currentStyleIndex = 0; @@ -250,10 +250,10 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) break; case Qt::Key_1: { if (m_symbolAnnotationId.isNull()) { - QMapbox::Coordinate coordinate = m_map->coordinate(); - QMapbox::SymbolAnnotation symbol { coordinate, "default_marker" }; + QMapLibreGL::Coordinate coordinate = m_map->coordinate(); + QMapLibreGL::SymbolAnnotation symbol { coordinate, "default_marker" }; m_map->addAnnotationIcon("default_marker", QImage(":default_marker.svg")); - m_symbolAnnotationId = m_map->addAnnotation(QVariant::fromValue(symbol)); + m_symbolAnnotationId = m_map->addAnnotation(QVariant::fromValue(symbol)); } else { m_map->removeAnnotation(m_symbolAnnotationId.toUInt()); m_symbolAnnotationId.clear(); @@ -262,24 +262,24 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) break; case Qt::Key_2: { if (m_lineAnnotationId.isNull()) { - QMapbox::Coordinates coordinates; + QMapLibreGL::Coordinates coordinates; coordinates.push_back(m_map->coordinateForPixel({ 0, 0 })); coordinates.push_back(m_map->coordinateForPixel({ qreal(size().width()), qreal(size().height()) })); - QMapbox::CoordinatesCollection collection; + QMapLibreGL::CoordinatesCollection collection; collection.push_back(coordinates); - QMapbox::CoordinatesCollections lineGeometry; + QMapLibreGL::CoordinatesCollections lineGeometry; lineGeometry.push_back(collection); - QMapbox::ShapeAnnotationGeometry annotationGeometry(QMapbox::ShapeAnnotationGeometry::LineStringType, lineGeometry); + QMapLibreGL::ShapeAnnotationGeometry annotationGeometry(QMapLibreGL::ShapeAnnotationGeometry::LineStringType, lineGeometry); - QMapbox::LineAnnotation line; + QMapLibreGL::LineAnnotation line; line.geometry = annotationGeometry; line.opacity = 0.5f; line.width = 1.0f; line.color = Qt::red; - m_lineAnnotationId = m_map->addAnnotation(QVariant::fromValue(line)); + m_lineAnnotationId = m_map->addAnnotation(QVariant::fromValue(line)); } else { m_map->removeAnnotation(m_lineAnnotationId.toUInt()); m_lineAnnotationId.clear(); @@ -288,26 +288,26 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) break; case Qt::Key_3: { if (m_fillAnnotationId.isNull()) { - QMapbox::Coordinates coordinates; + QMapLibreGL::Coordinates coordinates; coordinates.push_back(m_map->coordinateForPixel({ qreal(size().width()), 0 })); coordinates.push_back(m_map->coordinateForPixel({ qreal(size().width()), qreal(size().height()) })); coordinates.push_back(m_map->coordinateForPixel({ 0, qreal(size().height()) })); coordinates.push_back(m_map->coordinateForPixel({ 0, 0 })); - QMapbox::CoordinatesCollection collection; + QMapLibreGL::CoordinatesCollection collection; collection.push_back(coordinates); - QMapbox::CoordinatesCollections fillGeometry; + QMapLibreGL::CoordinatesCollections fillGeometry; fillGeometry.push_back(collection); - QMapbox::ShapeAnnotationGeometry annotationGeometry(QMapbox::ShapeAnnotationGeometry::PolygonType, fillGeometry); + QMapLibreGL::ShapeAnnotationGeometry annotationGeometry(QMapLibreGL::ShapeAnnotationGeometry::PolygonType, fillGeometry); - QMapbox::FillAnnotation fill; + QMapLibreGL::FillAnnotation fill; fill.geometry = annotationGeometry; fill.opacity = 0.5f; fill.color = Qt::green; fill.outlineColor = QVariant::fromValue(QColor(Qt::black)); - m_fillAnnotationId = m_map->addAnnotation(QVariant::fromValue(fill)); + m_fillAnnotationId = m_map->addAnnotation(QVariant::fromValue(fill)); } else { m_map->removeAnnotation(m_fillAnnotationId.toUInt()); m_fillAnnotationId.clear(); @@ -319,20 +319,20 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) m_map->removeLayer("circleLayer"); m_map->removeSource("circleSource"); } else { - QMapbox::Coordinates coordinates; + QMapLibreGL::Coordinates coordinates; coordinates.push_back(m_map->coordinate()); - QMapbox::CoordinatesCollection collection; + QMapLibreGL::CoordinatesCollection collection; collection.push_back(coordinates); - QMapbox::CoordinatesCollections point; + QMapLibreGL::CoordinatesCollections point; point.push_back(collection); - QMapbox::Feature feature(QMapbox::Feature::PointType, point, {}, {}); + QMapLibreGL::Feature feature(QMapLibreGL::Feature::PointType, point, {}, {}); QVariantMap circleSource; circleSource["type"] = "geojson"; - circleSource["data"] = QVariant::fromValue(feature); + circleSource["data"] = QVariant::fromValue(feature); m_map->addSource("circleSource", circleSource); QVariantMap circle; @@ -357,12 +357,12 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) auto coordinate = m_map->coordinate(); coordinate.first += dx; coordinate.second += dy; - return QMapbox::Feature{QMapbox::Feature::PointType, + return QMapLibreGL::Feature{QMapLibreGL::Feature::PointType, {{{coordinate}}}, {{"color", color}}, {}}; }; - // multiple features by QVector - QVector inner{ + // multiple features by QVector + QVector inner{ makePoint(0.001, 0, "red"), makePoint(0, 0.001, "green"), makePoint(0, -0.001, "blue") @@ -376,8 +376,8 @@ void MapWindow::keyPressEvent(QKeyEvent *ev) {"source", "innerCirclesSource"} }); - // multiple features by QList - QList outer{ + // multiple features by QList + QList outer{ makePoint( 0.002, 0.002, "cyan"), makePoint(-0.002, 0.002, "magenta"), makePoint( 0.002, -0.002, "yellow"), @@ -476,11 +476,11 @@ void MapWindow::wheelEvent(QWheelEvent *ev) void MapWindow::initializeGL() { - m_map.reset(new QMapboxGL(nullptr, m_settings, size(), pixelRatio())); + m_map.reset(new QMapLibreGL::Map(nullptr, m_settings, size(), pixelRatio())); connect(m_map.get(), SIGNAL(needsRendering()), this, SLOT(update())); // Set default location to Helsinki. - m_map->setCoordinateZoom(QMapbox::Coordinate(60.170448, 24.942046), 5); + m_map->setCoordinateZoom(QMapLibreGL::Coordinate(60.170448, 24.942046), 5); QString styleUrl = qgetenv("MGL_STYLE_URL"); if (styleUrl.isEmpty()) { diff --git a/platform/qt/app/mapwindow.hpp b/platform/qt/app/mapwindow.hpp index f74f1b378..7a7016f2a 100644 --- a/platform/qt/app/mapwindow.hpp +++ b/platform/qt/app/mapwindow.hpp @@ -1,11 +1,12 @@ #ifndef MAPWINDOW_H #define MAPWINDOW_H -#include +#include +#include +#include #include #include -#include #include @@ -18,7 +19,7 @@ class MapWindow : public QOpenGLWidget Q_OBJECT public: - MapWindow(const QMapboxGLSettings &); + MapWindow(const QMapLibreGL::Settings &); ~MapWindow(); void selfTest(); @@ -43,20 +44,20 @@ private: QPointF m_lastPos; - QMapboxGLSettings m_settings; - std::unique_ptr m_map{}; + QMapLibreGL::Settings m_settings; + std::unique_ptr m_map{}; - QPropertyAnimation *m_bearingAnimation; - QPropertyAnimation *m_zoomAnimation; + QPropertyAnimation *m_bearingAnimation{}; + QPropertyAnimation *m_zoomAnimation{}; - unsigned m_animationTicks = 0; - unsigned m_frameDraws = 0; + unsigned m_animationTicks{}; + unsigned m_frameDraws{}; QVariant m_symbolAnnotationId; QVariant m_lineAnnotationId; QVariant m_fillAnnotationId; - bool m_sourceAdded = false; + bool m_sourceAdded{}; }; #endif diff --git a/platform/qt/config.qdocconf b/platform/qt/config.qdocconf index 9d3b8a7ef..fa916dc3f 100644 --- a/platform/qt/config.qdocconf +++ b/platform/qt/config.qdocconf @@ -4,10 +4,10 @@ include($QT_INSTALL_DOCS/global/compat.qdocconf) include($QT_INSTALL_DOCS/global/fileextensions.qdocconf) include($QT_INSTALL_DOCS/global/qt-html-templates-online.qdocconf) -Cpp.ignoretokens = Q_MAPBOXGL_EXPORT +Cpp.ignoretokens = Q_MAPLIBRE_EXPORT -project = QMapboxGL -description = Mapbox Maps SDK for Qt +project = QMapLibreGL +description = MapLibre GL Maps SDK for Qt language = Cpp outputdir = docs diff --git a/platform/qt/include/QMapLibreGL/Map b/platform/qt/include/QMapLibreGL/Map new file mode 100644 index 000000000..37ff787a6 --- /dev/null +++ b/platform/qt/include/QMapLibreGL/Map @@ -0,0 +1 @@ +#include "map.hpp" diff --git a/platform/qt/include/QMapLibreGL/Settings b/platform/qt/include/QMapLibreGL/Settings new file mode 100644 index 000000000..4f6be8538 --- /dev/null +++ b/platform/qt/include/QMapLibreGL/Settings @@ -0,0 +1 @@ +#include "settings.hpp" diff --git a/platform/qt/include/QMapLibreGL/Types b/platform/qt/include/QMapLibreGL/Types new file mode 100644 index 000000000..0be9e32cf --- /dev/null +++ b/platform/qt/include/QMapLibreGL/Types @@ -0,0 +1 @@ +#include "types.hpp" diff --git a/platform/qt/include/QMapLibreGL/Utils b/platform/qt/include/QMapLibreGL/Utils new file mode 100644 index 000000000..0ee624c51 --- /dev/null +++ b/platform/qt/include/QMapLibreGL/Utils @@ -0,0 +1 @@ +#include "utils.hpp" diff --git a/platform/qt/include/QMapLibreGL/export.hpp b/platform/qt/include/QMapLibreGL/export.hpp new file mode 100644 index 000000000..9d4b14d36 --- /dev/null +++ b/platform/qt/include/QMapLibreGL/export.hpp @@ -0,0 +1,16 @@ +#ifndef QMAPLIBRE_EXPORT_H +#define QMAPLIBRE_EXPORT_H + +// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style + +#if !defined(QT_MAPLIBREGL_STATIC) +# if defined(QT_BUILD_MAPLIBREGL_LIB) +# define Q_MAPLIBREGL_EXPORT Q_DECL_EXPORT +# else +# define Q_MAPLIBREGL_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_MAPLIBREGL_EXPORT +#endif + +#endif // QMAPLIBRE_EXPORT_H diff --git a/platform/qt/include/qmapboxgl.hpp b/platform/qt/include/QMapLibreGL/map.hpp similarity index 51% rename from platform/qt/include/qmapboxgl.hpp rename to platform/qt/include/QMapLibreGL/map.hpp index 351a1d954..4b6450ca6 100644 --- a/platform/qt/include/qmapboxgl.hpp +++ b/platform/qt/include/QMapLibreGL/map.hpp @@ -1,8 +1,10 @@ -#ifndef QMAPBOXGL_H -#define QMAPBOXGL_H +#ifndef QMAPLIBREGL_MAP_H +#define QMAPLIBREGL_MAP_H + +#include +#include #include -#include #include #include #include @@ -13,113 +15,13 @@ #include #include -class QMapboxGLPrivate; +namespace QMapLibreGL { + +class MapPrivate; // This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style -// TODO: this will be wrapped at some point -namespace mbgl -{ - class TileServerOptions; -} - -class Q_MAPBOXGL_EXPORT QMapboxGLSettings -{ -public: - QMapboxGLSettings(); - - enum GLContextMode { - UniqueGLContext = 0, - SharedGLContext - }; - - enum MapMode { - Continuous = 0, - Static - }; - - enum ConstrainMode { - NoConstrain = 0, - ConstrainHeightOnly, - ConstrainWidthAndHeight - }; - - enum ViewportMode { - DefaultViewport = 0, - FlippedYViewport - }; - - enum SettingsTemplate { - DefaultSettings = 0, - MapLibreSettings, - MapTilerSettings, - MapboxSettings - }; - - GLContextMode contextMode() const; - void setContextMode(GLContextMode); - - MapMode mapMode() const; - void setMapMode(MapMode); - - ConstrainMode constrainMode() const; - void setConstrainMode(ConstrainMode); - - ViewportMode viewportMode() const; - void setViewportMode(ViewportMode); - - unsigned cacheDatabaseMaximumSize() const; - void setCacheDatabaseMaximumSize(unsigned); - - QString cacheDatabasePath() const; - void setCacheDatabasePath(const QString &); - - QString assetPath() const; - void setAssetPath(const QString &); - - QString apiKey() const; - void setApiKey(const QString &); - - QString apiBaseUrl() const; - void setApiBaseUrl(const QString &); - - QString localFontFamily() const; - void setLocalFontFamily(const QString &); - - std::function resourceTransform() const; - void setResourceTransform(const std::function &); - - void resetToTemplate(SettingsTemplate); - - QVector> defaultStyles() const; - - mbgl::TileServerOptions *tileServerOptionsInternal() const; - -private: - GLContextMode m_contextMode; - MapMode m_mapMode; - ConstrainMode m_constrainMode; - ViewportMode m_viewportMode; - - unsigned m_cacheMaximumSize; - QString m_cacheDatabasePath; - QString m_assetPath; - QString m_apiKey; - QString m_localFontFamily; - std::function m_resourceTransform; - - mbgl::TileServerOptions *m_tileServerOptionsInternal{}; -}; - -struct Q_MAPBOXGL_EXPORT QMapboxGLCameraOptions { - QVariant center; // Coordinate - QVariant anchor; // QPointF - QVariant zoom; // double - QVariant bearing; // double - QVariant pitch; // double -}; - -class Q_MAPBOXGL_EXPORT QMapboxGL : public QObject +class Q_MAPLIBREGL_EXPORT Map : public QObject { Q_OBJECT Q_PROPERTY(double latitude READ latitude WRITE setLatitude) @@ -130,7 +32,7 @@ class Q_MAPBOXGL_EXPORT QMapboxGL : public QObject Q_PROPERTY(QString styleJson READ styleJson WRITE setStyleJson) Q_PROPERTY(QString styleUrl READ styleUrl WRITE setStyleUrl) Q_PROPERTY(double scale READ scale WRITE setScale) - Q_PROPERTY(QMapbox::Coordinate coordinate READ coordinate WRITE setCoordinate) + Q_PROPERTY(QMapLibreGL::Coordinate coordinate READ coordinate WRITE setCoordinate) Q_PROPERTY(QMargins margins READ margins WRITE setMargins) public: @@ -168,11 +70,11 @@ public: NorthLeftwards, }; - QMapboxGL(QObject* parent = 0, - const QMapboxGLSettings& = QMapboxGLSettings(), - const QSize& size = QSize(), - qreal pixelRatio = 1); - virtual ~QMapboxGL(); + Map(QObject* parent = 0, + const Settings& = Settings(), + const QSize& size = QSize(), + qreal pixelRatio = 1); + virtual ~Map(); QString styleJson() const; QString styleUrl() const; @@ -206,11 +108,11 @@ public: NorthOrientation northOrientation() const; void setNorthOrientation(NorthOrientation); - QMapbox::Coordinate coordinate() const; - void setCoordinate(const QMapbox::Coordinate &); - void setCoordinateZoom(const QMapbox::Coordinate &, double zoom); + Coordinate coordinate() const; + void setCoordinate(const Coordinate &); + void setCoordinateZoom(const Coordinate &, double zoom); - void jumpTo(const QMapboxGLCameraOptions&); + void jumpTo(const CameraOptions&); void setGestureInProgress(bool inProgress); @@ -218,9 +120,9 @@ public: void addAnnotationIcon(const QString &name, const QImage &sprite); - QMapbox::AnnotationID addAnnotation(const QMapbox::Annotation &); - void updateAnnotation(QMapbox::AnnotationID, const QMapbox::Annotation &); - void removeAnnotation(QMapbox::AnnotationID); + AnnotationID addAnnotation(const Annotation &); + void updateAnnotation(AnnotationID, const Annotation &); + void removeAnnotation(AnnotationID); bool setLayoutProperty(const QString &layer, const QString &property, const QVariant &value); bool setPaintProperty(const QString &layer, const QString &property, const QVariant &value); @@ -233,17 +135,14 @@ public: void resize(const QSize &size); - double metersPerPixelAtLatitude(double latitude, double zoom) const; - QMapbox::ProjectedMeters projectedMetersForCoordinate(const QMapbox::Coordinate &) const; - QMapbox::Coordinate coordinateForProjectedMeters(const QMapbox::ProjectedMeters &) const; - QPointF pixelForCoordinate(const QMapbox::Coordinate &) const; - QMapbox::Coordinate coordinateForPixel(const QPointF &) const; + QPointF pixelForCoordinate(const Coordinate &) const; + Coordinate coordinateForPixel(const QPointF &) const; - QMapbox::CoordinateZoom coordinateZoomForBounds(const QMapbox::Coordinate &sw, const QMapbox::Coordinate &ne) const; - QMapbox::CoordinateZoom coordinateZoomForBounds(const QMapbox::Coordinate &sw, - const QMapbox::Coordinate &ne, - double bearing, - double pitch); + CoordinateZoom coordinateZoomForBounds(const Coordinate &sw, const Coordinate &ne) const; + CoordinateZoom coordinateZoomForBounds(const Coordinate &sw, + const Coordinate &ne, + double bearing, + double pitch); void setMargins(const QMargins &margins); QMargins margins() const; @@ -257,7 +156,7 @@ public: void removeImage(const QString &name); void addCustomLayer(const QString &id, - std::unique_ptr host, + std::unique_ptr host, const QString &before = QString()); void addLayer(const QVariantMap ¶ms, const QString& before = QString()); bool layerExists(const QString &id); @@ -285,19 +184,21 @@ public slots: signals: void needsRendering(); - void mapChanged(QMapboxGL::MapChange); - void mapLoadingFailed(QMapboxGL::MapLoadingFailure, const QString &reason); + void mapChanged(Map::MapChange); + void mapLoadingFailed(Map::MapLoadingFailure, const QString &reason); void copyrightsChanged(const QString ©rightsHtml); void staticRenderFinished(const QString &error); private: - Q_DISABLE_COPY(QMapboxGL) + Q_DISABLE_COPY(Map) - QMapboxGLPrivate *d_ptr; + MapPrivate *d_ptr; }; -Q_DECLARE_METATYPE(QMapboxGL::MapChange); -Q_DECLARE_METATYPE(QMapboxGL::MapLoadingFailure); +} // namespace QMapLibreGL -#endif // QMAPBOXGL_H +Q_DECLARE_METATYPE(QMapLibreGL::Map::MapChange); +Q_DECLARE_METATYPE(QMapLibreGL::Map::MapLoadingFailure); + +#endif // QMAPLIBREGL_MAP_H diff --git a/platform/qt/include/QMapLibreGL/settings.hpp b/platform/qt/include/QMapLibreGL/settings.hpp new file mode 100644 index 000000000..5091cbbfa --- /dev/null +++ b/platform/qt/include/QMapLibreGL/settings.hpp @@ -0,0 +1,112 @@ +#ifndef QMAPLIBREGL_SETTINGS_H +#define QMAPLIBREGL_SETTINGS_H + +#include +#include + +#include + +#include "export.hpp" + +// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style + +// TODO: this will be wrapped at some point +namespace mbgl +{ + class TileServerOptions; +} + + +namespace QMapLibreGL { + +class Q_MAPLIBREGL_EXPORT Settings +{ +public: + Settings(); + + enum GLContextMode { + UniqueGLContext = 0, + SharedGLContext + }; + + enum MapMode { + Continuous = 0, + Static + }; + + enum ConstrainMode { + NoConstrain = 0, + ConstrainHeightOnly, + ConstrainWidthAndHeight + }; + + enum ViewportMode { + DefaultViewport = 0, + FlippedYViewport + }; + + enum SettingsTemplate { + DefaultSettings = 0, + MapLibreSettings, + MapTilerSettings, + MapboxSettings + }; + + GLContextMode contextMode() const; + void setContextMode(GLContextMode); + + MapMode mapMode() const; + void setMapMode(MapMode); + + ConstrainMode constrainMode() const; + void setConstrainMode(ConstrainMode); + + ViewportMode viewportMode() const; + void setViewportMode(ViewportMode); + + unsigned cacheDatabaseMaximumSize() const; + void setCacheDatabaseMaximumSize(unsigned); + + QString cacheDatabasePath() const; + void setCacheDatabasePath(const QString &); + + QString assetPath() const; + void setAssetPath(const QString &); + + QString apiKey() const; + void setApiKey(const QString &); + + QString apiBaseUrl() const; + void setApiBaseUrl(const QString &); + + QString localFontFamily() const; + void setLocalFontFamily(const QString &); + + std::function resourceTransform() const; + void setResourceTransform(const std::function &); + + void resetToTemplate(SettingsTemplate); + + QVector> defaultStyles() const; + + mbgl::TileServerOptions *tileServerOptionsInternal() const; + +private: + GLContextMode m_contextMode; + MapMode m_mapMode; + ConstrainMode m_constrainMode; + ViewportMode m_viewportMode; + + unsigned m_cacheMaximumSize; + QString m_cacheDatabasePath; + QString m_assetPath; + QString m_apiKey; + QString m_localFontFamily; + std::function m_resourceTransform; + + mbgl::TileServerOptions *m_tileServerOptionsInternal{}; +}; + +} // namespace QMapLibreGL + +#endif // QMAPLIBREGL_SETTINGS_H diff --git a/platform/qt/include/qmapbox.hpp b/platform/qt/include/QMapLibreGL/types.hpp similarity index 63% rename from platform/qt/include/qmapbox.hpp rename to platform/qt/include/QMapLibreGL/types.hpp index e9642343b..ce601d318 100644 --- a/platform/qt/include/qmapbox.hpp +++ b/platform/qt/include/QMapLibreGL/types.hpp @@ -1,5 +1,5 @@ -#ifndef QMAPBOX_H -#define QMAPBOX_H +#ifndef QMAPLIBREGL_TYPES_H +#define QMAPLIBREGL_TYPES_H #include #include @@ -7,19 +7,9 @@ #include #include -// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style +#include "export.hpp" -#if !defined(QT_MAPBOXGL_STATIC) -# if defined(QT_BUILD_MAPBOXGL_LIB) -# define Q_MAPBOXGL_EXPORT Q_DECL_EXPORT -# else -# define Q_MAPBOXGL_EXPORT Q_DECL_IMPORT -# endif -#else -# define Q_MAPBOXGL_EXPORT -#endif - -namespace QMapbox { +namespace QMapLibreGL { typedef QPair Coordinate; typedef QPair CoordinateZoom; @@ -30,7 +20,7 @@ typedef QVector CoordinatesCollection; typedef QVector CoordinatesCollections; -struct Q_MAPBOXGL_EXPORT Feature { +struct Q_MAPLIBREGL_EXPORT Feature { enum Type { PointType = 1, LineStringType, @@ -48,7 +38,7 @@ struct Q_MAPBOXGL_EXPORT Feature { QVariant id; }; -struct Q_MAPBOXGL_EXPORT ShapeAnnotationGeometry { +struct Q_MAPLIBREGL_EXPORT ShapeAnnotationGeometry { enum Type { LineStringType = 1, PolygonType, @@ -64,12 +54,12 @@ struct Q_MAPBOXGL_EXPORT ShapeAnnotationGeometry { CoordinatesCollections geometry; }; -struct Q_MAPBOXGL_EXPORT SymbolAnnotation { +struct Q_MAPLIBREGL_EXPORT SymbolAnnotation { Coordinate geometry; QString icon; }; -struct Q_MAPBOXGL_EXPORT LineAnnotation { +struct Q_MAPLIBREGL_EXPORT LineAnnotation { /*! Class constructor. */ LineAnnotation(const ShapeAnnotationGeometry& geometry_ = ShapeAnnotationGeometry(), float opacity_ = 1.0f, float width_ = 1.0f, const QColor& color_ = Qt::black) @@ -81,7 +71,7 @@ struct Q_MAPBOXGL_EXPORT LineAnnotation { QColor color; }; -struct Q_MAPBOXGL_EXPORT FillAnnotation { +struct Q_MAPLIBREGL_EXPORT FillAnnotation { /*! Class constructor. */ FillAnnotation(const ShapeAnnotationGeometry& geometry_ = ShapeAnnotationGeometry(), float opacity_ = 1.0f, const QColor& color_ = Qt::black, const QVariant& outlineColor_ = QVariant()) @@ -97,16 +87,16 @@ typedef QVariant Annotation; typedef quint32 AnnotationID; typedef QVector AnnotationIDs; -enum NetworkMode { - Online, // Default - Offline, +struct Q_MAPLIBREGL_EXPORT CameraOptions { + QVariant center; // Coordinate + QVariant anchor; // QPointF + QVariant zoom; // double + QVariant bearing; // double + QVariant pitch; // double }; -Q_MAPBOXGL_EXPORT NetworkMode networkMode(); -Q_MAPBOXGL_EXPORT void setNetworkMode(NetworkMode); - // This struct is a 1:1 copy of mbgl::CustomLayerRenderParameters. -struct Q_MAPBOXGL_EXPORT CustomLayerRenderParameters { +struct Q_MAPLIBREGL_EXPORT CustomLayerRenderParameters { double width; double height; double latitude; @@ -117,7 +107,7 @@ struct Q_MAPBOXGL_EXPORT CustomLayerRenderParameters { double fieldOfView; }; -class Q_MAPBOXGL_EXPORT CustomLayerHostInterface { +class Q_MAPLIBREGL_EXPORT CustomLayerHostInterface { public: virtual ~CustomLayerHostInterface() = default; virtual void initialize() = 0; @@ -125,21 +115,17 @@ public: virtual void deinitialize() = 0; }; -Q_MAPBOXGL_EXPORT double metersPerPixelAtLatitude(double latitude, double zoom); -Q_MAPBOXGL_EXPORT ProjectedMeters projectedMetersForCoordinate(const Coordinate &); -Q_MAPBOXGL_EXPORT Coordinate coordinateForProjectedMeters(const ProjectedMeters &); +} // namespace QMapLibreGL -} // namespace QMapbox +Q_DECLARE_METATYPE(QMapLibreGL::Coordinate); +Q_DECLARE_METATYPE(QMapLibreGL::Coordinates); +Q_DECLARE_METATYPE(QMapLibreGL::CoordinatesCollection); +Q_DECLARE_METATYPE(QMapLibreGL::CoordinatesCollections); +Q_DECLARE_METATYPE(QMapLibreGL::Feature); -Q_DECLARE_METATYPE(QMapbox::Coordinate); -Q_DECLARE_METATYPE(QMapbox::Coordinates); -Q_DECLARE_METATYPE(QMapbox::CoordinatesCollection); -Q_DECLARE_METATYPE(QMapbox::CoordinatesCollections); -Q_DECLARE_METATYPE(QMapbox::Feature); +Q_DECLARE_METATYPE(QMapLibreGL::SymbolAnnotation); +Q_DECLARE_METATYPE(QMapLibreGL::ShapeAnnotationGeometry); +Q_DECLARE_METATYPE(QMapLibreGL::LineAnnotation); +Q_DECLARE_METATYPE(QMapLibreGL::FillAnnotation); -Q_DECLARE_METATYPE(QMapbox::SymbolAnnotation); -Q_DECLARE_METATYPE(QMapbox::ShapeAnnotationGeometry); -Q_DECLARE_METATYPE(QMapbox::LineAnnotation); -Q_DECLARE_METATYPE(QMapbox::FillAnnotation); - -#endif // QMAPBOX_H +#endif // QMAPLIBREGL_TYPES_H diff --git a/platform/qt/include/QMapLibreGL/utils.hpp b/platform/qt/include/QMapLibreGL/utils.hpp new file mode 100644 index 000000000..a1143a041 --- /dev/null +++ b/platform/qt/include/QMapLibreGL/utils.hpp @@ -0,0 +1,25 @@ +#ifndef QMAPLIBREGL_UTILS_H +#define QMAPLIBREGL_UTILS_H + +#include "export.hpp" +#include "types.hpp" + +// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style + +namespace QMapLibreGL { + +enum NetworkMode { + Online, // Default + Offline, +}; + +Q_MAPLIBREGL_EXPORT NetworkMode networkMode(); +Q_MAPLIBREGL_EXPORT void setNetworkMode(NetworkMode); + +Q_MAPLIBREGL_EXPORT double metersPerPixelAtLatitude(double latitude, double zoom); +Q_MAPLIBREGL_EXPORT ProjectedMeters projectedMetersForCoordinate(const Coordinate &); +Q_MAPLIBREGL_EXPORT Coordinate coordinateForProjectedMeters(const ProjectedMeters &); + +} // namespace QMapLibreGL + +#endif // QMAPLIBREGL_UTILS_H diff --git a/platform/qt/include/QMapbox b/platform/qt/include/QMapbox deleted file mode 100644 index a8479c09a..000000000 --- a/platform/qt/include/QMapbox +++ /dev/null @@ -1 +0,0 @@ -#include "qmapbox.hpp" diff --git a/platform/qt/include/QMapboxGL b/platform/qt/include/QMapboxGL deleted file mode 100644 index 15b55a9ab..000000000 --- a/platform/qt/include/QMapboxGL +++ /dev/null @@ -1 +0,0 @@ -#include "qmapboxgl.hpp" diff --git a/platform/qt/ninja.exe b/platform/qt/ninja.exe deleted file mode 100755 index f86ef0738245f417b570ed6cec75aeb6499078a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504320 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%0D5XOvI%DWG#U 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 z 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 SJ5Zaf?,default/src/mbgl/text/bidi.cpp,qt/src/bidi.cpp> + ${PROJECT_SOURCE_DIR}/platform/$,default/src/mbgl/text/bidi.cpp,qt/src/mbgl/bidi.cpp> ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_backend.hpp ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_frontend.hpp ${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gl/headless_backend.hpp @@ -94,43 +91,31 @@ target_sources( ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp - ${PROJECT_SOURCE_DIR}/platform/$,default/src/mbgl/storage/sqlite3.cpp,qt/src/sqlite3.cpp> + ${PROJECT_SOURCE_DIR}/platform/$,default/src/mbgl/storage/sqlite3.cpp,qt/src/mbgl/sqlite3.cpp> ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/async_task.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/async_task_impl.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/number_format.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/gl_functions.cpp - $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/http_file_source.cpp> - $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/http_file_source.hpp> - $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/http_request.cpp> - $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/http_request.hpp> - ${PROJECT_SOURCE_DIR}/platform/qt/src/local_glyph_rasterizer.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qt_image.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qt_logging.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/run_loop.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/run_loop_impl.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/string_stdlib.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/thread.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/thread_local.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/timer.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/timer_impl.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/utf.cpp + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/headless_backend_qt.cpp> + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/async_task.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/async_task_impl.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/gl_functions.cpp + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_file_source.cpp> + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_file_source.hpp> + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_request.cpp> + $<$:${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/http_request.hpp> + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/image.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/number_format.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/local_glyph_rasterizer.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/logging_qt.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/run_loop.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/run_loop_impl.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/string_stdlib.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/thread.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/thread_local.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/timer.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/timer_impl.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/mbgl/utf.cpp ) -if(MBGL_WITH_QT_HEADLESS OR NOT MBGL_QT_LIBRARY_ONLY) - target_sources( - mbgl-core - PRIVATE - ${PROJECT_SOURCE_DIR}/platform/qt/src/headless_backend_qt.cpp - ) - target_link_libraries( - mbgl-core - PRIVATE - Qt${QT_VERSION_MAJOR}::OpenGL - ) -endif() - target_compile_definitions( mbgl-core PRIVATE QT_IMAGE_DECODERS @@ -159,84 +144,100 @@ target_link_libraries( mbgl-vendor-nunicode ) -set(qmapboxgl_headers - ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapbox - ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapboxGL - ${PROJECT_SOURCE_DIR}/platform/qt/include/qmapbox.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/include/qmapboxgl.hpp +set(qmaplibregl_headers + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/export.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/map.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/Map + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/settings.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/Settings + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/types.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/Types + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/utils.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/Utils ) if (MBGL_QT_INSIDE_PLUGIN) - add_library(qmapboxgl OBJECT) + add_library(qmaplibregl OBJECT) elseif(MBGL_QT_STATIC) - add_library(qmapboxgl STATIC) + add_library(qmaplibregl STATIC) else() - add_library(qmapboxgl SHARED) + add_library(qmaplibregl SHARED) endif() target_sources( - qmapboxgl + qmaplibregl PRIVATE - ${qmapboxgl_headers} - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapbox.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_map_observer.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_map_observer.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_map_renderer.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_map_renderer.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_p.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_renderer_backend.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_renderer_backend.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_scheduler.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_scheduler.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qt_conversion.hpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qt_geojson.cpp - ${PROJECT_SOURCE_DIR}/platform/qt/src/qt_geojson.hpp + ${qmaplibregl_headers} + ${PROJECT_SOURCE_DIR}/platform/qt/src/map.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/map_p.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/settings.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/types.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/map_observer.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/map_observer.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/map_renderer.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/map_renderer.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_backend.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_backend.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/renderer_observer.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/scheduler.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/scheduler.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/conversion.hpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/geojson.cpp + ${PROJECT_SOURCE_DIR}/platform/qt/src/utils/geojson.hpp ) # Linux/Mac: Set framework, version and headers set_target_properties( - qmapboxgl PROPERTIES + qmaplibregl PROPERTIES AUTOMOC ON - EXPORT_NAME QMapboxGL - OUTPUT_NAME QMapboxGL + EXPORT_NAME QMapLibreGL + OUTPUT_NAME QMapLibreGL VERSION ${MBGL_QT_VERSION} SOVERSION ${MBGL_QT_VERSION_COMPATIBILITY} - PUBLIC_HEADER "${qmapboxgl_headers}" + PUBLIC_HEADER "${qmaplibregl_headers}" ) -if (NOT MBGL_QT_STATIC AND NOT MBGL_QT_INSIDE_PLUGIN) +if (APPLE AND NOT MBGL_QT_STATIC AND NOT MBGL_QT_INSIDE_PLUGIN) set_target_properties( - qmapboxgl PROPERTIES + qmaplibregl PROPERTIES FRAMEWORK ON FRAMEWORK_VERSION A + MACOSX_FRAMEWORK_IDENTIFIER org.maplibre.QMapLibreGL + MACOSX_FRAMEWORK_BUNDLE_VERSION ${MBGL_QT_VERSION} + MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${MBGL_QT_VERSION} + ) + target_include_directories( + qmaplibregl + INTERFACE + $ ) endif() include(CMakePackageConfigHelpers) -set(CMAKECONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/QMapboxGL/) +set(CMAKECONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/QMapLibreGL/) configure_package_config_file( - "platform/qt/QMapboxGLConfig.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/QMapboxGLConfig.cmake" - INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} - PATH_VARS CMAKE_INSTALL_PREFIX CMAKE_INSTALL_INCLUDEDIR - CMAKE_INSTALL_LIBDIR NO_CHECK_REQUIRED_COMPONENTS_MACRO) + "platform/qt/QMapLibreGLConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/QMapLibreGLConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} + PATH_VARS CMAKE_INSTALL_PREFIX CMAKE_INSTALL_INCLUDEDIR + CMAKE_INSTALL_LIBDIR NO_CHECK_REQUIRED_COMPONENTS_MACRO) -write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/QMapboxGLConfigVersion.cmake - VERSION ${MBGL_QT_VERSION} - COMPATIBILITY AnyNewerVersion) +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/QMapLibreGLConfigVersion.cmake + VERSION ${MBGL_QT_VERSION} + COMPATIBILITY AnyNewerVersion) -install(EXPORT QMapboxGLTargets - DESTINATION ${CMAKECONFIG_INSTALL_DIR} - COMPONENT development) +install(EXPORT QMapLibreGLTargets + DESTINATION ${CMAKECONFIG_INSTALL_DIR} + COMPONENT development) -export(EXPORT QMapboxGLTargets) +export(EXPORT QMapLibreGLTargets) install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/QMapboxGLConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/QMapboxGLConfigVersion.cmake" - DESTINATION ${CMAKECONFIG_INSTALL_DIR} - COMPONENT development) + "${CMAKE_CURRENT_BINARY_DIR}/QMapLibreGLConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/QMapLibreGLConfigVersion.cmake" + DESTINATION ${CMAKECONFIG_INSTALL_DIR} + COMPONENT development) install( DIRECTORY include/mbgl @@ -246,43 +247,54 @@ install( # FIXME: Because of rapidjson conversion target_include_directories( - qmapboxgl + qmaplibregl PRIVATE - ${PROJECT_SOURCE_DIR}/src - ${PROJECT_SOURCE_DIR}/platform/qt/include - INTERFACE - "$" + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/platform/qt/include ) target_compile_definitions( - qmapboxgl + qmaplibregl PRIVATE - QT_BUILD_MAPBOXGL_LIB + QT_BUILD_MAPLIBREGL_LIB ) target_link_libraries( - qmapboxgl + qmaplibregl PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Network PRIVATE - "$" - "$" - "$" - "$" - "$" + $ + $ + $ + $ + $ ) +# Do not use generator expressions for cleaner output +if (MBGL_QT_STATIC AND NOT MBGL_QT_INSIDE_PLUGIN) + target_link_libraries( + qmaplibregl + PUBLIC + $<$>:Qt${QT_VERSION_MAJOR}::Sql> + $<$,$>>:z> + ) + target_compile_definitions( + qmaplibregl + PUBLIC QT_MAPLIBREGL_STATIC + ) +endif() -install(TARGETS qmapboxgl - EXPORT QMapboxGLTargets +install(TARGETS qmaplibregl + EXPORT QMapLibreGLTargets # Explicit set of DESTINATION is needed for older CMake versions. RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" FRAMEWORK DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/QMapLibreGL" ) if(NOT MBGL_QT_LIBRARY_ONLY) @@ -302,12 +314,6 @@ if(NOT MBGL_QT_LIBRARY_ONLY) set_property(TARGET mbgl-qt PROPERTY CXX_STANDARD 98) set_property(TARGET mbgl-qt PROPERTY AUTOMOC ON) - target_compile_definitions( - mbgl-qt - PRIVATE - $<$,$>:QT_MAPBOXGL_STATIC> - ) - target_link_libraries( mbgl-qt PRIVATE @@ -315,7 +321,7 @@ if(NOT MBGL_QT_LIBRARY_ONLY) Qt${QT_VERSION_MAJOR}::Gui $<$:Qt${QT_VERSION_MAJOR}::OpenGLWidgets> mbgl-compiler-options - qmapboxgl + qmaplibregl ) target_include_directories( @@ -341,9 +347,7 @@ if(NOT MBGL_QT_LIBRARY_ONLY) target_link_libraries( mbgl-test-runner PRIVATE - Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Gui - Qt${QT_VERSION_MAJOR}::OpenGL mbgl-compiler-options $<$>:pthread> ) diff --git a/platform/qt/src/qmapboxgl.cpp b/platform/qt/src/map.cpp similarity index 61% rename from platform/qt/src/qmapboxgl.cpp rename to platform/qt/src/map.cpp index 0d9413aa1..3672e5cc9 100644 --- a/platform/qt/src/qmapboxgl.cpp +++ b/platform/qt/src/map.cpp @@ -1,11 +1,12 @@ -#include "qmapboxgl.hpp" -#include "qmapboxgl_p.hpp" +#include +#include -#include "qmapboxgl_map_observer.hpp" -#include "qmapboxgl_renderer_observer.hpp" +#include "map_p.hpp" -#include "qt_conversion.hpp" -#include "qt_geojson.hpp" +#include "utils/conversion.hpp" +#include "utils/geojson.hpp" +#include "utils/map_observer.hpp" +#include "utils/renderer_observer.hpp" #include #include @@ -49,52 +50,27 @@ #include #include -#include - +#include #include -#include -#include -#include -#include #include #include #include #include -#include #include #include #include -using namespace QMapbox; - #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4805) #endif -// mbgl::GLContextMode -static_assert(mbgl::underlying_type(QMapboxGLSettings::UniqueGLContext) == mbgl::underlying_type(mbgl::gfx::ContextMode::Unique), "error"); -static_assert(mbgl::underlying_type(QMapboxGLSettings::SharedGLContext) == mbgl::underlying_type(mbgl::gfx::ContextMode::Shared), "error"); - -// mbgl::MapMode -static_assert(mbgl::underlying_type(QMapboxGLSettings::Continuous) == mbgl::underlying_type(mbgl::MapMode::Continuous), "error"); -static_assert(mbgl::underlying_type(QMapboxGLSettings::Static) == mbgl::underlying_type(mbgl::MapMode::Static), "error"); - -// mbgl::ConstrainMode -static_assert(mbgl::underlying_type(QMapboxGLSettings::NoConstrain) == mbgl::underlying_type(mbgl::ConstrainMode::None), "error"); -static_assert(mbgl::underlying_type(QMapboxGLSettings::ConstrainHeightOnly) == mbgl::underlying_type(mbgl::ConstrainMode::HeightOnly), "error"); -static_assert(mbgl::underlying_type(QMapboxGLSettings::ConstrainWidthAndHeight) == mbgl::underlying_type(mbgl::ConstrainMode::WidthAndHeight), "error"); - -// mbgl::ViewportMode -static_assert(mbgl::underlying_type(QMapboxGLSettings::DefaultViewport) == mbgl::underlying_type(mbgl::ViewportMode::Default), "error"); -static_assert(mbgl::underlying_type(QMapboxGLSettings::FlippedYViewport) == mbgl::underlying_type(mbgl::ViewportMode::FlippedY), "error"); - // mbgl::NorthOrientation -static_assert(mbgl::underlying_type(QMapboxGL::NorthUpwards) == mbgl::underlying_type(mbgl::NorthOrientation::Upwards), "error"); -static_assert(mbgl::underlying_type(QMapboxGL::NorthRightwards) == mbgl::underlying_type(mbgl::NorthOrientation::Rightwards), "error"); -static_assert(mbgl::underlying_type(QMapboxGL::NorthDownwards) == mbgl::underlying_type(mbgl::NorthOrientation::Downwards), "error"); -static_assert(mbgl::underlying_type(QMapboxGL::NorthLeftwards) == mbgl::underlying_type(mbgl::NorthOrientation::Leftwards), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Map::NorthUpwards) == mbgl::underlying_type(mbgl::NorthOrientation::Upwards), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Map::NorthRightwards) == mbgl::underlying_type(mbgl::NorthOrientation::Rightwards), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Map::NorthDownwards) == mbgl::underlying_type(mbgl::NorthOrientation::Downwards), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Map::NorthLeftwards) == mbgl::underlying_type(mbgl::NorthOrientation::Leftwards), "error"); #ifdef _MSC_VER #pragma warning(pop) @@ -135,416 +111,106 @@ std::unique_ptr toStyleImage(const QString &id, const QImage 1.0); } +mbgl::MapOptions mapOptionsFromSettings(const QMapLibreGL::Settings &settings, const QSize &size, qreal pixelRatio) { + return std::move(mbgl::MapOptions() + .withSize(sanitizedSize(size)) + .withPixelRatio(pixelRatio) + .withMapMode(static_cast(settings.mapMode())) + .withConstrainMode(static_cast(settings.constrainMode())) + .withViewportMode(static_cast(settings.viewportMode()))); +} + +mbgl::ResourceOptions resourceOptionsFromSettings(const QMapLibreGL::Settings &settings) { + return std::move(mbgl::ResourceOptions() + .withApiKey(settings.apiKey().toStdString()) + .withAssetPath(settings.assetPath().toStdString()) + .withTileServerOptions(*settings.tileServerOptionsInternal()) + .withCachePath(settings.cacheDatabasePath().toStdString()) + .withMaximumCacheSize(settings.cacheDatabaseMaximumSize())); +} + + +mbgl::optional asAnnotation(const QMapLibreGL::Annotation & annotation) { + auto asGeometry = [](const QMapLibreGL::ShapeAnnotationGeometry &geometry) { + mbgl::ShapeAnnotationGeometry result; + switch (geometry.type) { + case QMapLibreGL::ShapeAnnotationGeometry::LineStringType: + result = QMapLibreGL::GeoJSON::asLineString(geometry.geometry.first().first()); + break; + case QMapLibreGL::ShapeAnnotationGeometry::PolygonType: + result = QMapLibreGL::GeoJSON::asPolygon(geometry.geometry.first()); + break; + case QMapLibreGL::ShapeAnnotationGeometry::MultiLineStringType: + result = QMapLibreGL::GeoJSON::asMultiLineString(geometry.geometry.first()); + break; + case QMapLibreGL::ShapeAnnotationGeometry::MultiPolygonType: + result = QMapLibreGL::GeoJSON::asMultiPolygon(geometry.geometry); + break; + } + return result; + }; + + if (annotation.canConvert()) { + QMapLibreGL::SymbolAnnotation symbolAnnotation = annotation.value(); + QMapLibreGL::Coordinate& pair = symbolAnnotation.geometry; + return { mbgl::SymbolAnnotation(mbgl::Point { pair.second, pair.first }, symbolAnnotation.icon.toStdString()) }; + } else if (annotation.canConvert()) { + QMapLibreGL::LineAnnotation lineAnnotation = annotation.value(); + auto color = mbgl::Color::parse(mbgl::style::conversion::convertColor(lineAnnotation.color)); + return { mbgl::LineAnnotation(asGeometry(lineAnnotation.geometry), lineAnnotation.opacity, lineAnnotation.width, { *color }) }; + } else if (annotation.canConvert()) { + QMapLibreGL::FillAnnotation fillAnnotation = annotation.value(); + auto color = mbgl::Color::parse(mbgl::style::conversion::convertColor(fillAnnotation.color)); + if (fillAnnotation.outlineColor.canConvert()) { + auto outlineColor = mbgl::Color::parse(mbgl::style::conversion::convertColor(fillAnnotation.outlineColor.value())); + return { mbgl::FillAnnotation(asGeometry(fillAnnotation.geometry), fillAnnotation.opacity, { *color }, { *outlineColor }) }; + } else { + return { mbgl::FillAnnotation(asGeometry(fillAnnotation.geometry), fillAnnotation.opacity, { *color }, {}) }; + } + } + + qWarning() << "Unable to convert annotation:" << annotation; + return {}; +} + } // namespace -/*! - \class QMapboxGLSettings - \brief The QMapboxGLSettings class stores the initial configuration for QMapboxGL. - \inmodule Mapbox Maps SDK for Qt - - QMapboxGLSettings is used to configure QMapboxGL at the moment of its creation. - Once created, the QMapboxGLSettings of a QMapboxGL can no longer be changed. - - Cache-related settings are shared between all QMapboxGL instances using the same cache path. - The first map to configure cache properties such as size will force the configuration - to all newly instantiated QMapboxGL objects using the same cache in the same process. - - \since 4.7 -*/ +namespace QMapLibreGL { /*! - \enum QMapboxGLSettings::GLContextMode + \class QMapLibreGL::Map + \brief The QMapLibreGL::Map class is a Qt wrapper for the MapLibre GL Native engine. - This enum sets the expectations for the OpenGL state. + \inmodule MapLibre Maps SDK for Qt - \value UniqueGLContext The OpenGL context is only used by QMapboxGL, so it is not - reset before each rendering. Use this mode if the intention is to only draw a - fullscreen map. - - \value SharedGLContext The OpenGL context is shared and the state will be - marked dirty - which invalidates any previously assumed GL state. The - embedder is responsible for clearing up the viewport prior to calling - QMapboxGL::render. The embedder is also responsible for resetting its own - GL state after QMapboxGL::render has finished, if needed. - - \sa contextMode() -*/ - -/*! - \enum QMapboxGLSettings::MapMode - - This enum sets the map rendering mode - - \value Continuous The map will render as data arrives from the network and - react immediately to state changes. - - This is the default mode and the preferred when the map is intended to be - interactive. - - \value Static The map will no longer react to state changes and will only - be rendered when QMapboxGL::startStaticRender is called. After all the - resources are loaded, the QMapboxGL::staticRenderFinished signal is emitted. - - This mode is useful for taking a snapshot of the finished rendering result - of the map into a QImage. - - \sa mapMode() -*/ - -/*! - \enum QMapboxGLSettings::ConstrainMode - - This enum determines if the map wraps. - - \value NoConstrain The map will wrap on the horizontal axis. Since it doesn't - make sense to wrap on the vertical axis in a Web Mercator projection, the map will scroll - and show some empty space. - - \value ConstrainHeightOnly The map will wrap around the horizontal axis, like a spinning - globe. This is the recommended constrain mode. - - \value ConstrainWidthAndHeight The map won't wrap and panning is restricted to the boundaries - of the map. - - \sa constrainMode() -*/ - -/*! - \enum QMapboxGLSettings::ViewportMode - - This enum flips the map vertically. - - \value DefaultViewport Native orientation. - - \value FlippedYViewport Mirrored vertically. - - \sa viewportMode() -*/ - -/*! - Constructs a QMapboxGLSettings object with the default values. The default - configuration is valid for initializing a QMapboxGL. -*/ -QMapboxGLSettings::QMapboxGLSettings() - : m_contextMode(QMapboxGLSettings::SharedGLContext) - , m_mapMode(QMapboxGLSettings::Continuous) - , m_constrainMode(QMapboxGLSettings::ConstrainHeightOnly) - , m_viewportMode(QMapboxGLSettings::DefaultViewport) - , m_cacheMaximumSize(mbgl::util::DEFAULT_MAX_CACHE_SIZE) - , m_cacheDatabasePath(":memory:") - , m_assetPath(QCoreApplication::applicationDirPath()) - , m_apiKey(qgetenv("MGL_API_KEY")) - , m_tileServerOptionsInternal(new mbgl::TileServerOptions(mbgl::TileServerOptions::DefaultConfiguration())) -{ -} - -/*! - Returns the OpenGL context mode. This is specially important when mixing - with other OpenGL draw calls. - - By default, it is set to QMapboxGLSettings::SharedGLContext. -*/ -QMapboxGLSettings::GLContextMode QMapboxGLSettings::contextMode() const -{ - return m_contextMode; -} - -/*! - Sets the OpenGL context \a mode. -*/ -void QMapboxGLSettings::setContextMode(GLContextMode mode) -{ - m_contextMode = mode; -} - -/*! - Returns the map mode. Static mode will emit a signal for - rendering a map only when the map is fully loaded. - Animations like style transitions and labels fading won't - be seen. - - The Continuous mode will emit the signal for every new - change on the map and it is usually what you expect for - a interactive map. - - By default, it is set to QMapboxGLSettings::Continuous. -*/ -QMapboxGLSettings::MapMode QMapboxGLSettings::mapMode() const -{ - return m_mapMode; -} - -/*! - Sets the map \a mode. -*/ -void QMapboxGLSettings::setMapMode(MapMode mode) -{ - m_mapMode = mode; -} - -/*! - Returns the constrain mode. This is used to limit the map to wrap - around the globe horizontally. - - By default, it is set to QMapboxGLSettings::ConstrainHeightOnly. -*/ -QMapboxGLSettings::ConstrainMode QMapboxGLSettings::constrainMode() const -{ - return m_constrainMode; -} - -/*! - Sets the map constrain \a mode. -*/ -void QMapboxGLSettings::setConstrainMode(ConstrainMode mode) -{ - m_constrainMode = mode; -} - -/*! - Returns the viewport mode. This is used to flip the vertical - orientation of the map as some devices may use inverted orientation. - - By default, it is set to QMapboxGLSettings::DefaultViewport. -*/ -QMapboxGLSettings::ViewportMode QMapboxGLSettings::viewportMode() const -{ - return m_viewportMode; -} - -/*! - Sets the viewport \a mode. -*/ -void QMapboxGLSettings::setViewportMode(ViewportMode mode) -{ - m_viewportMode = mode; -} - -/*! - Returns the cache database maximum hard size in bytes. The database - will grow until the limit is reached. Setting a maximum size smaller - than the current size of an existing database results in undefined - behavior - - By default, it is set to 50 MB. -*/ -unsigned QMapboxGLSettings::cacheDatabaseMaximumSize() const -{ - return m_cacheMaximumSize; -} - -/*! - Returns the maximum allowed cache database \a size in bytes. -*/ -void QMapboxGLSettings::setCacheDatabaseMaximumSize(unsigned size) -{ - m_cacheMaximumSize = size; -} - -/*! - Returns the cache database path. The cache is used for storing - recently used resources like tiles and also an offline tile database - pre-populated by the - \l {https://github.com/mapbox/mapbox-gl-native/blob/master/bin/offline.sh} - {Offline Tool}. - - By default, it is set to \c :memory: meaning it will create an in-memory - cache instead of a file on disk. -*/ -QString QMapboxGLSettings::cacheDatabasePath() const -{ - return m_cacheDatabasePath; -} - -/*! - Sets the cache database \a path. - - Setting the \a path to \c :memory: will create an in-memory cache. -*/ -void QMapboxGLSettings::setCacheDatabasePath(const QString &path) -{ - m_cacheDatabasePath = path; -} - -/*! - Returns the asset path, which is the root directory from where - the \c asset:// scheme gets resolved in a style. \c asset:// can be used - for loading a resource from the disk in a style rather than fetching - it from the network. - - By default, it is set to the value returned by QCoreApplication::applicationDirPath(). -*/ -QString QMapboxGLSettings::assetPath() const -{ - return m_assetPath; -} - -/*! - Sets the asset \a path. -*/ -void QMapboxGLSettings::setAssetPath(const QString &path) -{ - m_assetPath = path; -} - -/*! - Returns the API key. - - By default, it is taken from the environment variable \c MGL_API_KEY - or empty if the variable is not set. -*/ -QString QMapboxGLSettings::apiKey() const { - return m_apiKey; -} - -/*! - Sets the API key. - - MapTiler-hosted and Mapbox-hosted vector tiles and styles require an API - key or access token. -*/ -void QMapboxGLSettings::setApiKey(const QString &key) -{ - m_apiKey = key; -} - -/*! - Returns the API base URL. -*/ -QString QMapboxGLSettings::apiBaseUrl() const -{ - return QString::fromStdString(m_tileServerOptionsInternal->baseURL()); -} - -/*! - Sets the API base \a url. - - The API base URL is the URL that the \b "mapbox://" protocol will - be resolved to. It defaults to "https://api.mapbox.com" but can be - changed, for instance, to a tile cache server address. -*/ -void QMapboxGLSettings::setApiBaseUrl(const QString& url) -{ - m_tileServerOptionsInternal = &m_tileServerOptionsInternal->withBaseURL(url.toStdString()); -} - -/*! - Returns the local font family. Returns an empty string if no local font family is set. -*/ -QString QMapboxGLSettings::localFontFamily() const -{ - return m_localFontFamily; -} - -/*! - Sets the local font family. - - Rendering Chinese/Japanese/Korean (CJK) ideographs and precomposed Hangul Syllables requires - downloading large amounts of font data, which can significantly slow map load times. Use the - localIdeographFontFamily setting to speed up map load times by using locally available fonts - instead of font data fetched from the server. -*/ -void QMapboxGLSettings::setLocalFontFamily(const QString &family) -{ - m_localFontFamily = family; -} - -/*! - Returns resource transformation callback used to transform requested URLs. -*/ -std::function QMapboxGLSettings::resourceTransform() const { - return m_resourceTransform; -} - -/*! - Sets the resource \a transform callback. - - When given, resource transformation callback will be used to transform the - requested resource URLs before they are requested from internet. This can be - used add or remove custom parameters, or reroute certain requests to other - servers or endpoints. -*/ -void QMapboxGLSettings::setResourceTransform(const std::function &transform) { - m_resourceTransform = transform; -} - -/*! - Reset all settings based on the given template. - - MapLibre can support servers with different resource path structure. - Some of the most common servers like Maptiler and Mapbox are defined - in the library. This function will re-initialise all settings based - on the default values of specific service provider defaults. -*/ -void QMapboxGLSettings::resetToTemplate(SettingsTemplate settings_template) -{ - if(m_tileServerOptionsInternal) delete m_tileServerOptionsInternal; - - if(settings_template == MapLibreSettings){ - m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapLibreConfiguration()); - }else if(settings_template == MapTilerSettings){ - m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapTilerConfiguration()); - }else if(settings_template == MapboxSettings){ - m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapboxConfiguration()); - }else{ - m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::DefaultConfiguration()); - } -} - -/*! - All predefined styles. - - Return all styles that are defined in default settings. -*/ -QVector > QMapboxGLSettings::defaultStyles() const { - QVector> styles; - for (const auto &style : tileServerOptionsInternal()->defaultStyles()) { - styles.append(QPair( - QString::fromStdString(style.getUrl()), QString::fromStdString(style.getName()))); - } - return styles; -} - -mbgl::TileServerOptions *QMapboxGLSettings::tileServerOptionsInternal() const { - return m_tileServerOptionsInternal; -} - -/*! - \class QMapboxGL - \brief The QMapboxGL class is a Qt wrapper for the Mapbox GL Native engine. - - \inmodule Mapbox Maps SDK for Qt - - QMapboxGL is a Qt friendly version the Mapbox GL Native engine using Qt types - and deep integration with Qt event loop. QMapboxGL relies as much as possible + QMapLibreGL::Map is a Qt friendly version the MapLibre GL Native engine using Qt types + and deep integration with Qt event loop. QMapLibreGL::Map relies as much as possible on Qt, trying to minimize the external dependencies. For instance it will use QNetworkAccessManager for HTTP requests and QString for UTF-8 manipulation. - QMapboxGL is not thread-safe and it is assumed that it will be accessed from + QMapLibreGL::Map is not thread-safe and it is assumed that it will be accessed from the same thread as the thread where the OpenGL context lives. - - \since 4.7 */ /*! - \enum QMapboxGL::MapChange + \enum QMapLibreGL::Map::MapChange This enum represents the last changed occurred to the map state. \value MapChangeRegionWillChange A region of the map will change, like when resizing the map. - \value MapChangeRegionWillChangeAnimated Not in use by QMapboxGL. + \value MapChangeRegionWillChangeAnimated Not in use by QMapLibreGL::Map. \value MapChangeRegionIsChanging A region of the map is changing. \value MapChangeRegionDidChange A region of the map finished changing. - \value MapChangeRegionDidChangeAnimated Not in use by QMapboxGL. + \value MapChangeRegionDidChangeAnimated Not in use by QMapLibreGL::Map. \value MapChangeWillStartLoadingMap The map is getting loaded. This state - is set only once right after QMapboxGL is created and a style is set. + is set only once right after QMapLibreGL::Map is created and a style is set. \value MapChangeDidFinishLoadingMap All the resources were loaded and parsed and the map is fully rendered. After this state the mapChanged() signal won't fire again unless @@ -566,7 +232,7 @@ mbgl::TileServerOptions *QMapboxGLSettings::tileServerOptionsInternal() const { \value MapChangeWillStartRenderingMap Set once when the map is about to get rendered for the first time. - \value MapChangeDidFinishRenderingMap Not in use by QMapboxGL. + \value MapChangeDidFinishRenderingMap Not in use by QMapLibreGL::Map. \value MapChangeDidFinishRenderingMapFullyRendered Map is fully loaded and rendered. @@ -578,7 +244,7 @@ mbgl::TileServerOptions *QMapboxGLSettings::tileServerOptionsInternal() const { */ /*! - \enum QMapboxGL::MapLoadingFailure + \enum QMapLibreGL::Map::MapLoadingFailure This enum represents map loading failure type. @@ -591,7 +257,7 @@ mbgl::TileServerOptions *QMapboxGLSettings::tileServerOptionsInternal() const { */ /*! - \enum QMapboxGL::NorthOrientation + \enum QMapLibreGL::Map::NorthOrientation This enum sets the orientation of the north bearing. It will directly affect bearing when resetting the north (i.e. setting bearing to 0). @@ -609,35 +275,35 @@ mbgl::TileServerOptions *QMapboxGLSettings::tileServerOptionsInternal() const { */ /*! - Constructs a QMapboxGL object with \a settings and sets \a parent_ as the parent + Constructs a QMapLibreGL::Map object with \a settings and sets \a parent_ as the parent object. The \a settings cannot be changed after the object is constructed. The \a size represents the size of the viewport and the \a pixelRatio the initial pixel density of the screen. */ -QMapboxGL::QMapboxGL(QObject *parent_, const QMapboxGLSettings &settings, const QSize& size, qreal pixelRatio) +Map::Map(QObject *parent_, const Settings &settings, const QSize& size, qreal pixelRatio) : QObject(parent_) { assert(!size.isEmpty()); - // Multiple QMapboxGL running on the same thread + // Multiple QMapLibreGL::Map running on the same thread // will share the same mbgl::util::RunLoop if (!loop.hasLocalData()) { loop.setLocalData(std::make_shared()); } - d_ptr = new QMapboxGLPrivate(this, settings, size, pixelRatio); + d_ptr = new MapPrivate(this, settings, size, pixelRatio); } /*! - Destroys this QMapboxGL. + Destroys this QMapLibreGL::Map. */ -QMapboxGL::~QMapboxGL() +Map::~Map() { delete d_ptr; } /*! - \property QMapboxGL::styleJson + \property QMapLibreGL::Map::styleJson \brief the map style JSON. Sets a new \a style from a JSON that must conform to the @@ -645,20 +311,20 @@ QMapboxGL::~QMapboxGL() {Mapbox style specification}. \note In case of a invalid style it will trigger a mapChanged - signal with QMapboxGL::MapChangeDidFailLoadingMap as argument. + signal with QMapLibreGL::Map::MapChangeDidFailLoadingMap as argument. */ -QString QMapboxGL::styleJson() const +QString Map::styleJson() const { return QString::fromStdString(d_ptr->mapObj->getStyle().getJSON()); } -void QMapboxGL::setStyleJson(const QString &style) +void Map::setStyleJson(const QString &style) { d_ptr->mapObj->getStyle().loadJSON(style.toStdString()); } /*! - \property QMapboxGL::styleUrl + \property QMapLibreGL::Map::styleUrl \brief the map style URL. Sets a URL for fetching a JSON that will be later fed to @@ -670,55 +336,55 @@ void QMapboxGL::setStyleJson(const QString &style) from anything that QNetworkAccessManager can handle. \note In case of a invalid style it will trigger a mapChanged - signal with QMapboxGL::MapChangeDidFailLoadingMap as argument. + signal with QMapLibreGL::Map::MapChangeDidFailLoadingMap as argument. */ -QString QMapboxGL::styleUrl() const +QString Map::styleUrl() const { return QString::fromStdString(d_ptr->mapObj->getStyle().getURL()); } -void QMapboxGL::setStyleUrl(const QString &url) +void Map::setStyleUrl(const QString &url) { d_ptr->mapObj->getStyle().loadURL(url.toStdString()); } /*! - \property QMapboxGL::latitude + \property QMapLibreGL::Map::latitude \brief the map's current latitude in degrees. - Setting a latitude doesn't necessarily mean it will be accepted since QMapboxGL + Setting a latitude doesn't necessarily mean it will be accepted since QMapLibreGL::Map might constrain it within the limits of the Web Mercator projection. */ -double QMapboxGL::latitude() const +double Map::latitude() const { return d_ptr->mapObj->getCameraOptions(d_ptr->margins).center->latitude(); } -void QMapboxGL::setLatitude(double latitude_) +void Map::setLatitude(double latitude_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions().withCenter(mbgl::LatLng { latitude_, longitude() }).withPadding(d_ptr->margins)); } /*! - \property QMapboxGL::longitude + \property QMapLibreGL::Map::longitude \brief the map current longitude in degrees. Setting a longitude beyond the limits of the Web Mercator projection will make the map wrap. As an example, setting the longitude to 360 is effectively the same as setting it to 0. */ -double QMapboxGL::longitude() const +double Map::longitude() const { return d_ptr->mapObj->getCameraOptions(d_ptr->margins).center->longitude(); } -void QMapboxGL::setLongitude(double longitude_) +void Map::setLongitude(double longitude_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions().withCenter(mbgl::LatLng { latitude(), longitude_ }).withPadding(d_ptr->margins)); } /*! - \property QMapboxGL::scale + \property QMapLibreGL::Map::scale \brief the map scale factor. This property is used to zoom the map. When \a center is defined, the map will @@ -730,18 +396,18 @@ void QMapboxGL::setLongitude(double longitude_) \sa zoom() */ -double QMapboxGL::scale() const +double Map::scale() const { return std::pow(2.0, zoom()); } -void QMapboxGL::setScale(double scale_, const QPointF ¢er) +void Map::setScale(double scale_, const QPointF ¢er) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions().withZoom(::log2(scale_)).withAnchor(mbgl::ScreenCoordinate { center.x(), center.y() })); } /*! - \property QMapboxGL::zoom + \property QMapLibreGL::Map::zoom \brief the map zoom factor. This property is used to zoom the map. When \a center is defined, the map will @@ -750,12 +416,12 @@ void QMapboxGL::setScale(double scale_, const QPointF ¢er) \sa scale() */ -double QMapboxGL::zoom() const +double Map::zoom() const { return *d_ptr->mapObj->getCameraOptions().zoom; } -void QMapboxGL::setZoom(double zoom_) +void Map::setZoom(double zoom_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions().withZoom(zoom_).withPadding(d_ptr->margins)); } @@ -765,7 +431,7 @@ void QMapboxGL::setZoom(double zoom_) \sa maximumZoom() */ -double QMapboxGL::minimumZoom() const +double Map::minimumZoom() const { return *d_ptr->mapObj->getBounds().minZoom; } @@ -775,26 +441,26 @@ double QMapboxGL::minimumZoom() const \sa minimumZoom() */ -double QMapboxGL::maximumZoom() const +double Map::maximumZoom() const { return *d_ptr->mapObj->getBounds().maxZoom; } /*! - \property QMapboxGL::coordinate + \property QMapLibreGL::Map::coordinate \brief the map center \a coordinate. Centers the map at a geographic coordinate respecting the margins, if set. \sa margins() */ -Coordinate QMapboxGL::coordinate() const +Coordinate Map::coordinate() const { const mbgl::LatLng latLng = *d_ptr->mapObj->getCameraOptions(d_ptr->margins).center; return Coordinate(latLng.latitude(), latLng.longitude()); } -void QMapboxGL::setCoordinate(const QMapbox::Coordinate &coordinate_) +void Map::setCoordinate(const Coordinate &coordinate_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions() .withCenter(mbgl::LatLng { coordinate_.first, coordinate_.second }) @@ -802,7 +468,7 @@ void QMapboxGL::setCoordinate(const QMapbox::Coordinate &coordinate_) } /*! - \fn QMapboxGL::setCoordinateZoom(const QMapbox::Coordinate &coordinate, double zoom) + \fn QMapLibreGL::Map::setCoordinateZoom(const Coordinate &coordinate, double zoom) Convenience method for setting the \a coordinate and \a zoom simultaneously. @@ -812,7 +478,7 @@ void QMapboxGL::setCoordinate(const QMapbox::Coordinate &coordinate_) \sa zoom() \sa coordinate() */ -void QMapboxGL::setCoordinateZoom(const QMapbox::Coordinate &coordinate_, double zoom_) +void Map::setCoordinateZoom(const Coordinate &coordinate_, double zoom_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions() .withCenter(mbgl::LatLng { coordinate_.first, coordinate_.second }) @@ -823,7 +489,7 @@ void QMapboxGL::setCoordinateZoom(const QMapbox::Coordinate &coordinate_, double /*! Atomically jumps to the \a camera options. */ -void QMapboxGL::jumpTo(const QMapboxGLCameraOptions& camera) +void Map::jumpTo(const CameraOptions& camera) { mbgl::CameraOptions mbglCamera; if (camera.center.isValid()) { @@ -850,7 +516,7 @@ void QMapboxGL::jumpTo(const QMapboxGLCameraOptions& camera) } /*! - \property QMapboxGL::bearing + \property QMapLibreGL::Map::bearing \brief the map bearing in degrees. Set the angle in degrees. Negative values and values over 360 are @@ -861,19 +527,19 @@ void QMapboxGL::jumpTo(const QMapboxGLCameraOptions& camera) \sa margins() */ -double QMapboxGL::bearing() const +double Map::bearing() const { return *d_ptr->mapObj->getCameraOptions().bearing; } -void QMapboxGL::setBearing(double degrees) +void Map::setBearing(double degrees) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions() .withBearing(degrees) .withPadding(d_ptr->margins)); } -void QMapboxGL::setBearing(double degrees, const QPointF ¢er) +void Map::setBearing(double degrees, const QPointF ¢er) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions() .withBearing(degrees) @@ -881,7 +547,7 @@ void QMapboxGL::setBearing(double degrees, const QPointF ¢er) } /*! - \property QMapboxGL::pitch + \property QMapLibreGL::Map::pitch \brief the map pitch in degrees. Pitch toward the horizon measured in degrees, with 0 resulting in a @@ -889,17 +555,17 @@ void QMapboxGL::setBearing(double degrees, const QPointF ¢er) \sa margins() */ -double QMapboxGL::pitch() const +double Map::pitch() const { return *d_ptr->mapObj->getCameraOptions().pitch; } -void QMapboxGL::setPitch(double pitch_) +void Map::setPitch(double pitch_) { d_ptr->mapObj->jumpTo(mbgl::CameraOptions().withPitch(pitch_)); } -void QMapboxGL::pitchBy(double pitch_) +void Map::pitchBy(double pitch_) { d_ptr->mapObj->pitchBy(pitch_); } @@ -907,15 +573,15 @@ void QMapboxGL::pitchBy(double pitch_) /*! Returns the north orientation mode. */ -QMapboxGL::NorthOrientation QMapboxGL::northOrientation() const +Map::NorthOrientation Map::northOrientation() const { - return static_cast(d_ptr->mapObj->getMapOptions().northOrientation()); + return static_cast(d_ptr->mapObj->getMapOptions().northOrientation()); } /*! Sets the north orientation mode to \a orientation. */ -void QMapboxGL::setNorthOrientation(NorthOrientation orientation) +void Map::setNorthOrientation(NorthOrientation orientation) { d_ptr->mapObj->setNorthOrientation(static_cast(orientation)); } @@ -925,7 +591,7 @@ void QMapboxGL::setNorthOrientation(NorthOrientation orientation) affects how the map renders labels, as it will use different texture filters if a gesture is ongoing. */ -void QMapboxGL::setGestureInProgress(bool progress) +void Map::setGestureInProgress(bool progress) { d_ptr->mapObj->setGestureInProgress(progress); } @@ -934,7 +600,7 @@ void QMapboxGL::setGestureInProgress(bool progress) Sets the \a duration and \a delay of style transitions. Style paint property values transition to new values with animation when they are updated. */ -void QMapboxGL::setTransitionOptions(qint64 duration, qint64 delay) { +void Map::setTransitionOptions(qint64 duration, qint64 delay) { static auto convert = [](qint64 value) -> mbgl::optional { return std::chrono::duration_cast(mbgl::Milliseconds(value)); }; @@ -942,49 +608,6 @@ void QMapboxGL::setTransitionOptions(qint64 duration, qint64 delay) { d_ptr->mapObj->getStyle().setTransitionOptions(mbgl::style::TransitionOptions{ convert(duration), convert(delay) }); } -mbgl::optional asMapboxGLAnnotation(const QMapbox::Annotation & annotation) { - auto asMapboxGLGeometry = [](const QMapbox::ShapeAnnotationGeometry &geometry) { - mbgl::ShapeAnnotationGeometry result; - switch (geometry.type) { - case QMapbox::ShapeAnnotationGeometry::LineStringType: - result = asMapboxGLLineString(geometry.geometry.first().first()); - break; - case QMapbox::ShapeAnnotationGeometry::PolygonType: - result = asMapboxGLPolygon(geometry.geometry.first()); - break; - case QMapbox::ShapeAnnotationGeometry::MultiLineStringType: - result = asMapboxGLMultiLineString(geometry.geometry.first()); - break; - case QMapbox::ShapeAnnotationGeometry::MultiPolygonType: - result = asMapboxGLMultiPolygon(geometry.geometry); - break; - } - return result; - }; - - if (annotation.canConvert()) { - QMapbox::SymbolAnnotation symbolAnnotation = annotation.value(); - QMapbox::Coordinate& pair = symbolAnnotation.geometry; - return { mbgl::SymbolAnnotation(mbgl::Point { pair.second, pair.first }, symbolAnnotation.icon.toStdString()) }; - } else if (annotation.canConvert()) { - QMapbox::LineAnnotation lineAnnotation = annotation.value(); - auto color = mbgl::Color::parse(mbgl::style::conversion::convertColor(lineAnnotation.color)); - return { mbgl::LineAnnotation(asMapboxGLGeometry(lineAnnotation.geometry), lineAnnotation.opacity, lineAnnotation.width, { *color }) }; - } else if (annotation.canConvert()) { - QMapbox::FillAnnotation fillAnnotation = annotation.value(); - auto color = mbgl::Color::parse(mbgl::style::conversion::convertColor(fillAnnotation.color)); - if (fillAnnotation.outlineColor.canConvert()) { - auto outlineColor = mbgl::Color::parse(mbgl::style::conversion::convertColor(fillAnnotation.outlineColor.value())); - return { mbgl::FillAnnotation(asMapboxGLGeometry(fillAnnotation.geometry), fillAnnotation.opacity, { *color }, { *outlineColor }) }; - } else { - return { mbgl::FillAnnotation(asMapboxGLGeometry(fillAnnotation.geometry), fillAnnotation.opacity, { *color }, {}) }; - } - } - - qWarning() << "Unable to convert annotation:" << annotation; - return {}; -} - /*! Adds an \a annotation to the map. @@ -992,9 +615,9 @@ mbgl::optional asMapboxGLAnnotation(const QMapbox::Annotation \sa addAnnotationIcon() */ -QMapbox::AnnotationID QMapboxGL::addAnnotation(const QMapbox::Annotation &annotation) +AnnotationID Map::addAnnotation(const Annotation &annotation) { - return static_cast(d_ptr->mapObj->addAnnotation(*asMapboxGLAnnotation(annotation))); + return static_cast(d_ptr->mapObj->addAnnotation(*asAnnotation(annotation))); } /*! @@ -1002,15 +625,15 @@ QMapbox::AnnotationID QMapboxGL::addAnnotation(const QMapbox::Annotation &annota \sa addAnnotationIcon() */ -void QMapboxGL::updateAnnotation(QMapbox::AnnotationID id, const QMapbox::Annotation &annotation) +void Map::updateAnnotation(AnnotationID id, const Annotation &annotation) { - d_ptr->mapObj->updateAnnotation(id, *asMapboxGLAnnotation(annotation)); + d_ptr->mapObj->updateAnnotation(id, *asAnnotation(annotation)); } /*! Removes an existing annotation referred by \a id. */ -void QMapboxGL::removeAnnotation(QMapbox::AnnotationID id) +void Map::removeAnnotation(AnnotationID id) { d_ptr->mapObj->removeAnnotation(id); } @@ -1054,7 +677,7 @@ void QMapboxGL::removeAnnotation(QMapbox::AnnotationID id) \li QVariantList \endtable */ -bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& propertyName, const QVariant& value) +bool Map::setLayoutProperty(const QString& layer, const QString& propertyName, const QVariant& value) { return d_ptr->setProperty(&mbgl::style::Layer::setProperty, layer, propertyName, value); } @@ -1114,7 +737,7 @@ bool QMapboxGL::setLayoutProperty(const QString& layer, const QString& propertyN \endcode */ -bool QMapboxGL::setPaintProperty(const QString& layer, const QString& propertyName, const QVariant& value) +bool Map::setPaintProperty(const QString& layer, const QString& propertyName, const QVariant& value) { return d_ptr->setProperty(&mbgl::style::Layer::setProperty, layer, propertyName, value); } @@ -1123,7 +746,7 @@ bool QMapboxGL::setPaintProperty(const QString& layer, const QString& propertyNa Returns true when the map is completely rendered, false otherwise. A partially rendered map ranges from nothing rendered at all to only labels missing. */ -bool QMapboxGL::isFullyLoaded() const +bool Map::isFullyLoaded() const { return d_ptr->mapObj->isFullyLoaded(); } @@ -1133,18 +756,18 @@ bool QMapboxGL::isFullyLoaded() const The pixel coordinate origin is located at the upper left corner of the map. */ -void QMapboxGL::moveBy(const QPointF &offset) +void Map::moveBy(const QPointF &offset) { d_ptr->mapObj->moveBy(mbgl::ScreenCoordinate { offset.x(), offset.y() }); } /*! - \fn QMapboxGL::scaleBy(double scale, const QPointF ¢er) + \fn QMapLibreGL::Map::scaleBy(double scale, const QPointF ¢er) Scale the map by \a scale in the direction of the \a center. This function can be used for implementing a pinch gesture. */ -void QMapboxGL::scaleBy(double scale_, const QPointF ¢er) { +void Map::scaleBy(double scale_, const QPointF ¢er) { d_ptr->mapObj->scaleBy(scale_, mbgl::ScreenCoordinate { center.x(), center.y() }); } @@ -1154,7 +777,7 @@ void QMapboxGL::scaleBy(double scale_, const QPointF ¢er) { being \a first the cursor coordinate at the last frame and \a second the cursor coordinate at the current frame. */ -void QMapboxGL::rotateBy(const QPointF &first, const QPointF &second) +void Map::rotateBy(const QPointF &first, const QPointF &second) { d_ptr->mapObj->rotateBy( mbgl::ScreenCoordinate { first.x(), first.y() }, @@ -1165,7 +788,7 @@ void QMapboxGL::rotateBy(const QPointF &first, const QPointF &second) Resize the map to \a size_ and scale to fit at the framebuffer. For high DPI screens, the size will be smaller than the framebuffer. */ -void QMapboxGL::resize(const QSize& size_) +void Map::resize(const QSize& size_) { auto size = sanitizedSize(size_); @@ -1184,7 +807,7 @@ void QMapboxGL::resize(const QSize& size_) \sa addAnnotation() */ -void QMapboxGL::addAnnotationIcon(const QString &name, const QImage &icon) +void Map::addAnnotationIcon(const QString &name, const QImage &icon) { if (icon.isNull()) return; @@ -1192,31 +815,7 @@ void QMapboxGL::addAnnotationIcon(const QString &name, const QImage &icon) } /*! - Returns the amount of meters per pixel from a given \a latitude_ and \a zoom_. -*/ -double QMapboxGL::metersPerPixelAtLatitude(double latitude_, double zoom_) const -{ - return QMapbox::metersPerPixelAtLatitude(latitude_, zoom_); -} - -/*! - Return the projected meters for a given \a coordinate_ object. -*/ -QMapbox::ProjectedMeters QMapboxGL::projectedMetersForCoordinate(const QMapbox::Coordinate &coordinate_) const -{ - return QMapbox::projectedMetersForCoordinate(coordinate_); -} - -/*! - Returns the coordinate for a given \a projectedMeters object. -*/ -QMapbox::Coordinate QMapboxGL::coordinateForProjectedMeters(const QMapbox::ProjectedMeters &projectedMeters) const -{ - return QMapbox::coordinateForProjectedMeters(projectedMeters); -} - -/*! - \fn QMapboxGL::pixelForCoordinate(const QMapbox::Coordinate &coordinate) const + \fn QMapLibreGL::Map::pixelForCoordinate(const Coordinate &coordinate) const Returns the offset in pixels for \a coordinate. The origin pixel coordinate is located at the top left corner of the map view. @@ -1226,7 +825,7 @@ QMapbox::Coordinate QMapboxGL::coordinateForProjectedMeters(const QMapbox::Proje /note The return value is affected by the current zoom level, bearing and pitch. */ -QPointF QMapboxGL::pixelForCoordinate(const QMapbox::Coordinate &coordinate_) const +QPointF Map::pixelForCoordinate(const Coordinate &coordinate_) const { const mbgl::ScreenCoordinate pixel = d_ptr->mapObj->pixelForLatLng(mbgl::LatLng { coordinate_.first, coordinate_.second }); @@ -1237,7 +836,7 @@ QPointF QMapboxGL::pixelForCoordinate(const QMapbox::Coordinate &coordinate_) co /*! Returns the geographic coordinate for the \a pixel coordinate. */ -QMapbox::Coordinate QMapboxGL::coordinateForPixel(const QPointF &pixel) const +Coordinate Map::coordinateForPixel(const QPointF &pixel) const { const mbgl::LatLng latLng = d_ptr->mapObj->latLngForPixel(mbgl::ScreenCoordinate { pixel.x(), pixel.y() }); @@ -1249,8 +848,8 @@ QMapbox::Coordinate QMapboxGL::coordinateForPixel(const QPointF &pixel) const Returns the coordinate and zoom combination needed in order to make the coordinate bounding box \a sw and \a ne visible. */ -QMapbox::CoordinateZoom QMapboxGL::coordinateZoomForBounds(const QMapbox::Coordinate &sw, - const QMapbox::Coordinate &ne) const { +CoordinateZoom Map::coordinateZoomForBounds(const Coordinate &sw, + const Coordinate &ne) const { auto bounds = mbgl::LatLngBounds::hull(mbgl::LatLng { sw.first, sw.second }, mbgl::LatLng { ne.first, ne.second }); mbgl::CameraOptions camera = d_ptr->mapObj->cameraForLatLngBounds(bounds, d_ptr->margins); @@ -1261,10 +860,10 @@ QMapbox::CoordinateZoom QMapboxGL::coordinateZoomForBounds(const QMapbox::Coordi Returns the coordinate and zoom combination needed in order to make the coordinate bounding box \a sw and \a ne visible taking into account \a newBearing and \a newPitch. */ -QMapbox::CoordinateZoom QMapboxGL::coordinateZoomForBounds(const QMapbox::Coordinate &sw, - const QMapbox::Coordinate &ne, - double newBearing, - double newPitch) +CoordinateZoom Map::coordinateZoomForBounds(const Coordinate &sw, + const Coordinate &ne, + double newBearing, + double newPitch) { auto bounds = mbgl::LatLngBounds::hull(mbgl::LatLng { sw.first, sw.second }, mbgl::LatLng { ne.first, ne.second }); @@ -1273,12 +872,12 @@ QMapbox::CoordinateZoom QMapboxGL::coordinateZoomForBounds(const QMapbox::Coordi } /*! - \property QMapboxGL::margins + \property QMapLibreGL::Map::margins \brief the map margins in pixels from the corners of the map. This property sets a new reference center for the map. */ -void QMapboxGL::setMargins(const QMargins &margins_) +void Map::setMargins(const QMargins &margins_) { d_ptr->margins = { static_cast(margins_.top()), @@ -1288,7 +887,7 @@ void QMapboxGL::setMargins(const QMargins &margins_) }; } -QMargins QMapboxGL::margins() const +QMargins Map::margins() const { return QMargins( d_ptr->margins.left(), @@ -1316,7 +915,7 @@ QMargins QMapboxGL::margins() const map->addSource("routeSource", routeSource); \endcode */ -void QMapboxGL::addSource(const QString &id, const QVariantMap ¶ms) +void Map::addSource(const QString &id, const QVariantMap ¶ms) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -1334,7 +933,7 @@ void QMapboxGL::addSource(const QString &id, const QVariantMap ¶ms) /*! Returns true if the layer with given \a sourceID exists, false otherwise. */ -bool QMapboxGL::sourceExists(const QString& sourceID) +bool Map::sourceExists(const QString& sourceID) { return !!d_ptr->mapObj->getStyle().getSource(sourceID.toStdString()); } @@ -1345,7 +944,7 @@ bool QMapboxGL::sourceExists(const QString& sourceID) If the source does not exist, it will be added like in addSource(). Only image and GeoJSON sources can be updated. */ -void QMapboxGL::updateSource(const QString &id, const QVariantMap ¶ms) +void Map::updateSource(const QString &id, const QVariantMap ¶ms) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -1379,7 +978,7 @@ void QMapboxGL::updateSource(const QString &id, const QVariantMap ¶ms) This method has no effect if the source does not exist. */ -void QMapboxGL::removeSource(const QString& id) +void Map::removeSource(const QString& id) { auto sourceIDStdString = id.toStdString(); @@ -1396,14 +995,14 @@ void QMapboxGL::removeSource(const QString& id) \warning This is used for delegating the rendering of a layer to the user of this API and is not officially supported. Use at your own risk. */ -void QMapboxGL::addCustomLayer(const QString &id, - std::unique_ptr host, - const QString &before) +void Map::addCustomLayer(const QString &id, + std::unique_ptr host, + const QString &before) { class HostWrapper : public mbgl::style::CustomLayerHost { public: - std::unique_ptr ptr{}; - HostWrapper(std::unique_ptr p) + std::unique_ptr ptr{}; + HostWrapper(std::unique_ptr p) : ptr(std::move(p)) { } @@ -1412,7 +1011,7 @@ void QMapboxGL::addCustomLayer(const QString &id, } void render(const mbgl::style::CustomLayerRenderParameters& params) { - QMapbox::CustomLayerRenderParameters renderParams; + CustomLayerRenderParameters renderParams; renderParams.width = params.width; renderParams.height = params.height; renderParams.latitude = params.latitude; @@ -1457,7 +1056,7 @@ void QMapboxGL::addCustomLayer(const QString &id, /note The source must exist prior to adding a layer. */ -void QMapboxGL::addLayer(const QVariantMap ¶ms, const QString& before) +void Map::addLayer(const QVariantMap ¶ms, const QString& before) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -1476,7 +1075,7 @@ void QMapboxGL::addLayer(const QVariantMap ¶ms, const QString& before) /*! Returns true if the layer with given \a id exists, false otherwise. */ -bool QMapboxGL::layerExists(const QString& id) +bool Map::layerExists(const QString& id) { return !!d_ptr->mapObj->getStyle().getLayer(id.toStdString()); } @@ -1484,7 +1083,7 @@ bool QMapboxGL::layerExists(const QString& id) /*! Removes the layer with given \a id. */ -void QMapboxGL::removeLayer(const QString& id) +void Map::removeLayer(const QString& id) { d_ptr->mapObj->getStyle().removeLayer(id.toStdString()); } @@ -1492,7 +1091,7 @@ void QMapboxGL::removeLayer(const QString& id) /*! List of all existing layer ids from the current style. */ -QVector QMapboxGL::layerIds() const +QVector Map::layerIds() const { const auto &layers = d_ptr->mapObj->getStyle().getLayers(); @@ -1516,7 +1115,7 @@ QVector QMapboxGL::layerIds() const \sa addLayer() */ -void QMapboxGL::addImage(const QString &id, const QImage &image) +void Map::addImage(const QString &id, const QImage &image) { if (image.isNull()) return; @@ -1526,7 +1125,7 @@ void QMapboxGL::addImage(const QString &id, const QImage &image) /*! Removes the image \a id. */ -void QMapboxGL::removeImage(const QString &id) +void Map::removeImage(const QString &id) { d_ptr->mapObj->getStyle().removeImage(id.toStdString()); } @@ -1551,7 +1150,7 @@ void QMapboxGL::removeImage(const QString &id) map->setFilter(QLatin1String("marker"), filter); \endcode */ -void QMapboxGL::setFilter(const QString& layer, const QVariant& filter) +void Map::setFilter(const QString& layer, const QVariant& filter) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -1612,7 +1211,7 @@ QVariant QVariantFromValue(const mbgl::Value &value) { Filter value types are described in the {https://www.mapbox.com/mapbox-gl-js/style-spec/#types}{Mapbox style specification}. */ -QVariant QMapboxGL::getFilter(const QString &layer) const { +QVariant Map::getFilter(const QString &layer) const { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -1632,7 +1231,7 @@ QVariant QMapboxGL::getFilter(const QString &layer) const { Must be called on the render thread. */ -void QMapboxGL::createRenderer() +void Map::createRenderer() { d_ptr->createRenderer(); } @@ -1643,7 +1242,7 @@ void QMapboxGL::createRenderer() Must be called on the render thread. */ -void QMapboxGL::destroyRenderer() +void Map::destroyRenderer() { d_ptr->destroyRenderer(); } @@ -1652,9 +1251,9 @@ void QMapboxGL::destroyRenderer() Start a static rendering of the current state of the map. This should only be called when the map is initialized in static mode. - \sa QMapboxGLSettings::MapMode + \sa QMapLibreGL::Settings::MapMode */ -void QMapboxGL::startStaticRender() +void Map::startStaticRender() { d_ptr->mapObj->renderStill([this](std::exception_ptr err) { QString what; @@ -1682,19 +1281,19 @@ void QMapboxGL::startStaticRender() Must be called on the render thread. */ -void QMapboxGL::render() +void Map::render() { d_ptr->render(); } /*! - If Mapbox GL needs to rebind the default \a fbo, it will use the + If MapLibre GL needs to rebind the default \a fbo, it will use the ID supplied here. \a size is the size of the framebuffer, which on high DPI screens is usually bigger than the map size. Must be called on the render thread. */ -void QMapboxGL::setFramebufferObject(quint32 fbo, const QSize& size) +void Map::setFramebufferObject(quint32 fbo, const QSize& size) { d_ptr->setFramebufferObject(fbo, size); } @@ -1703,7 +1302,7 @@ void QMapboxGL::setFramebufferObject(quint32 fbo, const QSize& size) Informs the map that the network connection has been established, causing all network requests that previously timed out to be retried immediately. */ -void QMapboxGL::connectionEstablished() +void Map::connectionEstablished() { mbgl::NetworkStatus::Reachable(); } @@ -1712,13 +1311,13 @@ void QMapboxGL::connectionEstablished() Returns a list containing a pair of string objects, representing the style URL and name, respectively. */ -const QVector> &QMapboxGL::defaultStyles() const +const QVector> &Map::defaultStyles() const { return d_ptr->defaultStyles; } /*! - \fn void QMapboxGL::needsRendering() + \fn void QMapLibreGL::Map::needsRendering() This signal is emitted when the visual contents of the map have changed and a redraw is needed in order to keep the map visually consistent @@ -1728,7 +1327,7 @@ const QVector> &QMapboxGL::defaultStyles() const */ /*! - \fn void QMapboxGL::staticRenderFinished(const QString &error) + \fn void QMapLibreGL::Map::staticRenderFinished(const QString &error) This signal is emitted when a static map is fully drawn. Usually the next step is to extract the map from a framebuffer into a container like a @@ -1738,7 +1337,7 @@ const QVector> &QMapboxGL::defaultStyles() const */ /*! - \fn void QMapboxGL::mapChanged(QMapboxGL::MapChange change) + \fn void QMapLibreGL::Map::mapChanged(QMapLibreGL::Map::MapChange change) This signal is emitted when the state of the map has changed. This signal may be used for detecting errors when loading a style or detecting when @@ -1746,14 +1345,14 @@ const QVector> &QMapboxGL::defaultStyles() const */ /*! - \fn void QMapboxGL::mapLoadingFailed(QMapboxGL::MapLoadingFailure type, const QString &description) + \fn void QMapLibreGL::Map::mapLoadingFailed(QMapLibreGL::Map::MapLoadingFailure type, const QString &description) This signal is emitted when a map loading failure happens. Details of the failures are provided, including its \a type and textual \a description. */ /*! - \fn void QMapboxGL::copyrightsChanged(const QString ©rightsHtml); + \fn void QMapLibreGL::Map::copyrightsChanged(const QString ©rightsHtml); This signal is emitted when the copyrights of the current content of the map have changed. This can be caused by a style change or adding a new source. @@ -1761,40 +1360,22 @@ const QVector> &QMapboxGL::defaultStyles() const \a copyrightsHtml is a string with a HTML snippet. */ -mbgl::MapOptions mapOptionsFromQMapboxGLSettings(const QMapboxGLSettings &settings, const QSize &size, qreal pixelRatio) { - return std::move(mbgl::MapOptions() - .withSize(sanitizedSize(size)) - .withPixelRatio(pixelRatio) - .withMapMode(static_cast(settings.mapMode())) - .withConstrainMode(static_cast(settings.constrainMode())) - .withViewportMode(static_cast(settings.viewportMode()))); -} - -mbgl::ResourceOptions resourceOptionsFromQMapboxGLSettings(const QMapboxGLSettings &settings) { - return std::move(mbgl::ResourceOptions() - .withApiKey(settings.apiKey().toStdString()) - .withAssetPath(settings.assetPath().toStdString()) - .withTileServerOptions(*settings.tileServerOptionsInternal()) - .withCachePath(settings.cacheDatabasePath().toStdString()) - .withMaximumCacheSize(settings.cacheDatabaseMaximumSize())); -} - -QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settings, const QSize &size, qreal pixelRatio_) +MapPrivate::MapPrivate(Map *q, const Settings &settings, const QSize &size, qreal pixelRatio_) : QObject(q) , m_mode(settings.contextMode()) , m_pixelRatio(pixelRatio_) , m_localFontFamily(settings.localFontFamily()) { // Setup MapObserver - m_mapObserver = std::make_unique(this); + m_mapObserver = std::make_unique(this); - qRegisterMetaType("QMapboxGL::MapChange"); + qRegisterMetaType("Map::MapChange"); - connect(m_mapObserver.get(), &QMapboxGLMapObserver::mapChanged, q, &QMapboxGL::mapChanged); - connect(m_mapObserver.get(), &QMapboxGLMapObserver::mapLoadingFailed, q, &QMapboxGL::mapLoadingFailed); - connect(m_mapObserver.get(), &QMapboxGLMapObserver::copyrightsChanged, q, &QMapboxGL::copyrightsChanged); + connect(m_mapObserver.get(), &MapObserver::mapChanged, q, &Map::mapChanged); + connect(m_mapObserver.get(), &MapObserver::mapLoadingFailed, q, &Map::mapLoadingFailed); + connect(m_mapObserver.get(), &MapObserver::copyrightsChanged, q, &Map::copyrightsChanged); - auto resourceOptions = resourceOptionsFromQMapboxGLSettings(settings); + auto resourceOptions = resourceOptionsFromSettings(settings); for (auto style : resourceOptions.tileServerOptions().defaultStyles()) { defaultStyles.append(QPair( QString::fromStdString(style.getUrl()), QString::fromStdString(style.getName()))); @@ -1802,7 +1383,7 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin // Setup the Map object. mapObj = std::make_unique(*this, *m_mapObserver, - mapOptionsFromQMapboxGLSettings(settings, size, m_pixelRatio), + mapOptionsFromSettings(settings, size, m_pixelRatio), resourceOptions); if (settings.resourceTransform()) { @@ -1825,14 +1406,14 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin } // Needs to be Queued to give time to discard redundant draw calls via the `renderQueued` flag. - connect(this, &QMapboxGLPrivate::needsRendering, q, &QMapboxGL::needsRendering, Qt::QueuedConnection); + connect(this, &MapPrivate::needsRendering, q, &Map::needsRendering, Qt::QueuedConnection); } -QMapboxGLPrivate::~QMapboxGLPrivate() +MapPrivate::~MapPrivate() { } -void QMapboxGLPrivate::update(std::shared_ptr parameters) +void MapPrivate::update(std::shared_ptr parameters) { std::lock_guard lock(m_mapRendererMutex); @@ -1847,9 +1428,9 @@ void QMapboxGLPrivate::update(std::shared_ptr parameters requestRendering(); } -void QMapboxGLPrivate::setObserver(mbgl::RendererObserver &observer) +void MapPrivate::setObserver(mbgl::RendererObserver &observer) { - m_rendererObserver = std::make_shared( + m_rendererObserver = std::make_shared( *mbgl::util::RunLoop::Get(), observer); std::lock_guard lock(m_mapRendererMutex); @@ -1859,7 +1440,7 @@ void QMapboxGLPrivate::setObserver(mbgl::RendererObserver &observer) } } -void QMapboxGLPrivate::createRenderer() +void MapPrivate::createRenderer() { std::lock_guard lock(m_mapRendererMutex); @@ -1867,13 +1448,13 @@ void QMapboxGLPrivate::createRenderer() return; } - m_mapRenderer = std::make_unique( + m_mapRenderer = std::make_unique( m_pixelRatio, m_mode, m_localFontFamily ); - connect(m_mapRenderer.get(), &QMapboxGLMapRenderer::needsRendering, this, &QMapboxGLPrivate::requestRendering); + connect(m_mapRenderer.get(), &MapRenderer::needsRendering, this, &MapPrivate::requestRendering); m_mapRenderer->setObserver(m_rendererObserver); @@ -1883,14 +1464,14 @@ void QMapboxGLPrivate::createRenderer() } } -void QMapboxGLPrivate::destroyRenderer() +void MapPrivate::destroyRenderer() { std::lock_guard lock(m_mapRendererMutex); m_mapRenderer.reset(); } -void QMapboxGLPrivate::render() +void MapPrivate::render() { std::lock_guard lock(m_mapRendererMutex); @@ -1902,7 +1483,7 @@ void QMapboxGLPrivate::render() m_mapRenderer->render(); } -void QMapboxGLPrivate::setFramebufferObject(quint32 fbo, const QSize& size) +void MapPrivate::setFramebufferObject(quint32 fbo, const QSize& size) { std::lock_guard lock(m_mapRendererMutex); @@ -1913,14 +1494,14 @@ void QMapboxGLPrivate::setFramebufferObject(quint32 fbo, const QSize& size) m_mapRenderer->updateFramebuffer(fbo, sanitizedSize(size)); } -void QMapboxGLPrivate::requestRendering() +void MapPrivate::requestRendering() { if (!m_renderQueued.test_and_set()) { emit needsRendering(); } } -bool QMapboxGLPrivate::setProperty(const PropertySetter& setter, const QString& layer, const QString& name, const QVariant& value) { +bool MapPrivate::setProperty(const PropertySetter& setter, const QString& layer, const QString& name, const QVariant& value) { using namespace mbgl::style; Layer* layerObject = mapObj->getStyle().getLayer(layer.toStdString()); @@ -1958,3 +1539,5 @@ bool QMapboxGLPrivate::setProperty(const PropertySetter& setter, const QString& return true; } + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_p.hpp b/platform/qt/src/map_p.hpp similarity index 65% rename from platform/qt/src/qmapboxgl_p.hpp rename to platform/qt/src/map_p.hpp index 19dcfbe9b..af5e0d485 100644 --- a/platform/qt/src/qmapboxgl_p.hpp +++ b/platform/qt/src/map_p.hpp @@ -1,8 +1,9 @@ #pragma once -#include "qmapboxgl.hpp" -#include "qmapboxgl_map_observer.hpp" -#include "qmapboxgl_map_renderer.hpp" +#include + +#include "utils/map_observer.hpp" +#include "utils/map_renderer.hpp" #include #include @@ -16,13 +17,15 @@ #include #include -class QMapboxGLPrivate : public QObject, public mbgl::RendererFrontend +namespace QMapLibreGL { + +class MapPrivate : public QObject, public mbgl::RendererFrontend { Q_OBJECT public: - explicit QMapboxGLPrivate(QMapboxGL *, const QMapboxGLSettings &, const QSize &size, qreal pixelRatio); - virtual ~QMapboxGLPrivate(); + explicit MapPrivate(Map *, const Settings &, const QSize &size, qreal pixelRatio); + virtual ~MapPrivate(); // mbgl::RendererFrontend implementation. void reset() final {} @@ -39,7 +42,7 @@ public: bool setProperty(const PropertySetter& setter, const QString& layer, const QString& name, const QVariant& value); mbgl::EdgeInsets margins; - std::unique_ptr mapObj; + std::unique_ptr mapObj{}; QVector> defaultStyles; public slots: @@ -49,20 +52,22 @@ signals: void needsRendering(); private: - Q_DISABLE_COPY(QMapboxGLPrivate) + Q_DISABLE_COPY(MapPrivate) std::recursive_mutex m_mapRendererMutex; - std::shared_ptr m_rendererObserver; - std::shared_ptr m_updateParameters; + std::shared_ptr m_rendererObserver{}; + std::shared_ptr m_updateParameters{}; - std::unique_ptr m_mapObserver; - std::unique_ptr m_mapRenderer; - std::unique_ptr> m_resourceTransform; + std::unique_ptr m_mapObserver{}; + std::unique_ptr m_mapRenderer{}; + std::unique_ptr> m_resourceTransform{}; - QMapboxGLSettings::GLContextMode m_mode; + Settings::GLContextMode m_mode; qreal m_pixelRatio; QString m_localFontFamily; std::atomic_flag m_renderQueued = ATOMIC_FLAG_INIT; }; + +} // namespace QMapLibreGL diff --git a/platform/qt/src/async_task.cpp b/platform/qt/src/mbgl/async_task.cpp similarity index 100% rename from platform/qt/src/async_task.cpp rename to platform/qt/src/mbgl/async_task.cpp diff --git a/platform/qt/src/async_task_impl.hpp b/platform/qt/src/mbgl/async_task_impl.hpp similarity index 100% rename from platform/qt/src/async_task_impl.hpp rename to platform/qt/src/mbgl/async_task_impl.hpp diff --git a/platform/qt/src/bidi.cpp b/platform/qt/src/mbgl/bidi.cpp similarity index 100% rename from platform/qt/src/bidi.cpp rename to platform/qt/src/mbgl/bidi.cpp diff --git a/platform/qt/src/gl_functions.cpp b/platform/qt/src/mbgl/gl_functions.cpp similarity index 100% rename from platform/qt/src/gl_functions.cpp rename to platform/qt/src/mbgl/gl_functions.cpp diff --git a/platform/qt/src/headless_backend_qt.cpp b/platform/qt/src/mbgl/headless_backend_qt.cpp similarity index 100% rename from platform/qt/src/headless_backend_qt.cpp rename to platform/qt/src/mbgl/headless_backend_qt.cpp diff --git a/platform/qt/src/http_file_source.cpp b/platform/qt/src/mbgl/http_file_source.cpp similarity index 100% rename from platform/qt/src/http_file_source.cpp rename to platform/qt/src/mbgl/http_file_source.cpp diff --git a/platform/qt/src/http_file_source.hpp b/platform/qt/src/mbgl/http_file_source.hpp similarity index 100% rename from platform/qt/src/http_file_source.hpp rename to platform/qt/src/mbgl/http_file_source.hpp diff --git a/platform/qt/src/http_request.cpp b/platform/qt/src/mbgl/http_request.cpp similarity index 97% rename from platform/qt/src/http_request.cpp rename to platform/qt/src/mbgl/http_request.cpp index 014a75162..a7d152ea4 100644 --- a/platform/qt/src/http_request.cpp +++ b/platform/qt/src/mbgl/http_request.cpp @@ -39,7 +39,7 @@ QNetworkRequest HTTPRequest::networkRequest() const QNetworkRequest req = QNetworkRequest(requestUrl()); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - static const QByteArray agent = QString("MapboxGL/%1 (Qt %2)").arg(version::revision).arg(QT_VERSION_STR).toLatin1(); + static const QByteArray agent = QString("MapLibreGL/%1 (Qt %2)").arg(version::revision).arg(QT_VERSION_STR).toLatin1(); req.setRawHeader("User-Agent", agent); if (m_resource.priorEtag) { diff --git a/platform/qt/src/http_request.hpp b/platform/qt/src/mbgl/http_request.hpp similarity index 100% rename from platform/qt/src/http_request.hpp rename to platform/qt/src/mbgl/http_request.hpp diff --git a/platform/qt/src/qt_image.cpp b/platform/qt/src/mbgl/image.cpp similarity index 100% rename from platform/qt/src/qt_image.cpp rename to platform/qt/src/mbgl/image.cpp diff --git a/platform/qt/src/local_glyph_rasterizer.cpp b/platform/qt/src/mbgl/local_glyph_rasterizer.cpp similarity index 100% rename from platform/qt/src/local_glyph_rasterizer.cpp rename to platform/qt/src/mbgl/local_glyph_rasterizer.cpp diff --git a/platform/qt/src/qt_logging.cpp b/platform/qt/src/mbgl/logging_qt.cpp similarity index 100% rename from platform/qt/src/qt_logging.cpp rename to platform/qt/src/mbgl/logging_qt.cpp diff --git a/platform/qt/src/number_format.cpp b/platform/qt/src/mbgl/number_format.cpp similarity index 100% rename from platform/qt/src/number_format.cpp rename to platform/qt/src/mbgl/number_format.cpp diff --git a/platform/qt/src/run_loop.cpp b/platform/qt/src/mbgl/run_loop.cpp similarity index 100% rename from platform/qt/src/run_loop.cpp rename to platform/qt/src/mbgl/run_loop.cpp diff --git a/platform/qt/src/run_loop_impl.hpp b/platform/qt/src/mbgl/run_loop_impl.hpp similarity index 100% rename from platform/qt/src/run_loop_impl.hpp rename to platform/qt/src/mbgl/run_loop_impl.hpp diff --git a/platform/qt/src/sqlite3.cpp b/platform/qt/src/mbgl/sqlite3.cpp similarity index 100% rename from platform/qt/src/sqlite3.cpp rename to platform/qt/src/mbgl/sqlite3.cpp diff --git a/platform/qt/src/string_stdlib.cpp b/platform/qt/src/mbgl/string_stdlib.cpp similarity index 100% rename from platform/qt/src/string_stdlib.cpp rename to platform/qt/src/mbgl/string_stdlib.cpp diff --git a/platform/qt/src/thread.cpp b/platform/qt/src/mbgl/thread.cpp similarity index 100% rename from platform/qt/src/thread.cpp rename to platform/qt/src/mbgl/thread.cpp diff --git a/platform/qt/src/thread_local.cpp b/platform/qt/src/mbgl/thread_local.cpp similarity index 100% rename from platform/qt/src/thread_local.cpp rename to platform/qt/src/mbgl/thread_local.cpp diff --git a/platform/qt/src/timer.cpp b/platform/qt/src/mbgl/timer.cpp similarity index 100% rename from platform/qt/src/timer.cpp rename to platform/qt/src/mbgl/timer.cpp diff --git a/platform/qt/src/timer_impl.hpp b/platform/qt/src/mbgl/timer_impl.hpp similarity index 100% rename from platform/qt/src/timer_impl.hpp rename to platform/qt/src/mbgl/timer_impl.hpp diff --git a/platform/qt/src/utf.cpp b/platform/qt/src/mbgl/utf.cpp similarity index 100% rename from platform/qt/src/utf.cpp rename to platform/qt/src/mbgl/utf.cpp diff --git a/platform/qt/src/qmapbox.cpp b/platform/qt/src/qmapbox.cpp deleted file mode 100644 index ad0b79036..000000000 --- a/platform/qt/src/qmapbox.cpp +++ /dev/null @@ -1,231 +0,0 @@ -#include "qmapbox.hpp" - -#include -#include -#include -#include - -#include - -// mbgl::NetworkStatus::Status -static_assert(mbgl::underlying_type(QMapbox::Online) == mbgl::underlying_type(mbgl::NetworkStatus::Status::Online), "error"); -static_assert(mbgl::underlying_type(QMapbox::Offline) == mbgl::underlying_type(mbgl::NetworkStatus::Status::Offline), "error"); - -// mbgl::FeatureType -static_assert(mbgl::underlying_type(QMapbox::Feature::PointType) == mbgl::underlying_type(mbgl::FeatureType::Point), "error"); -static_assert(mbgl::underlying_type(QMapbox::Feature::LineStringType) == mbgl::underlying_type(mbgl::FeatureType::LineString), "error"); -static_assert(mbgl::underlying_type(QMapbox::Feature::PolygonType) == mbgl::underlying_type(mbgl::FeatureType::Polygon), "error"); - -namespace QMapbox { - -/*! - \namespace QMapbox - \inmodule Mapbox Maps SDK for Qt - - Contains miscellaneous Mapbox bindings used throughout QMapboxGL. -*/ - -/*! - \typedef QMapbox::Coordinate - - Alias for QPair. - Representation for geographical coordinates - latitude and longitude, respectively. -*/ - -/*! - \typedef QMapbox::CoordinateZoom - - Alias for QPair. - Used as return value in QMapboxGL::coordinateZoomForBounds. -*/ - -/*! - \typedef QMapbox::ProjectedMeters - - Alias for QPair. - Representation for projected meters - northing and easting, respectively. -*/ - -/*! - \typedef QMapbox::Coordinates - - Alias for QVector. - A list of QMapbox::Coordinate objects. -*/ - -/*! - \typedef QMapbox::CoordinatesCollection - - Alias for QVector. - A list of QMapbox::Coordinates objects. -*/ - -/*! - \typedef QMapbox::CoordinatesCollections - - Alias for QVector. - A list of QMapbox::CoordinatesCollection objects. -*/ - -/*! - \class QMapbox::Feature - - \inmodule Mapbox Maps SDK for Qt - - Represents \l {https://www.mapbox.com/help/define-features/}{map features} - via its \a type (PointType, LineStringType or PolygonType), \a geometry, \a - properties map and \a id (optional). -*/ - -/*! - \enum QMapbox::Feature::Type - - This enum is used as basis for geometry disambiguation in QMapbox::Feature. - - \value PointType A point geometry type. Means a single or a collection of points. - \value LineStringType A line string geometry type. Means a single or a collection of line strings. - \value PolygonType A polygon geometry type. Means a single or a collection of polygons. -*/ - -/*! - \class QMapbox::ShapeAnnotationGeometry - - \inmodule Mapbox Maps SDK for Qt - - Represents a shape annotation geometry. -*/ - -/*! - \enum QMapbox::ShapeAnnotationGeometry::Type - - This enum is used as basis for shape annotation geometry disambiguation. - - \value PolygonType A polygon geometry type. - \value LineStringType A line string geometry type. - \value MultiPolygonType A polygon geometry collection type. - \value MultiLineStringType A line string geometry collection type. -*/ - -/*! - \class QMapbox::SymbolAnnotation - - \inmodule Mapbox Maps SDK for Qt - - A symbol annotation comprises of its geometry and an icon identifier. -*/ - -/*! - \class QMapbox::LineAnnotation - - \inmodule Mapbox Maps SDK for Qt - - Represents a line annotation object, along with its properties. - - A line annotation comprises of its geometry and line properties such as opacity, width and color. -*/ - -/*! - \class QMapbox::FillAnnotation - - \inmodule Mapbox Maps SDK for Qt - - Represents a fill annotation object, along with its properties. - - A fill annotation comprises of its geometry and fill properties such as opacity, color and outline color. -*/ - -/*! - \typedef QMapbox::Annotation - - Alias for QVariant. - Container that encapsulates either a symbol, a line, a fill or a style sourced annotation. -*/ - -/*! - \typedef QMapbox::AnnotationID - - Alias for quint32 representing an annotation identifier. -*/ - -/*! - \typedef QMapbox::AnnotationIDs - - Alias for QVector representing a container of annotation identifiers. -*/ - -/*! - \class QMapbox::CustomLayerHostInterface - - Represents a host interface to be implemented for rendering custom layers. - - \warning This is used for delegating the rendering of a layer to the user of - this API and is not officially supported. Use at your own risk. -*/ - -/*! - \enum QMapbox::NetworkMode - - This enum represents whether server requests can be performed via network. - - \value Online Server network requests are accessible. - \value Offline Only requests to the local cache are accessible. -*/ - -/*! - \class QMapbox::CustomLayerRenderParameters - \inmodule Mapbox Maps SDK for Qt - - QMapbox::CustomLayerRenderParameters provides the data passed on each render - pass for a custom layer. -*/ - -/*! - \fn QMapbox::NetworkMode QMapbox::networkMode() - - Returns the current QMapbox::NetworkMode. -*/ -NetworkMode networkMode() -{ - return static_cast(mbgl::NetworkStatus::Get()); -} - -/*! - \fn void QMapbox::setNetworkMode(QMapbox::NetworkMode mode) - - Forwards the network status \a mode to Mapbox GL Native engine. - - File source requests uses the available network when \a mode is set to \b - Online, otherwise scoped to the local cache. -*/ -void setNetworkMode(NetworkMode mode) -{ - mbgl::NetworkStatus::Set(static_cast(mode)); -} - -/*! - Returns the amount of meters per pixel from a given \a latitude and \a zoom. -*/ -double metersPerPixelAtLatitude(double latitude, double zoom) -{ - return mbgl::Projection::getMetersPerPixelAtLatitude(latitude, zoom); -} - -/*! - Return the projected meters for a given \a coordinate object. -*/ -ProjectedMeters projectedMetersForCoordinate(const Coordinate &coordinate) -{ - auto projectedMeters = mbgl::Projection::projectedMetersForLatLng(mbgl::LatLng { coordinate.first, coordinate.second }); - return QMapbox::ProjectedMeters(projectedMeters.northing(), projectedMeters.easting()); -} - -/*! - Returns the coordinate for a given \a projectedMeters object. -*/ -Coordinate coordinateForProjectedMeters(const ProjectedMeters &projectedMeters) -{ - auto latLng = mbgl::Projection::latLngForProjectedMeters(mbgl::ProjectedMeters { projectedMeters.first, projectedMeters.second }); - return QMapbox::Coordinate(latLng.latitude(), latLng.longitude()); -} - -} // namespace QMapbox diff --git a/platform/qt/src/qmapboxgl_map_observer.cpp b/platform/qt/src/qmapboxgl_map_observer.cpp deleted file mode 100644 index 00af666b0..000000000 --- a/platform/qt/src/qmapboxgl_map_observer.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include "qmapboxgl_map_observer.hpp" - -#include "qmapboxgl_p.hpp" - -#include - -#include - -QMapboxGLMapObserver::QMapboxGLMapObserver(QMapboxGLPrivate *d) - : d_ptr(d) -{ -} - -QMapboxGLMapObserver::~QMapboxGLMapObserver() -{ -} - -void QMapboxGLMapObserver::onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode) -{ - if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) { - emit mapChanged(QMapboxGL::MapChangeRegionWillChange); - } else { - emit mapChanged(QMapboxGL::MapChangeRegionWillChangeAnimated); - } -} - -void QMapboxGLMapObserver::onCameraIsChanging() -{ - emit mapChanged(QMapboxGL::MapChangeRegionIsChanging); -} - -void QMapboxGLMapObserver::onCameraDidChange(mbgl::MapObserver::CameraChangeMode mode) -{ - if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) { - emit mapChanged(QMapboxGL::MapChangeRegionDidChange); - } else { - emit mapChanged(QMapboxGL::MapChangeRegionDidChangeAnimated); - } -} - -void QMapboxGLMapObserver::onWillStartLoadingMap() -{ - emit mapChanged(QMapboxGL::MapChangeWillStartLoadingMap); -} - -void QMapboxGLMapObserver::onDidFinishLoadingMap() -{ - emit mapChanged(QMapboxGL::MapChangeDidFinishLoadingMap); -} - -void QMapboxGLMapObserver::onDidFailLoadingMap(mbgl::MapLoadError error, const std::string& what) -{ - emit mapChanged(QMapboxGL::MapChangeDidFailLoadingMap); - - QMapboxGL::MapLoadingFailure type; - QString description(what.c_str()); - - switch (error) { - case mbgl::MapLoadError::StyleParseError: - type = QMapboxGL::MapLoadingFailure::StyleParseFailure; - break; - case mbgl::MapLoadError::StyleLoadError: - type = QMapboxGL::MapLoadingFailure::StyleLoadFailure; - break; - case mbgl::MapLoadError::NotFoundError: - type = QMapboxGL::MapLoadingFailure::NotFoundFailure; - break; - default: - type = QMapboxGL::MapLoadingFailure::UnknownFailure; - } - - emit mapLoadingFailed(type, description); -} - -void QMapboxGLMapObserver::onWillStartRenderingFrame() -{ - emit mapChanged(QMapboxGL::MapChangeWillStartRenderingFrame); -} - -void QMapboxGLMapObserver::onDidFinishRenderingFrame(mbgl::MapObserver::RenderFrameStatus status) -{ - if (status.mode == mbgl::MapObserver::RenderMode::Partial) { - emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingFrame); - } else { - emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingFrameFullyRendered); - } -} - -void QMapboxGLMapObserver::onWillStartRenderingMap() -{ - emit mapChanged(QMapboxGL::MapChangeWillStartRenderingMap); -} - -void QMapboxGLMapObserver::onDidFinishRenderingMap(mbgl::MapObserver::RenderMode mode) -{ - if (mode == mbgl::MapObserver::RenderMode::Partial) { - emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingMap); - } else { - emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingMapFullyRendered); - } -} - -void QMapboxGLMapObserver::onDidFinishLoadingStyle() -{ - emit mapChanged(QMapboxGL::MapChangeDidFinishLoadingStyle); -} - -void QMapboxGLMapObserver::onSourceChanged(mbgl::style::Source&) -{ - std::string attribution; - for (const auto& source : d_ptr->mapObj->getStyle().getSources()) { - // Avoid duplicates by using the most complete attribution HTML snippet. - if (source->getAttribution() && (attribution.size() < source->getAttribution()->size())) - attribution = *source->getAttribution(); - } - emit copyrightsChanged(QString::fromStdString(attribution)); - emit mapChanged(QMapboxGL::MapChangeSourceDidChange); -} diff --git a/platform/qt/src/qmapboxgl_renderer_backend.cpp b/platform/qt/src/qmapboxgl_renderer_backend.cpp deleted file mode 100644 index 39b49fe48..000000000 --- a/platform/qt/src/qmapboxgl_renderer_backend.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "qmapboxgl_renderer_backend.hpp" - -#include -#include - -#include -#include - -class QMapboxGLRenderableResource final : public mbgl::gl::RenderableResource { -public: - QMapboxGLRenderableResource(QMapboxGLRendererBackend& backend_) : backend(backend_) { - } - - void bind() override { - assert(mbgl::gfx::BackendScope::exists()); - backend.restoreFramebufferBinding(); - backend.setViewport(0, 0, backend.getSize()); - } - -private: - QMapboxGLRendererBackend& backend; -}; - -QMapboxGLRendererBackend::QMapboxGLRendererBackend(const mbgl::gfx::ContextMode contextMode_) - : mbgl::gl::RendererBackend(contextMode_), - mbgl::gfx::Renderable({ 0, 0 }, std::make_unique(*this)) { -} - -QMapboxGLRendererBackend::~QMapboxGLRendererBackend() = default; - -void QMapboxGLRendererBackend::updateAssumedState() { - assumeFramebufferBinding(ImplicitFramebufferBinding); - assumeViewport(0, 0, size); -} - -void QMapboxGLRendererBackend::restoreFramebufferBinding() { - setFramebufferBinding(m_fbo); -} - -void QMapboxGLRendererBackend::updateFramebuffer(quint32 fbo, const mbgl::Size& newSize) { - m_fbo = fbo; - size = newSize; -} - -/*! - Initializes an OpenGL extension function such as Vertex Array Objects (VAOs), - required by Mapbox GL Native engine. -*/ -mbgl::gl::ProcAddress QMapboxGLRendererBackend::getExtensionFunctionPointer(const char* name) { - QOpenGLContext* thisContext = QOpenGLContext::currentContext(); - return thisContext->getProcAddress(name); -} diff --git a/platform/qt/src/qt_geojson.hpp b/platform/qt/src/qt_geojson.hpp deleted file mode 100644 index a7db3ba64..000000000 --- a/platform/qt/src/qt_geojson.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -#include -#include -#include - -#include - -namespace QMapbox { - -mbgl::Point asMapboxGLPoint(const QMapbox::Coordinate &coordinate); -mbgl::MultiPoint asMapboxGLMultiPoint(const QMapbox::Coordinates &multiPoint); -mbgl::LineString asMapboxGLLineString(const QMapbox::Coordinates &lineString); -mbgl::MultiLineString asMapboxGLMultiLineString(const QMapbox::CoordinatesCollection &multiLineString); -mbgl::Polygon asMapboxGLPolygon(const QMapbox::CoordinatesCollection &polygon); -mbgl::MultiPolygon asMapboxGLMultiPolygon(const QMapbox::CoordinatesCollections &multiPolygon); -mbgl::Value asMapboxGLPropertyValue(const QVariant &value); -mbgl::FeatureIdentifier asMapboxGLFeatureIdentifier(const QVariant &id); -mbgl::GeoJSONFeature asMapboxGLFeature(const QMapbox::Feature &feature); - -} // namespace QMapbox diff --git a/platform/qt/src/settings.cpp b/platform/qt/src/settings.cpp new file mode 100644 index 000000000..abb5b0b6f --- /dev/null +++ b/platform/qt/src/settings.cpp @@ -0,0 +1,411 @@ +#include + +#include +#include +#include +#include +#include + +#include + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4805) +#endif + +// mbgl::GLContextMode +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::UniqueGLContext) == mbgl::underlying_type(mbgl::gfx::ContextMode::Unique), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::SharedGLContext) == mbgl::underlying_type(mbgl::gfx::ContextMode::Shared), "error"); + +// mbgl::MapMode +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::Continuous) == mbgl::underlying_type(mbgl::MapMode::Continuous), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::Static) == mbgl::underlying_type(mbgl::MapMode::Static), "error"); + +// mbgl::ConstrainMode +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::NoConstrain) == mbgl::underlying_type(mbgl::ConstrainMode::None), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::ConstrainHeightOnly) == mbgl::underlying_type(mbgl::ConstrainMode::HeightOnly), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::ConstrainWidthAndHeight) == mbgl::underlying_type(mbgl::ConstrainMode::WidthAndHeight), "error"); + +// mbgl::ViewportMode +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::DefaultViewport) == mbgl::underlying_type(mbgl::ViewportMode::Default), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Settings::FlippedYViewport) == mbgl::underlying_type(mbgl::ViewportMode::FlippedY), "error"); + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + +namespace QMapLibreGL { + +/*! + \class QMapLibreGL::Settings + \brief The Settings class stores the initial configuration for QMapLibreGL::Map. + + \inmodule MapLibre Maps SDK for Qt + + Settings is used to configure QMapLibreGL::Map at the moment of its creation. + Once created, the Settings of a QMapLibreGL::Map can no longer be changed. + + Cache-related settings are shared between all QMapLibreGL::Map instances using the same cache path. + The first map to configure cache properties such as size will force the configuration + to all newly instantiated QMapLibreGL::Map objects using the same cache in the same process. +*/ + +/*! + \enum QMapLibreGL::Settings::GLContextMode + + This enum sets the expectations for the OpenGL state. + + \value UniqueGLContext The OpenGL context is only used by QMapLibreGL::Map, so it is not + reset before each rendering. Use this mode if the intention is to only draw a + fullscreen map. + + \value SharedGLContext The OpenGL context is shared and the state will be + marked dirty - which invalidates any previously assumed GL state. The + embedder is responsible for clearing up the viewport prior to calling + QMapLibreGL::Map::render. The embedder is also responsible for resetting its own + GL state after QMapLibreGL::Map::render has finished, if needed. + + \sa contextMode() +*/ + +/*! + \enum QMapLibreGL::Settings::MapMode + + This enum sets the map rendering mode + + \value Continuous The map will render as data arrives from the network and + react immediately to state changes. + + This is the default mode and the preferred when the map is intended to be + interactive. + + \value Static The map will no longer react to state changes and will only + be rendered when QMapLibreGL::Map::startStaticRender is called. After all the + resources are loaded, the QMapLibreGL::Map::staticRenderFinished signal is emitted. + + This mode is useful for taking a snapshot of the finished rendering result + of the map into a QImage. + + \sa mapMode() +*/ + +/*! + \enum QMapLibreGL::Settings::ConstrainMode + + This enum determines if the map wraps. + + \value NoConstrain The map will wrap on the horizontal axis. Since it doesn't + make sense to wrap on the vertical axis in a Web Mercator projection, the map will scroll + and show some empty space. + + \value ConstrainHeightOnly The map will wrap around the horizontal axis, like a spinning + globe. This is the recommended constrain mode. + + \value ConstrainWidthAndHeight The map won't wrap and panning is restricted to the boundaries + of the map. + + \sa constrainMode() +*/ + +/*! + \enum QMapLibreGL::Settings::ViewportMode + + This enum flips the map vertically. + + \value DefaultViewport Native orientation. + + \value FlippedYViewport Mirrored vertically. + + \sa viewportMode() +*/ + +/*! + Constructs a Settings object with the default values. The default + configuration is valid for initializing a QMapLibreGL::Map. +*/ +Settings::Settings() + : m_contextMode(Settings::SharedGLContext) + , m_mapMode(Settings::Continuous) + , m_constrainMode(Settings::ConstrainHeightOnly) + , m_viewportMode(Settings::DefaultViewport) + , m_cacheMaximumSize(mbgl::util::DEFAULT_MAX_CACHE_SIZE) + , m_cacheDatabasePath(":memory:") + , m_assetPath(QCoreApplication::applicationDirPath()) + , m_apiKey(qgetenv("MGL_API_KEY")) + , m_tileServerOptionsInternal(new mbgl::TileServerOptions(mbgl::TileServerOptions::DefaultConfiguration())) +{ +} + +/*! + Returns the OpenGL context mode. This is specially important when mixing + with other OpenGL draw calls. + + By default, it is set to Settings::SharedGLContext. +*/ +Settings::GLContextMode Settings::contextMode() const +{ + return m_contextMode; +} + +/*! + Sets the OpenGL context \a mode. +*/ +void Settings::setContextMode(GLContextMode mode) +{ + m_contextMode = mode; +} + +/*! + Returns the map mode. Static mode will emit a signal for + rendering a map only when the map is fully loaded. + Animations like style transitions and labels fading won't + be seen. + + The Continuous mode will emit the signal for every new + change on the map and it is usually what you expect for + a interactive map. + + By default, it is set to QMapLibreGL::Settings::Continuous. +*/ +Settings::MapMode Settings::mapMode() const +{ + return m_mapMode; +} + +/*! + Sets the map \a mode. +*/ +void Settings::setMapMode(MapMode mode) +{ + m_mapMode = mode; +} + +/*! + Returns the constrain mode. This is used to limit the map to wrap + around the globe horizontally. + + By default, it is set to QMapLibreGL::Settings::ConstrainHeightOnly. +*/ +Settings::ConstrainMode Settings::constrainMode() const +{ + return m_constrainMode; +} + +/*! + Sets the map constrain \a mode. +*/ +void Settings::setConstrainMode(ConstrainMode mode) +{ + m_constrainMode = mode; +} + +/*! + Returns the viewport mode. This is used to flip the vertical + orientation of the map as some devices may use inverted orientation. + + By default, it is set to QMapLibreGL::Settings::DefaultViewport. +*/ +Settings::ViewportMode Settings::viewportMode() const +{ + return m_viewportMode; +} + +/*! + Sets the viewport \a mode. +*/ +void Settings::setViewportMode(ViewportMode mode) +{ + m_viewportMode = mode; +} + +/*! + Returns the cache database maximum hard size in bytes. The database + will grow until the limit is reached. Setting a maximum size smaller + than the current size of an existing database results in undefined + behavior + + By default, it is set to 50 MB. +*/ +unsigned Settings::cacheDatabaseMaximumSize() const +{ + return m_cacheMaximumSize; +} + +/*! + Returns the maximum allowed cache database \a size in bytes. +*/ +void Settings::setCacheDatabaseMaximumSize(unsigned size) +{ + m_cacheMaximumSize = size; +} + +/*! + Returns the cache database path. The cache is used for storing + recently used resources like tiles and also an offline tile database + pre-populated by the + \l {https://github.com/mapbox/mapbox-gl-native/blob/master/bin/offline.sh} + {Offline Tool}. + + By default, it is set to \c :memory: meaning it will create an in-memory + cache instead of a file on disk. +*/ +QString Settings::cacheDatabasePath() const +{ + return m_cacheDatabasePath; +} + +/*! + Sets the cache database \a path. + + Setting the \a path to \c :memory: will create an in-memory cache. +*/ +void Settings::setCacheDatabasePath(const QString &path) +{ + m_cacheDatabasePath = path; +} + +/*! + Returns the asset path, which is the root directory from where + the \c asset:// scheme gets resolved in a style. \c asset:// can be used + for loading a resource from the disk in a style rather than fetching + it from the network. + + By default, it is set to the value returned by QCoreApplication::applicationDirPath(). +*/ +QString Settings::assetPath() const +{ + return m_assetPath; +} + +/*! + Sets the asset \a path. +*/ +void Settings::setAssetPath(const QString &path) +{ + m_assetPath = path; +} + +/*! + Returns the API key. + + By default, it is taken from the environment variable \c MGL_API_KEY + or empty if the variable is not set. +*/ +QString Settings::apiKey() const { + return m_apiKey; +} + +/*! + Sets the API key. + + MapTiler-hosted and Mapbox-hosted vector tiles and styles require an API + key or access token. +*/ +void Settings::setApiKey(const QString &key) +{ + m_apiKey = key; +} + +/*! + Returns the API base URL. +*/ +QString Settings::apiBaseUrl() const +{ + return QString::fromStdString(m_tileServerOptionsInternal->baseURL()); +} + +/*! + Sets the API base \a url. + + The API base URL is the URL that the \b "mapbox://" protocol will + be resolved to. It defaults to "https://api.mapbox.com" but can be + changed, for instance, to a tile cache server address. +*/ +void Settings::setApiBaseUrl(const QString& url) +{ + m_tileServerOptionsInternal = &m_tileServerOptionsInternal->withBaseURL(url.toStdString()); +} + +/*! + Returns the local font family. Returns an empty string if no local font family is set. +*/ +QString Settings::localFontFamily() const +{ + return m_localFontFamily; +} + +/*! + Sets the local font family. + + Rendering Chinese/Japanese/Korean (CJK) ideographs and precomposed Hangul Syllables requires + downloading large amounts of font data, which can significantly slow map load times. Use the + localIdeographFontFamily setting to speed up map load times by using locally available fonts + instead of font data fetched from the server. +*/ +void Settings::setLocalFontFamily(const QString &family) +{ + m_localFontFamily = family; +} + +/*! + Returns resource transformation callback used to transform requested URLs. +*/ +std::function Settings::resourceTransform() const { + return m_resourceTransform; +} + +/*! + Sets the resource \a transform callback. + + When given, resource transformation callback will be used to transform the + requested resource URLs before they are requested from internet. This can be + used add or remove custom parameters, or reroute certain requests to other + servers or endpoints. +*/ +void Settings::setResourceTransform(const std::function &transform) { + m_resourceTransform = transform; +} + +/*! + Reset all settings based on the given template. + + MapLibre can support servers with different resource path structure. + Some of the most common servers like Maptiler and Mapbox are defined + in the library. This function will re-initialise all settings based + on the default values of specific service provider defaults. +*/ +void Settings::resetToTemplate(SettingsTemplate settings_template) +{ + if(m_tileServerOptionsInternal) delete m_tileServerOptionsInternal; + + if(settings_template == MapLibreSettings){ + m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapLibreConfiguration()); + }else if(settings_template == MapTilerSettings){ + m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapTilerConfiguration()); + }else if(settings_template == MapboxSettings){ + m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::MapboxConfiguration()); + }else{ + m_tileServerOptionsInternal = new mbgl::TileServerOptions(mbgl::TileServerOptions::DefaultConfiguration()); + } +} + +/*! + All predefined styles. + + Return all styles that are defined in default settings. +*/ +QVector > Settings::defaultStyles() const { + QVector> styles; + for (const auto &style : tileServerOptionsInternal()->defaultStyles()) { + styles.append(QPair( + QString::fromStdString(style.getUrl()), QString::fromStdString(style.getName()))); + } + return styles; +} + +mbgl::TileServerOptions *Settings::tileServerOptionsInternal() const { + return m_tileServerOptionsInternal; +} + +} // namespace QMapLibreGL diff --git a/platform/qt/src/types.cpp b/platform/qt/src/types.cpp new file mode 100644 index 000000000..b766e2553 --- /dev/null +++ b/platform/qt/src/types.cpp @@ -0,0 +1,172 @@ +#include + +#include "mbgl/util/geometry.hpp" +#include "mbgl/util/traits.hpp" + +// mbgl::FeatureType +static_assert(mbgl::underlying_type(QMapLibreGL::Feature::PointType) == mbgl::underlying_type(mbgl::FeatureType::Point), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Feature::LineStringType) == mbgl::underlying_type(mbgl::FeatureType::LineString), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Feature::PolygonType) == mbgl::underlying_type(mbgl::FeatureType::Polygon), "error"); + +namespace QMapLibreGL { + +/*! + \namespace QMapLibreGL + \inmodule MapLibre Maps SDK for Qt + + Contains miscellaneous MapLibre types and utilities used throughout QMapLibreGLGL. +*/ + +/*! + \typedef QMapLibreGL::Coordinate + + Alias for QPair. + Representation for geographical coordinates - latitude and longitude, respectively. +*/ + +/*! + \typedef QMapLibreGL::CoordinateZoom + + Alias for QPair. + Used as return value in QMapLibreGLGL::coordinateZoomForBounds. +*/ + +/*! + \typedef QMapLibreGL::ProjectedMeters + + Alias for QPair. + Representation for projected meters - northing and easting, respectively. +*/ + +/*! + \typedef QMapLibreGL::Coordinates + + Alias for QVector. + A list of QMapLibreGL::Coordinate objects. +*/ + +/*! + \typedef QMapLibreGL::CoordinatesCollection + + Alias for QVector. + A list of QMapLibreGL::Coordinates objects. +*/ + +/*! + \typedef QMapLibreGL::CoordinatesCollections + + Alias for QVector. + A list of QMapLibreGL::CoordinatesCollection objects. +*/ + +/*! + \class QMapLibreGL::Feature + + \inmodule MapLibre Maps SDK for Qt + + Represents \l {https://www.mapbox.com/help/define-features/}{map features} + via its \a type (PointType, LineStringType or PolygonType), \a geometry, \a + properties map and \a id (optional). +*/ + +/*! + \enum QMapLibreGL::Feature::Type + + This enum is used as basis for geometry disambiguation in QMapLibreGL::Feature. + + \value PointType A point geometry type. Means a single or a collection of points. + \value LineStringType A line string geometry type. Means a single or a collection of line strings. + \value PolygonType A polygon geometry type. Means a single or a collection of polygons. +*/ + +/*! + \class QMapLibreGL::ShapeAnnotationGeometry + + \inmodule MapLibre Maps SDK for Qt + + Represents a shape annotation geometry. +*/ + +/*! + \enum QMapLibreGL::ShapeAnnotationGeometry::Type + + This enum is used as basis for shape annotation geometry disambiguation. + + \value PolygonType A polygon geometry type. + \value LineStringType A line string geometry type. + \value MultiPolygonType A polygon geometry collection type. + \value MultiLineStringType A line string geometry collection type. +*/ + +/*! + \class QMapLibreGL::SymbolAnnotation + + \inmodule MapLibre Maps SDK for Qt + + A symbol annotation comprises of its geometry and an icon identifier. +*/ + +/*! + \class QMapLibreGL::LineAnnotation + + \inmodule MapLibre Maps SDK for Qt + + Represents a line annotation object, along with its properties. + + A line annotation comprises of its geometry and line properties such as opacity, width and color. +*/ + +/*! + \class QMapLibreGL::FillAnnotation + + \inmodule MapLibre Maps SDK for Qt + + Represents a fill annotation object, along with its properties. + + A fill annotation comprises of its geometry and fill properties such as opacity, color and outline color. +*/ + +/*! + \typedef QMapLibreGL::Annotation + + Alias for QVariant. + Container that encapsulates either a symbol, a line, a fill or a style sourced annotation. +*/ + +/*! + \typedef QMapLibreGL::AnnotationID + + Alias for quint32 representing an annotation identifier. +*/ + +/*! + \typedef QMapLibreGL::AnnotationIDs + + Alias for QVector representing a container of annotation identifiers. +*/ + +/*! + \class QMapLibreGL::CameraOptions + \inmodule MapLibre Maps SDK for Qt + + QMapLibreGL::CameraOptions provides camera options to the renderer. +*/ + +/*! + \class QMapLibreGL::CustomLayerHostInterface + + Represents a host interface to be implemented for rendering custom layers. + + \warning This is used for delegating the rendering of a layer to the user of + this API and is not officially supported. Use at your own risk. +*/ + +/*! + \class QMapLibreGL::CustomLayerRenderParameters + \inmodule MapLibre Maps SDK for Qt + + QMapLibreGL::CustomLayerRenderParameters provides the data passed on each render + pass for a custom layer. +*/ + +} // namespace QMapLibreGL diff --git a/platform/qt/src/utils.cpp b/platform/qt/src/utils.cpp new file mode 100644 index 000000000..8210d7ae7 --- /dev/null +++ b/platform/qt/src/utils.cpp @@ -0,0 +1,74 @@ +#include + +#include +#include +#include +#include + +#include + +// mbgl::NetworkStatus::Status +static_assert(mbgl::underlying_type(QMapLibreGL::Online) == mbgl::underlying_type(mbgl::NetworkStatus::Status::Online), "error"); +static_assert(mbgl::underlying_type(QMapLibreGL::Offline) == mbgl::underlying_type(mbgl::NetworkStatus::Status::Offline), "error"); + +namespace QMapLibreGL { + +/*! + \enum QMapLibreGL::NetworkMode + + This enum represents whether server requests can be performed via network. + + \value Online Server network requests are accessible. + \value Offline Only requests to the local cache are accessible. +*/ + +/*! + \fn QMapLibreGL::NetworkMode QMapLibreGL::networkMode() + + Returns the current QMapLibreGL::NetworkMode. +*/ +NetworkMode networkMode() +{ + return static_cast(mbgl::NetworkStatus::Get()); +} + +/*! + \fn void QMapLibreGL::setNetworkMode(QMapLibreGL::NetworkMode mode) + + Forwards the network status \a mode to MapLibre GL Native engine. + + File source requests uses the available network when \a mode is set to \b + Online, otherwise scoped to the local cache. +*/ +void setNetworkMode(NetworkMode mode) +{ + mbgl::NetworkStatus::Set(static_cast(mode)); +} + +/*! + Returns the amount of meters per pixel from a given \a latitude and \a zoom. +*/ +double metersPerPixelAtLatitude(double latitude, double zoom) +{ + return mbgl::Projection::getMetersPerPixelAtLatitude(latitude, zoom); +} + +/*! + Return the projected meters for a given \a coordinate object. +*/ +ProjectedMeters projectedMetersForCoordinate(const Coordinate &coordinate) +{ + auto projectedMeters = mbgl::Projection::projectedMetersForLatLng(mbgl::LatLng { coordinate.first, coordinate.second }); + return ProjectedMeters(projectedMeters.northing(), projectedMeters.easting()); +} + +/*! + Returns the coordinate for a given \a projectedMeters object. +*/ +Coordinate coordinateForProjectedMeters(const ProjectedMeters &projectedMeters) +{ + auto latLng = mbgl::Projection::latLngForProjectedMeters(mbgl::ProjectedMeters { projectedMeters.first, projectedMeters.second }); + return Coordinate(latLng.latitude(), latLng.longitude()); +} + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qt_conversion.hpp b/platform/qt/src/utils/conversion.hpp similarity index 90% rename from platform/qt/src/qt_conversion.hpp rename to platform/qt/src/utils/conversion.hpp index 00a39c64b..f71a333ec 100644 --- a/platform/qt/src/qt_conversion.hpp +++ b/platform/qt/src/utils/conversion.hpp @@ -1,13 +1,15 @@ #pragma once +#include + +#include "geojson.hpp" + #include #include #include -#include #include -#include -#include "qt_geojson.hpp" +#include namespace mbgl { namespace style { @@ -46,9 +48,9 @@ public: return value.canConvert(QVariant::Map) || value.type() == QVariant::ByteArray #endif - || QString(value.typeName()) == QStringLiteral("QMapbox::Feature") - || value.userType() == qMetaTypeId>() - || value.userType() == qMetaTypeId>(); + || QString(value.typeName()) == QStringLiteral("QMapLibreGL::Feature") + || value.userType() == qMetaTypeId>() + || value.userType() == qMetaTypeId>(); } static optional objectMember(const QVariant& value, const char* key) { @@ -168,12 +170,12 @@ public: } static optional toGeoJSON(const QVariant& value, Error& error) { - if (value.typeName() == QStringLiteral("QMapbox::Feature")) { - return GeoJSON { asMapboxGLFeature(value.value()) }; - } else if (value.userType() == qMetaTypeId>()) { - return featureCollectionToGeoJSON(value.value>()); - } else if (value.userType() == qMetaTypeId>()) { - return featureCollectionToGeoJSON(value.value>()); + if (value.typeName() == QStringLiteral("QMapLibreGL::Feature")) { + return GeoJSON { QMapLibreGL::GeoJSON::asFeature(value.value()) }; + } else if (value.userType() == qMetaTypeId>()) { + return featureCollectionToGeoJSON(value.value>()); + } else if (value.userType() == qMetaTypeId>()) { + return featureCollectionToGeoJSON(value.value>()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) } else if (value.typeId() != QMetaType::QByteArray) { #else @@ -193,7 +195,7 @@ private: mapbox::feature::feature_collection collection; collection.reserve(static_cast(features.size())); for (const auto &feature : features) { - collection.push_back(asMapboxGLFeature(feature)); + collection.push_back(QMapLibreGL::GeoJSON::asFeature(feature)); } return GeoJSON { std::move(collection) }; } diff --git a/platform/qt/src/qt_geojson.cpp b/platform/qt/src/utils/geojson.cpp similarity index 60% rename from platform/qt/src/qt_geojson.cpp rename to platform/qt/src/utils/geojson.cpp index 4198be6e8..a37e51520 100644 --- a/platform/qt/src/qt_geojson.cpp +++ b/platform/qt/src/utils/geojson.cpp @@ -1,69 +1,69 @@ -#include "qt_geojson.hpp" +#include "geojson.hpp" -#pragma clang diagnostic ignored "-Wenum-compare-switch" +#include -namespace QMapbox { +namespace QMapLibreGL::GeoJSON { -mbgl::Point asMapboxGLPoint(const QMapbox::Coordinate &coordinate) { +mbgl::Point asPoint(const Coordinate &coordinate) { return mbgl::Point { coordinate.second, coordinate.first }; } -mbgl::MultiPoint asMapboxGLMultiPoint(const QMapbox::Coordinates &multiPoint) { +mbgl::MultiPoint asMultiPoint(const Coordinates &multiPoint) { mbgl::MultiPoint mbglMultiPoint; mbglMultiPoint.reserve(multiPoint.size()); for (const auto &point: multiPoint) { - mbglMultiPoint.emplace_back(asMapboxGLPoint(point)); + mbglMultiPoint.emplace_back(asPoint(point)); } return mbglMultiPoint; }; -mbgl::LineString asMapboxGLLineString(const QMapbox::Coordinates &lineString) { +mbgl::LineString asLineString(const Coordinates &lineString) { mbgl::LineString mbglLineString; mbglLineString.reserve(lineString.size()); for (const auto &coordinate : lineString) { - mbglLineString.emplace_back(asMapboxGLPoint(coordinate)); + mbglLineString.emplace_back(asPoint(coordinate)); } return mbglLineString; }; -mbgl::MultiLineString asMapboxGLMultiLineString(const QMapbox::CoordinatesCollection &multiLineString) { +mbgl::MultiLineString asMultiLineString(const CoordinatesCollection &multiLineString) { mbgl::MultiLineString mbglMultiLineString; mbglMultiLineString.reserve(multiLineString.size()); for (const auto &lineString : multiLineString) { - mbglMultiLineString.emplace_back(std::forward>(asMapboxGLLineString(lineString))); + mbglMultiLineString.emplace_back(std::forward>(asLineString(lineString))); } return mbglMultiLineString; }; -mbgl::Polygon asMapboxGLPolygon(const QMapbox::CoordinatesCollection &polygon) { +mbgl::Polygon asPolygon(const CoordinatesCollection &polygon) { mbgl::Polygon mbglPolygon; mbglPolygon.reserve(polygon.size()); for (const auto &linearRing : polygon) { mbgl::LinearRing mbglLinearRing; mbglLinearRing.reserve(linearRing.size()); for (const auto &coordinate: linearRing) { - mbglLinearRing.emplace_back(asMapboxGLPoint(coordinate)); + mbglLinearRing.emplace_back(asPoint(coordinate)); } mbglPolygon.emplace_back(std::move(mbglLinearRing)); } return mbglPolygon; }; -mbgl::MultiPolygon asMapboxGLMultiPolygon(const QMapbox::CoordinatesCollections &multiPolygon) { +mbgl::MultiPolygon asMultiPolygon(const CoordinatesCollections &multiPolygon) { mbgl::MultiPolygon mbglMultiPolygon; mbglMultiPolygon.reserve(multiPolygon.size()); for (const auto &polygon : multiPolygon) { - mbglMultiPolygon.emplace_back(std::forward>(asMapboxGLPolygon(polygon))); + mbglMultiPolygon.emplace_back(std::forward>(asPolygon(polygon))); } return mbglMultiPolygon; }; -mbgl::Value asMapboxGLPropertyValue(const QVariant &value) { +mbgl::Value asPropertyValue(const QVariant &value) { auto valueList = [](const QVariantList &list) { std::vector mbglList; mbglList.reserve(list.size()); for (const auto& listValue : list) { - mbglList.emplace_back(asMapboxGLPropertyValue(listValue)); + mbglList.emplace_back(asPropertyValue(listValue)); } return mbglList; }; @@ -72,7 +72,7 @@ mbgl::Value asMapboxGLPropertyValue(const QVariant &value) { std::unordered_map mbglMap; mbglMap.reserve(map.size()); for (auto it = map.constBegin(); it != map.constEnd(); ++it) { - mbglMap.emplace(std::make_pair(it.key().toStdString(), asMapboxGLPropertyValue(it.value()))); + mbglMap.emplace(std::make_pair(it.key().toStdString(), asPropertyValue(it.value()))); } return mbglMap; }; @@ -80,7 +80,7 @@ mbgl::Value asMapboxGLPropertyValue(const QVariant &value) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) switch (value.typeId()) { #else - switch (value.type()) { + switch (static_cast(value.type())) { #endif case QMetaType::UnknownType: return mbgl::NullValue {}; @@ -104,11 +104,11 @@ mbgl::Value asMapboxGLPropertyValue(const QVariant &value) { } } -mbgl::FeatureIdentifier asMapboxGLFeatureIdentifier(const QVariant &id) { +mbgl::FeatureIdentifier asFeatureIdentifier(const QVariant &id) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) switch (id.typeId()) { #else - switch (id.type()) { + switch (static_cast(id.type())) { #endif case QMetaType::UnknownType: return {}; @@ -126,37 +126,37 @@ mbgl::FeatureIdentifier asMapboxGLFeatureIdentifier(const QVariant &id) { } } -mbgl::GeoJSONFeature asMapboxGLFeature(const QMapbox::Feature &feature) { +mbgl::GeoJSONFeature asFeature(const Feature &feature) { mbgl::PropertyMap properties; properties.reserve(feature.properties.size()); for (auto it = feature.properties.constBegin(); it != feature.properties.constEnd(); ++it) { - properties.emplace(std::make_pair(it.key().toStdString(), asMapboxGLPropertyValue(it.value()))); + properties.emplace(std::make_pair(it.key().toStdString(), asPropertyValue(it.value()))); } - mbgl::FeatureIdentifier id = asMapboxGLFeatureIdentifier(feature.id); + mbgl::FeatureIdentifier id = asFeatureIdentifier(feature.id); - if (feature.type == QMapbox::Feature::PointType) { - const QMapbox::Coordinates &points = feature.geometry.first().first(); + if (feature.type == Feature::PointType) { + const Coordinates &points = feature.geometry.first().first(); if (points.size() == 1) { - return { asMapboxGLPoint(points.first()), std::move(properties), std::move(id) }; + return { asPoint(points.first()), std::move(properties), std::move(id) }; } else { - return { asMapboxGLMultiPoint(points), std::move(properties), std::move(id) }; + return { asMultiPoint(points), std::move(properties), std::move(id) }; } - } else if (feature.type == QMapbox::Feature::LineStringType) { - const QMapbox::CoordinatesCollection &lineStrings = feature.geometry.first(); + } else if (feature.type == Feature::LineStringType) { + const CoordinatesCollection &lineStrings = feature.geometry.first(); if (lineStrings.size() == 1) { - return { asMapboxGLLineString(lineStrings.first()), std::move(properties), std::move(id) }; + return { asLineString(lineStrings.first()), std::move(properties), std::move(id) }; } else { - return { asMapboxGLMultiLineString(lineStrings), std::move(properties), std::move(id) }; + return { asMultiLineString(lineStrings), std::move(properties), std::move(id) }; } } else { // PolygonType - const QMapbox::CoordinatesCollections &polygons = feature.geometry; + const CoordinatesCollections &polygons = feature.geometry; if (polygons.size() == 1) { - return { asMapboxGLPolygon(polygons.first()), std::move(properties), std::move(id) }; + return { asPolygon(polygons.first()), std::move(properties), std::move(id) }; } else { - return { asMapboxGLMultiPolygon(polygons), std::move(properties), std::move(id) }; + return { asMultiPolygon(polygons), std::move(properties), std::move(id) }; } } }; -} // namespace QMapbox +} // namespace QMapLibreGL::GeoJSON diff --git a/platform/qt/src/utils/geojson.hpp b/platform/qt/src/utils/geojson.hpp new file mode 100644 index 000000000..90aa38ec4 --- /dev/null +++ b/platform/qt/src/utils/geojson.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include +#include +#include + +#include + +#include + +namespace QMapLibreGL::GeoJSON { + +mbgl::Point asPoint(const Coordinate &coordinate); +mbgl::MultiPoint asMultiPoint(const Coordinates &multiPoint); +mbgl::LineString asLineString(const Coordinates &lineString); +mbgl::MultiLineString asMultiLineString(const CoordinatesCollection &multiLineString); +mbgl::Polygon asPolygon(const CoordinatesCollection &polygon); +mbgl::MultiPolygon asMultiPolygon(const CoordinatesCollections &multiPolygon); +mbgl::Value asPropertyValue(const QVariant &value); +mbgl::FeatureIdentifier asFeatureIdentifier(const QVariant &id); +mbgl::GeoJSONFeature asFeature(const Feature &feature); + +} // namespace QMapLibreGL::GeoJSON diff --git a/platform/qt/src/utils/map_observer.cpp b/platform/qt/src/utils/map_observer.cpp new file mode 100644 index 000000000..3773d6544 --- /dev/null +++ b/platform/qt/src/utils/map_observer.cpp @@ -0,0 +1,122 @@ +#include "map_observer.hpp" + +#include "../map_p.hpp" + +#include + +#include + +namespace QMapLibreGL { + +MapObserver::MapObserver(MapPrivate *d) + : d_ptr(d) +{ +} + +MapObserver::~MapObserver() +{ +} + +void MapObserver::onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode) +{ + if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) { + emit mapChanged(Map::MapChangeRegionWillChange); + } else { + emit mapChanged(Map::MapChangeRegionWillChangeAnimated); + } +} + +void MapObserver::onCameraIsChanging() +{ + emit mapChanged(Map::MapChangeRegionIsChanging); +} + +void MapObserver::onCameraDidChange(mbgl::MapObserver::CameraChangeMode mode) +{ + if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) { + emit mapChanged(Map::MapChangeRegionDidChange); + } else { + emit mapChanged(Map::MapChangeRegionDidChangeAnimated); + } +} + +void MapObserver::onWillStartLoadingMap() +{ + emit mapChanged(Map::MapChangeWillStartLoadingMap); +} + +void MapObserver::onDidFinishLoadingMap() +{ + emit mapChanged(Map::MapChangeDidFinishLoadingMap); +} + +void MapObserver::onDidFailLoadingMap(mbgl::MapLoadError error, const std::string& what) +{ + emit mapChanged(Map::MapChangeDidFailLoadingMap); + + Map::MapLoadingFailure type; + QString description(what.c_str()); + + switch (error) { + case mbgl::MapLoadError::StyleParseError: + type = Map::MapLoadingFailure::StyleParseFailure; + break; + case mbgl::MapLoadError::StyleLoadError: + type = Map::MapLoadingFailure::StyleLoadFailure; + break; + case mbgl::MapLoadError::NotFoundError: + type = Map::MapLoadingFailure::NotFoundFailure; + break; + default: + type = Map::MapLoadingFailure::UnknownFailure; + } + + emit mapLoadingFailed(type, description); +} + +void MapObserver::onWillStartRenderingFrame() +{ + emit mapChanged(Map::MapChangeWillStartRenderingFrame); +} + +void MapObserver::onDidFinishRenderingFrame(mbgl::MapObserver::RenderFrameStatus status) +{ + if (status.mode == mbgl::MapObserver::RenderMode::Partial) { + emit mapChanged(Map::MapChangeDidFinishRenderingFrame); + } else { + emit mapChanged(Map::MapChangeDidFinishRenderingFrameFullyRendered); + } +} + +void MapObserver::onWillStartRenderingMap() +{ + emit mapChanged(Map::MapChangeWillStartRenderingMap); +} + +void MapObserver::onDidFinishRenderingMap(mbgl::MapObserver::RenderMode mode) +{ + if (mode == mbgl::MapObserver::RenderMode::Partial) { + emit mapChanged(Map::MapChangeDidFinishRenderingMap); + } else { + emit mapChanged(Map::MapChangeDidFinishRenderingMapFullyRendered); + } +} + +void MapObserver::onDidFinishLoadingStyle() +{ + emit mapChanged(Map::MapChangeDidFinishLoadingStyle); +} + +void MapObserver::onSourceChanged(mbgl::style::Source&) +{ + std::string attribution; + for (const auto& source : d_ptr->mapObj->getStyle().getSources()) { + // Avoid duplicates by using the most complete attribution HTML snippet. + if (source->getAttribution() && (attribution.size() < source->getAttribution()->size())) + attribution = *source->getAttribution(); + } + emit copyrightsChanged(QString::fromStdString(attribution)); + emit mapChanged(Map::MapChangeSourceDidChange); +} + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_map_observer.hpp b/platform/qt/src/utils/map_observer.hpp similarity index 70% rename from platform/qt/src/qmapboxgl_map_observer.hpp rename to platform/qt/src/utils/map_observer.hpp index d9e51db28..c45387d56 100644 --- a/platform/qt/src/qmapboxgl_map_observer.hpp +++ b/platform/qt/src/utils/map_observer.hpp @@ -1,6 +1,6 @@ #pragma once -#include "qmapboxgl.hpp" +#include #include #include @@ -10,15 +10,17 @@ #include #include -class QMapboxGLPrivate; +namespace QMapLibreGL { -class QMapboxGLMapObserver : public QObject, public mbgl::MapObserver +class MapPrivate; + +class MapObserver : public QObject, public mbgl::MapObserver { Q_OBJECT public: - explicit QMapboxGLMapObserver(QMapboxGLPrivate *); - virtual ~QMapboxGLMapObserver(); + explicit MapObserver(MapPrivate *); + virtual ~MapObserver(); // mbgl::MapObserver implementation. void onCameraWillChange(mbgl::MapObserver::CameraChangeMode) final; @@ -35,12 +37,14 @@ public: void onSourceChanged(mbgl::style::Source&) final; signals: - void mapChanged(QMapboxGL::MapChange); - void mapLoadingFailed(QMapboxGL::MapLoadingFailure, const QString &reason); + void mapChanged(Map::MapChange); + void mapLoadingFailed(Map::MapLoadingFailure, const QString &reason); void copyrightsChanged(const QString ©rightsHtml); private: - Q_DISABLE_COPY(QMapboxGLMapObserver) + Q_DISABLE_COPY(MapObserver) - QMapboxGLPrivate *d_ptr; + MapPrivate *d_ptr; }; + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_map_renderer.cpp b/platform/qt/src/utils/map_renderer.cpp similarity index 71% rename from platform/qt/src/qmapboxgl_map_renderer.cpp rename to platform/qt/src/utils/map_renderer.cpp index 6451045a4..b2798d443 100644 --- a/platform/qt/src/qmapboxgl_map_renderer.cpp +++ b/platform/qt/src/utils/map_renderer.cpp @@ -1,10 +1,11 @@ -#include "qmapboxgl_map_renderer.hpp" -#include "qmapboxgl_scheduler.hpp" +#include "map_renderer.hpp" +#include "scheduler.hpp" #include #include -#include + +namespace { static bool needsToForceScheduler() { static QThreadStorage force; @@ -17,16 +18,21 @@ static bool needsToForceScheduler() { }; static auto *getScheduler() { - static QThreadStorage> scheduler; + static QThreadStorage> scheduler; if (!scheduler.hasLocalData()) { - scheduler.setLocalData(std::make_shared()); + scheduler.setLocalData(std::make_shared()); } return scheduler.localData().get(); }; -QMapboxGLMapRenderer::QMapboxGLMapRenderer(qreal pixelRatio, QMapboxGLSettings::GLContextMode mode, const QString &localFontFamily) +} // namespace + + +namespace QMapLibreGL { + +MapRenderer::MapRenderer(qreal pixelRatio, Settings::GLContextMode mode, const QString &localFontFamily) : m_backend(static_cast(mode)), m_renderer(std::make_unique(m_backend, pixelRatio, localFontFamily.isEmpty() ? mbgl::nullopt : mbgl::optional { localFontFamily.toStdString() })) @@ -43,29 +49,29 @@ QMapboxGLMapRenderer::QMapboxGLMapRenderer(qreal pixelRatio, QMapboxGLSettings:: mbgl::Scheduler::SetCurrent(scheduler); } - connect(scheduler, &QMapboxGLScheduler::needsProcessing, this, &QMapboxGLMapRenderer::needsRendering); + connect(scheduler, &Scheduler::needsProcessing, this, &MapRenderer::needsRendering); } } -QMapboxGLMapRenderer::~QMapboxGLMapRenderer() +MapRenderer::~MapRenderer() { MBGL_VERIFY_THREAD(tid); } -void QMapboxGLMapRenderer::updateParameters(std::shared_ptr newParameters) +void MapRenderer::updateParameters(std::shared_ptr newParameters) { std::lock_guard lock(m_updateMutex); m_updateParameters = std::move(newParameters); } -void QMapboxGLMapRenderer::updateFramebuffer(quint32 fbo, const mbgl::Size &size) +void MapRenderer::updateFramebuffer(quint32 fbo, const mbgl::Size &size) { MBGL_VERIFY_THREAD(tid); m_backend.updateFramebuffer(fbo, size); } -void QMapboxGLMapRenderer::render() +void MapRenderer::render() { MBGL_VERIFY_THREAD(tid); @@ -91,7 +97,9 @@ void QMapboxGLMapRenderer::render() } } -void QMapboxGLMapRenderer::setObserver(std::shared_ptr observer) +void MapRenderer::setObserver(std::shared_ptr observer) { m_renderer->setObserver(observer.get()); } + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_map_renderer.hpp b/platform/qt/src/utils/map_renderer.hpp similarity index 61% rename from platform/qt/src/qmapboxgl_map_renderer.hpp rename to platform/qt/src/utils/map_renderer.hpp index 2769b2b87..e37d384ee 100644 --- a/platform/qt/src/qmapboxgl_map_renderer.hpp +++ b/platform/qt/src/utils/map_renderer.hpp @@ -1,13 +1,15 @@ #pragma once -#include "qmapboxgl.hpp" -#include "qmapboxgl_renderer_backend.hpp" +#include + +#include "renderer_backend.hpp" #include #include #include #include +#include #include #include @@ -17,15 +19,17 @@ class Renderer; class UpdateParameters; } // namespace mbgl -class QMapboxGLRendererBackend; +namespace QMapLibreGL { -class QMapboxGLMapRenderer : public QObject +class RendererBackend; + +class MapRenderer : public QObject { Q_OBJECT public: - QMapboxGLMapRenderer(qreal pixelRatio, QMapboxGLSettings::GLContextMode, const QString &localFontFamily); - virtual ~QMapboxGLMapRenderer(); + MapRenderer(qreal pixelRatio, Settings::GLContextMode, const QString &localFontFamily); + virtual ~MapRenderer(); void render(); void updateFramebuffer(quint32 fbo, const mbgl::Size &size); @@ -40,13 +44,15 @@ signals: private: MBGL_STORE_THREAD(tid) - Q_DISABLE_COPY(QMapboxGLMapRenderer) + Q_DISABLE_COPY(MapRenderer) std::mutex m_updateMutex; std::shared_ptr m_updateParameters; - QMapboxGLRendererBackend m_backend; - std::unique_ptr m_renderer; + RendererBackend m_backend; + std::unique_ptr m_renderer{}; - bool m_forceScheduler; + bool m_forceScheduler{}; }; + +} // namespace QMapLibreGL diff --git a/platform/qt/src/utils/renderer_backend.cpp b/platform/qt/src/utils/renderer_backend.cpp new file mode 100644 index 000000000..66f5b2e6c --- /dev/null +++ b/platform/qt/src/utils/renderer_backend.cpp @@ -0,0 +1,56 @@ +#include "renderer_backend.hpp" + +#include +#include + +#include +#include + +namespace QMapLibreGL { + +class RenderableResource final : public mbgl::gl::RenderableResource { +public: + RenderableResource(RendererBackend& backend_) : backend(backend_) { + } + + void bind() override { + assert(mbgl::gfx::BackendScope::exists()); + backend.restoreFramebufferBinding(); + backend.setViewport(0, 0, backend.getSize()); + } + +private: + RendererBackend& backend; +}; + +RendererBackend::RendererBackend(const mbgl::gfx::ContextMode contextMode_) + : mbgl::gl::RendererBackend(contextMode_), + mbgl::gfx::Renderable({ 0, 0 }, std::make_unique(*this)) { +} + +RendererBackend::~RendererBackend() = default; + +void RendererBackend::updateAssumedState() { + assumeFramebufferBinding(ImplicitFramebufferBinding); + assumeViewport(0, 0, size); +} + +void RendererBackend::restoreFramebufferBinding() { + setFramebufferBinding(m_fbo); +} + +void RendererBackend::updateFramebuffer(quint32 fbo, const mbgl::Size& newSize) { + m_fbo = fbo; + size = newSize; +} + +/*! + Initializes an OpenGL extension function such as Vertex Array Objects (VAOs), + required by MapLibre GL Native engine. +*/ +mbgl::gl::ProcAddress RendererBackend::getExtensionFunctionPointer(const char* name) { + QOpenGLContext* thisContext = QOpenGLContext::currentContext(); + return thisContext->getProcAddress(name); +} + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_renderer_backend.hpp b/platform/qt/src/utils/renderer_backend.hpp similarity index 72% rename from platform/qt/src/qmapboxgl_renderer_backend.hpp rename to platform/qt/src/utils/renderer_backend.hpp index f821eda96..678905ad8 100644 --- a/platform/qt/src/qmapboxgl_renderer_backend.hpp +++ b/platform/qt/src/utils/renderer_backend.hpp @@ -1,15 +1,17 @@ #pragma once -#include "qmapboxgl.hpp" - #include #include -class QMapboxGLRendererBackend final : public mbgl::gl::RendererBackend, +#include + +namespace QMapLibreGL { + +class RendererBackend final : public mbgl::gl::RendererBackend, public mbgl::gfx::Renderable { public: - QMapboxGLRendererBackend(mbgl::gfx::ContextMode); - ~QMapboxGLRendererBackend() override; + RendererBackend(mbgl::gfx::ContextMode); + ~RendererBackend() override; void updateFramebuffer(quint32 fbo, const mbgl::Size&); void restoreFramebufferBinding(); @@ -31,7 +33,9 @@ protected: void updateAssumedState() override; private: - quint32 m_fbo = 0; + quint32 m_fbo{}; - Q_DISABLE_COPY(QMapboxGLRendererBackend) + Q_DISABLE_COPY(RendererBackend) }; + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_renderer_observer.hpp b/platform/qt/src/utils/renderer_observer.hpp similarity index 83% rename from platform/qt/src/qmapboxgl_renderer_observer.hpp rename to platform/qt/src/utils/renderer_observer.hpp index 78dd6b91d..3fd515f99 100644 --- a/platform/qt/src/qmapboxgl_renderer_observer.hpp +++ b/platform/qt/src/utils/renderer_observer.hpp @@ -8,16 +8,18 @@ #include +namespace QMapLibreGL { + // Forwards RendererObserver signals to the given // Delegate RendererObserver on the given RunLoop -class QMapboxGLRendererObserver : public mbgl::RendererObserver { +class RendererObserver : public mbgl::RendererObserver { public: - QMapboxGLRendererObserver(mbgl::util::RunLoop& mapRunLoop, mbgl::RendererObserver& delegate_) + RendererObserver(mbgl::util::RunLoop& mapRunLoop, mbgl::RendererObserver& delegate_) : mailbox(std::make_shared(mapRunLoop)) , delegate(delegate_, mailbox) { } - ~QMapboxGLRendererObserver() { + ~RendererObserver() { mailbox->close(); } @@ -46,6 +48,8 @@ public: } private: - std::shared_ptr mailbox; + std::shared_ptr mailbox{}; mbgl::ActorRef delegate; }; + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_scheduler.cpp b/platform/qt/src/utils/scheduler.cpp similarity index 73% rename from platform/qt/src/qmapboxgl_scheduler.cpp rename to platform/qt/src/utils/scheduler.cpp index 5fc3ab13d..4b2c13225 100644 --- a/platform/qt/src/qmapboxgl_scheduler.cpp +++ b/platform/qt/src/utils/scheduler.cpp @@ -1,19 +1,21 @@ -#include "qmapboxgl_scheduler.hpp" +#include "scheduler.hpp" #include #include -QMapboxGLScheduler::QMapboxGLScheduler() +namespace QMapLibreGL { + +Scheduler::Scheduler() { } -QMapboxGLScheduler::~QMapboxGLScheduler() +Scheduler::~Scheduler() { MBGL_VERIFY_THREAD(tid); } -void QMapboxGLScheduler::schedule(std::function function) { +void Scheduler::schedule(std::function function) { std::lock_guard lock(m_taskQueueMutex); m_taskQueue.push(std::move(function)); @@ -22,7 +24,7 @@ void QMapboxGLScheduler::schedule(std::function function) { emit needsProcessing(); } -void QMapboxGLScheduler::processEvents() +void Scheduler::processEvents() { std::queue> taskQueue; { @@ -36,3 +38,5 @@ void QMapboxGLScheduler::processEvents() taskQueue.pop(); } } + +} // namespace QMapLibreGL diff --git a/platform/qt/src/qmapboxgl_scheduler.hpp b/platform/qt/src/utils/scheduler.hpp similarity index 67% rename from platform/qt/src/qmapboxgl_scheduler.hpp rename to platform/qt/src/utils/scheduler.hpp index 0b000b9fc..2b69ea769 100644 --- a/platform/qt/src/qmapboxgl_scheduler.hpp +++ b/platform/qt/src/utils/scheduler.hpp @@ -9,17 +9,19 @@ #include #include -class QMapboxGLScheduler : public QObject, public mbgl::Scheduler +namespace QMapLibreGL { + +class Scheduler : public QObject, public mbgl::Scheduler { Q_OBJECT public: - QMapboxGLScheduler(); - virtual ~QMapboxGLScheduler(); + Scheduler(); + virtual ~Scheduler(); // mbgl::Scheduler implementation. void schedule(std::function scheduled) final; - mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } + mapbox::base::WeakPtr makeWeakPtr() override { return weakFactory.makeWeakPtr(); } void processEvents(); @@ -33,3 +35,5 @@ private: std::queue> m_taskQueue; mapbox::base::WeakPtrFactory weakFactory{this}; }; + +} // namepace QMapLibreGL diff --git a/platform/qt/test/main.cpp b/platform/qt/test/main.cpp index 92570ab09..58c22b1df 100644 --- a/platform/qt/test/main.cpp +++ b/platform/qt/test/main.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -15,7 +15,7 @@ #define str(s) #s int main(int argc, char *argv[]) { - QApplication app(argc, argv); + QGuiApplication app(argc, argv); #ifdef WORK_DIRECTORY #ifdef _MSC_VER diff --git a/platform/qt/test/qmapboxgl.test.cpp b/platform/qt/test/qmapboxgl.test.cpp deleted file mode 100644 index 22ed9779d..000000000 --- a/platform/qt/test/qmapboxgl.test.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "qmapboxgl.test.hpp" - -#include - -#include -#include -#include -#include -#include - -#include - -QMapboxGLTest::QMapboxGLTest() : size(512, 512), fbo((assert(widget.context()->isValid()), widget.makeCurrent(), size)), map(nullptr, settings, size) { - connect(&map, &QMapboxGL::mapChanged, this, &QMapboxGLTest::onMapChanged); - connect(&map, &QMapboxGL::needsRendering, this, &QMapboxGLTest::onNeedsRendering); - map.resize(fbo.size()); - map.setFramebufferObject(fbo.handle(), fbo.size()); - map.setCoordinateZoom(QMapbox::Coordinate(60.170448, 24.942046), 14); -} - -void QMapboxGLTest::runUntil(QMapboxGL::MapChange status) { - changeCallback = [&](QMapboxGL::MapChange change) { - if (change == status) { - qApp->exit(); - changeCallback = nullptr; - } - }; - - qApp->exec(); -} - -void QMapboxGLTest::onMapChanged(QMapboxGL::MapChange change) { - if (changeCallback) { - changeCallback(change); - } -} - -void QMapboxGLTest::onNeedsRendering() { - widget.makeCurrent(); - fbo.bind(); - QOpenGLContext::currentContext()->functions()->glViewport(0, 0, fbo.width(), fbo.height()); - map.render(); -} - - -TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleJson)) { - QFile f("test/fixtures/resources/style_vector.json"); - - ASSERT_TRUE(f.open(QFile::ReadOnly | QFile::Text)); - - QTextStream in(&f); - QString json = in.readAll(); - - map.setStyleJson(json); - ASSERT_EQ(map.styleJson(), json); - runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); - - map.setStyleJson("invalid json"); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleJson("\"\""); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleJson(QString()); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); -} - -TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleUrl)) { - QString url(QMapbox::defaultStyles()[0].first); - - map.setStyleUrl(url); - ASSERT_EQ(map.styleUrl(), url); - runUntil(QMapboxGL::MapChangeDidFinishLoadingMap); - - map.setStyleUrl("invalid://url"); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); - - map.setStyleUrl(QString()); - runUntil(QMapboxGL::MapChangeDidFailLoadingMap); -} diff --git a/platform/qt/test/qmapboxgl.test.hpp b/platform/qt/test/qmapboxgl.test.hpp deleted file mode 100644 index 3591dbc9d..000000000 --- a/platform/qt/test/qmapboxgl.test.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include -#include - -#include - -class QMapboxGLTest : public QObject, public ::testing::Test { - Q_OBJECT - -public: - QMapboxGLTest(); - - void runUntil(QMapboxGL::MapChange); - -private: - QGLWidget widget; - const QSize size; - QGLFramebufferObject fbo; - -protected: - QMapboxGLSettings settings; - QMapboxGL map; - - std::function changeCallback; - -private slots: - void onMapChanged(QMapboxGL::MapChange); - void onNeedsRendering(); -}; diff --git a/platform/qt/test/qmaplibregl.test.cpp b/platform/qt/test/qmaplibregl.test.cpp new file mode 100644 index 000000000..b5dd6ea9b --- /dev/null +++ b/platform/qt/test/qmaplibregl.test.cpp @@ -0,0 +1,80 @@ +#include "qmaplibregl.test.hpp" + +#include + +#include +#include +#include +#include +#include + +#include + +QMapLibreGLTest::QMapLibreGLTest() : size(512, 512), fbo((assert(widget.context()->isValid()), widget.makeCurrent(), size)), map(nullptr, settings, size) { + connect(&map, &QMapLibreGL::mapChanged, this, &QMapLibreGLTest::onMapChanged); + connect(&map, &QMapLibreGL::needsRendering, this, &QMapLibreGLTest::onNeedsRendering); + map.resize(fbo.size()); + map.setFramebufferObject(fbo.handle(), fbo.size()); + map.setCoordinateZoom(QMapLibreGL::Coordinate(60.170448, 24.942046), 14); +} + +void QMapLibreGLTest::runUntil(QMapLibreGL::MapChange status) { + changeCallback = [&](QMapLibreGL::MapChange change) { + if (change == status) { + qApp->exit(); + changeCallback = nullptr; + } + }; + + qApp->exec(); +} + +void QMapLibreGLTest::onMapChanged(QMapLibreGL::MapChange change) { + if (changeCallback) { + changeCallback(change); + } +} + +void QMapLibreGLTest::onNeedsRendering() { + widget.makeCurrent(); + fbo.bind(); + QOpenGLContext::currentContext()->functions()->glViewport(0, 0, fbo.width(), fbo.height()); + map.render(); +} + + +TEST_F(QMapLibreGLTest, TEST_DISABLED_ON_CI(styleJson)) { + QFile f("test/fixtures/resources/style_vector.json"); + + ASSERT_TRUE(f.open(QFile::ReadOnly | QFile::Text)); + + QTextStream in(&f); + QString json = in.readAll(); + + map.setStyleJson(json); + ASSERT_EQ(map.styleJson(), json); + runUntil(QMapLibreGL::MapChangeDidFinishLoadingMap); + + map.setStyleJson("invalid json"); + runUntil(QMapLibreGL::MapChangeDidFailLoadingMap); + + map.setStyleJson("\"\""); + runUntil(QMapLibreGL::MapChangeDidFailLoadingMap); + + map.setStyleJson(QString()); + runUntil(QMapLibreGL::MapChangeDidFailLoadingMap); +} + +TEST_F(QMapLibreGLTest, TEST_DISABLED_ON_CI(styleUrl)) { + QString url(QMapLibreGL::defaultStyles()[0].first); + + map.setStyleUrl(url); + ASSERT_EQ(map.styleUrl(), url); + runUntil(QMapLibreGL::MapChangeDidFinishLoadingMap); + + map.setStyleUrl("invalid://url"); + runUntil(QMapLibreGL::MapChangeDidFailLoadingMap); + + map.setStyleUrl(QString()); + runUntil(QMapLibreGL::MapChangeDidFailLoadingMap); +} diff --git a/platform/qt/test/qmaplibregl.test.hpp b/platform/qt/test/qmaplibregl.test.hpp new file mode 100644 index 000000000..c57d6e6ec --- /dev/null +++ b/platform/qt/test/qmaplibregl.test.hpp @@ -0,0 +1,30 @@ +#include + +#include +#include + +#include + +class QMapLibreGLTest : public QObject, public ::testing::Test { + Q_OBJECT + +public: + QMapLibreGLTest(); + + void runUntil(QMapLibreGL::MapChange); + +private: + QGLWidget widget; + const QSize size; + QGLFramebufferObject fbo; + +protected: + Settings settings; + Map map; + + std::function changeCallback; + +private slots: + void onMapChanged(QMapLibreGL::MapChange); + void onNeedsRendering(); +};