From bacfd5b05c161d111edde167cb719b83b1f2d71c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Apr 2018 11:01:04 +0200 Subject: Add QML revision info to new QML signals in geomapitembase Change-Id: I5c3e45a5d44f3f7f5c3ecda6823035aae07ae825 Reviewed-by: Paolo Angelelli --- src/location/declarativemaps/qdeclarativegeomapitembase_p.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/location/declarativemaps/qdeclarativegeomapitembase_p.h b/src/location/declarativemaps/qdeclarativegeomapitembase_p.h index 603bcafd..7a284e8a 100644 --- a/src/location/declarativemaps/qdeclarativegeomapitembase_p.h +++ b/src/location/declarativemaps/qdeclarativegeomapitembase_p.h @@ -132,8 +132,8 @@ public: Q_SIGNALS: void mapItemOpacityChanged(); - void enterTransitionFinished(); - void exitTransitionFinished(); + Q_REVISION(11) void enterTransitionFinished(); + Q_REVISION(11) void exitTransitionFinished(); protected Q_SLOTS: virtual void afterChildrenChanged(); -- cgit v1.2.1 From 1171ee5fbd7f05d01d1e0f2594f0801b761d2496 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Apr 2018 09:17:47 +0200 Subject: Bump Qt Positioning and Location import versions to latest 5.11 Change-Id: I846f00703b2c6c173e445bf053a92098626db8e2 Reviewed-by: Kai Koehne --- src/location/doc/src/qtlocation-qml.qdoc | 2 +- src/location/doc/src/qtlocation.qdoc | 4 ++-- src/positioning/doc/snippets/doc_src_qtpositioning.qml | 2 +- src/positioning/doc/src/qtpositioning-qml.qdoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/location/doc/src/qtlocation-qml.qdoc b/src/location/doc/src/qtlocation-qml.qdoc index c0879d2d..38f43ef1 100644 --- a/src/location/doc/src/qtlocation-qml.qdoc +++ b/src/location/doc/src/qtlocation-qml.qdoc @@ -26,7 +26,7 @@ ****************************************************************************/ /*! - \qmlmodule QtLocation 5.3 + \qmlmodule QtLocation 5.11 \title Qt Location QML Types \ingroup qmlmodules \brief Provides QML types for mapping and location information diff --git a/src/location/doc/src/qtlocation.qdoc b/src/location/doc/src/qtlocation.qdoc index 96564ecb..1f27a14a 100644 --- a/src/location/doc/src/qtlocation.qdoc +++ b/src/location/doc/src/qtlocation.qdoc @@ -84,8 +84,8 @@ The Qt Location API enables you to: To load the Qt Location module, add the following statement to your .qml files \code - import QtPositioning 5.5 - import QtLocation 5.6 + import QtPositioning 5.11 + import QtLocation 5.11 \endcode The QtLocation QML module depends on the QtPositioning QML module. diff --git a/src/positioning/doc/snippets/doc_src_qtpositioning.qml b/src/positioning/doc/snippets/doc_src_qtpositioning.qml index 73b2fd56..ee6e8328 100644 --- a/src/positioning/doc/snippets/doc_src_qtpositioning.qml +++ b/src/positioning/doc/snippets/doc_src_qtpositioning.qml @@ -49,7 +49,7 @@ ****************************************************************************/ //! [import] -import QtPositioning 5.2 +import QtPositioning 5.11 //! [import] Item { diff --git a/src/positioning/doc/src/qtpositioning-qml.qdoc b/src/positioning/doc/src/qtpositioning-qml.qdoc index e839dc48..7c9567cb 100644 --- a/src/positioning/doc/src/qtpositioning-qml.qdoc +++ b/src/positioning/doc/src/qtpositioning-qml.qdoc @@ -26,7 +26,7 @@ ****************************************************************************/ /*! - \qmlmodule QtPositioning 5.2 + \qmlmodule QtPositioning 5.11 \title Qt Positioning QML Types \ingroup qmlmodules \brief Provides QML types for position information -- cgit v1.2.1 From 81b0112d77088a373ba1067e00a13b0b339bba42 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Apr 2018 10:19:47 +0200 Subject: Update qmltypes and revision for Qt 5.11 in Location and Positioning Change-Id: Ie7493cbb33e656c270ef522fa26460461215e145 Reviewed-by: Kai Koehne --- src/imports/location/location.cpp | 9 +++- src/imports/location/plugins.qmltypes | 63 +++++++++++++++------- src/imports/positioning/plugins.qmltypes | 2 +- .../declarativemaps/qdeclarativegeomaneuver_p.h | 2 +- .../declarativemaps/qdeclarativegeomap_p.h | 4 +- .../declarativemaps/qdeclarativegeoroute_p.h | 2 +- .../declarativemaps/qdeclarativegeoroutemodel_p.h | 4 +- .../qdeclarativegeoserviceprovider_p.h | 2 +- 8 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/imports/location/location.cpp b/src/imports/location/location.cpp index 45b104b9..183d11d3 100644 --- a/src/imports/location/location.cpp +++ b/src/imports/location/location.cpp @@ -183,8 +183,15 @@ public: // Register the 5.11 types minor = 11; - qmlRegisterType(uri, major, minor, "Waypoint"); + qmlRegisterType(uri, major, minor, "RouteManeuver"); + qmlRegisterType(uri, major, minor, "Map"); + qmlRegisterUncreatableType(uri, major, minor, "GeoMapItemBase", + QStringLiteral("GeoMapItemBase is not intended instantiable by developer.")); qmlRegisterType(uri, major, minor, "DynamicParameter"); + qmlRegisterType(uri, major, minor, "Route"); + qmlRegisterType(uri, major, minor, "RouteQuery"); + qmlRegisterType(uri, major, minor, "Plugin"); + qmlRegisterType(uri, major, minor, "Waypoint"); // Register the latest Qt version as QML type version qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR); diff --git a/src/imports/location/plugins.qmltypes b/src/imports/location/plugins.qmltypes index ed977c4a..341da896 100644 --- a/src/imports/location/plugins.qmltypes +++ b/src/imports/location/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtLocation 5.10' +// 'qmlplugindump -nonrelocatable QtLocation 5.11' Module { dependencies: ["QtQuick 2.8"] @@ -108,9 +108,10 @@ Module { prototype: "QObject" exports: [ "QtLocation/RouteManeuver 5.0", + "QtLocation/RouteManeuver 5.11", "QtLocation/RouteManeuver 5.8" ] - exportMetaObjectRevisions: [0, 0] + exportMetaObjectRevisions: [0, 11, 0] Enum { name: "Direction" values: { @@ -136,14 +137,20 @@ Module { Property { name: "distanceToNextInstruction"; type: "double"; isReadonly: true } Property { name: "waypoint"; type: "QGeoCoordinate"; isReadonly: true } Property { name: "waypointValid"; type: "bool"; isReadonly: true } - Property { name: "extendedAttributes"; type: "QObject"; isReadonly: true; isPointer: true } + Property { + name: "extendedAttributes" + revision: 11 + type: "QObject" + isReadonly: true + isPointer: true + } } Component { name: "QDeclarativeGeoMap" defaultProperty: "data" prototype: "QQuickItem" - exports: ["QtLocation/Map 5.0"] - exportMetaObjectRevisions: [0] + exports: ["QtLocation/Map 5.0", "QtLocation/Map 5.11"] + exportMetaObjectRevisions: [0, 11] Property { name: "gesture"; type: "QQuickGeoMapGestureArea"; isReadonly: true; isPointer: true } Property { name: "plugin"; type: "QDeclarativeGeoServiceProvider"; isPointer: true } Property { name: "minimumZoomLevel"; type: "double" } @@ -190,6 +197,7 @@ Module { } Signal { name: "copyrightsVisibleChanged" + revision: 11 Parameter { name: "visible"; type: "bool" } } Signal { @@ -236,7 +244,7 @@ Module { name: "mapReadyChanged" Parameter { name: "ready"; type: "bool" } } - Signal { name: "mapObjectsChanged" } + Signal { name: "mapObjectsChanged"; revision: 11 } Method { name: "setBearing" Parameter { name: "bearing"; type: "double" } @@ -333,6 +341,7 @@ Module { name: "styleSheetChanged" Parameter { name: "styleSheet"; type: "string" } } + Signal { name: "copyrightsVisibleChanged" } Method { name: "copyrightsChanged" Parameter { name: "copyrightsImage"; type: "QImage" } @@ -350,11 +359,16 @@ Module { name: "QDeclarativeGeoMapItemBase" defaultProperty: "data" prototype: "QQuickItem" - exports: ["QtLocation/GeoMapItemBase 5.0"] + exports: [ + "QtLocation/GeoMapItemBase 5.0", + "QtLocation/GeoMapItemBase 5.11" + ] isCreatable: false - exportMetaObjectRevisions: [0] + exportMetaObjectRevisions: [0, 11] Property { name: "geoShape"; type: "QGeoShape"; isReadonly: true } Signal { name: "mapItemOpacityChanged" } + Signal { name: "enterTransitionFinished"; revision: 11 } + Signal { name: "exitTransitionFinished"; revision: 11 } } Component { name: "QDeclarativeGeoMapItemGroup" @@ -375,8 +389,11 @@ Module { Component { name: "QDeclarativeGeoMapParameter" prototype: "QGeoMapParameter" - exports: ["QtLocation/MapParameter 5.9"] - exportMetaObjectRevisions: [0] + exports: [ + "QtLocation/DynamicParameter 5.11", + "QtLocation/MapParameter 5.9" + ] + exportMetaObjectRevisions: [0, 0] Signal { name: "completed" Parameter { type: "QDeclarativeGeoMapParameter"; isPointer: true } @@ -432,13 +449,20 @@ Module { Component { name: "QDeclarativeGeoRoute" prototype: "QObject" - exports: ["QtLocation/Route 5.0"] - exportMetaObjectRevisions: [0] + exports: ["QtLocation/Route 5.0", "QtLocation/Route 5.11"] + exportMetaObjectRevisions: [0, 11] Property { name: "bounds"; type: "QGeoRectangle"; isReadonly: true } Property { name: "travelTime"; type: "int"; isReadonly: true } Property { name: "distance"; type: "double"; isReadonly: true } Property { name: "path"; type: "QJSValue" } Property { name: "segments"; type: "QDeclarativeGeoRouteSegment"; isList: true; isReadonly: true } + Property { + name: "routeQuery" + revision: 11 + type: "QDeclarativeGeoRouteQuery" + isReadonly: true + isPointer: true + } } Component { name: "QDeclarativeGeoRouteModel" @@ -490,8 +514,8 @@ Module { name: "QDeclarativeGeoRouteQuery" defaultProperty: "quickChildren" prototype: "QObject" - exports: ["QtLocation/RouteQuery 5.0"] - exportMetaObjectRevisions: [0] + exports: ["QtLocation/RouteQuery 5.0", "QtLocation/RouteQuery 5.11"] + exportMetaObjectRevisions: [0, 11] Enum { name: "TravelMode" values: { @@ -591,9 +615,10 @@ Module { Property { name: "waypoints"; type: "QVariantList" } Property { name: "excludedAreas"; type: "QJSValue" } Property { name: "featureTypes"; type: "QList"; isReadonly: true } + Property { name: "extraParameters"; revision: 11; type: "QVariantMap"; isReadonly: true } Property { name: "quickChildren"; type: "QObject"; isList: true; isReadonly: true } Signal { name: "queryDetailsChanged" } - Signal { name: "extraParametersChanged" } + Signal { name: "extraParametersChanged"; revision: 11 } Method { name: "waypointObjects"; type: "QVariantList" } Method { name: "addWaypoint" @@ -639,8 +664,8 @@ Module { name: "QDeclarativeGeoServiceProvider" defaultProperty: "parameters" prototype: "QObject" - exports: ["QtLocation/Plugin 5.0"] - exportMetaObjectRevisions: [0] + exports: ["QtLocation/Plugin 5.0", "QtLocation/Plugin 5.11"] + exportMetaObjectRevisions: [0, 11] Enum { name: "RoutingFeature" values: { @@ -810,10 +835,11 @@ Module { Method { name: "supportsPlaces"; type: "bool" } Method { name: "supportsNavigation" + revision: 11 type: "bool" Parameter { name: "feature"; type: "NavigationFeature" } } - Method { name: "supportsNavigation"; type: "bool" } + Method { name: "supportsNavigation"; revision: 11; type: "bool" } } Component { name: "QDeclarativeGeoServiceProviderParameter" @@ -876,6 +902,7 @@ Module { Property { name: "altitude"; type: "double" } Property { name: "isValid"; type: "bool"; isReadonly: true } Property { name: "bearing"; type: "double" } + Property { name: "metadata"; type: "QVariantMap"; isReadonly: true } Property { name: "quickChildren"; type: "QObject"; isList: true; isReadonly: true } Signal { name: "completed" } Signal { name: "waypointDetailsChanged" } diff --git a/src/imports/positioning/plugins.qmltypes b/src/imports/positioning/plugins.qmltypes index d9791c6d..dab72802 100644 --- a/src/imports/positioning/plugins.qmltypes +++ b/src/imports/positioning/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtPositioning 5.10' +// 'qmlplugindump -nonrelocatable QtPositioning 5.11' Module { dependencies: ["QtQuick 2.8"] diff --git a/src/location/declarativemaps/qdeclarativegeomaneuver_p.h b/src/location/declarativemaps/qdeclarativegeomaneuver_p.h index f321c133..4c79aa80 100644 --- a/src/location/declarativemaps/qdeclarativegeomaneuver_p.h +++ b/src/location/declarativemaps/qdeclarativegeomaneuver_p.h @@ -71,7 +71,7 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoManeuver : public QObject Q_PROPERTY(qreal distanceToNextInstruction READ distanceToNextInstruction CONSTANT) Q_PROPERTY(QGeoCoordinate waypoint READ waypoint CONSTANT) Q_PROPERTY(bool waypointValid READ waypointValid CONSTANT) - Q_PROPERTY(QObject *extendedAttributes READ extendedAttributes NOTIFY extendedAttributesChanged) + Q_PROPERTY(QObject *extendedAttributes READ extendedAttributes NOTIFY extendedAttributesChanged REVISION 11) public: enum Direction { diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h index cb8fed08..af08a953 100644 --- a/src/location/declarativemaps/qdeclarativegeomap_p.h +++ b/src/location/declarativemaps/qdeclarativegeomap_p.h @@ -213,7 +213,7 @@ Q_SIGNALS: void mapItemsChanged(); void errorChanged(); void copyrightLinkActivated(const QString &link); - void copyrightsVisibleChanged(bool visible); + Q_REVISION(11) void copyrightsVisibleChanged(bool visible); void colorChanged(const QColor &color); void bearingChanged(qreal bearing); void tiltChanged(qreal tilt); @@ -225,7 +225,7 @@ Q_SIGNALS: void copyrightsChanged(const QImage ©rightsImage); void copyrightsChanged(const QString ©rightsHtml); void mapReadyChanged(bool ready); - void mapObjectsChanged(); + Q_REVISION(11) void mapObjectsChanged(); protected: void mousePressEvent(QMouseEvent *event) override ; diff --git a/src/location/declarativemaps/qdeclarativegeoroute_p.h b/src/location/declarativemaps/qdeclarativegeoroute_p.h index 5fe29862..7e7ae368 100644 --- a/src/location/declarativemaps/qdeclarativegeoroute_p.h +++ b/src/location/declarativemaps/qdeclarativegeoroute_p.h @@ -67,7 +67,7 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoRoute : public QObject Q_PROPERTY(qreal distance READ distance CONSTANT) Q_PROPERTY(QJSValue path READ path WRITE setPath NOTIFY pathChanged) Q_PROPERTY(QQmlListProperty segments READ segments CONSTANT) - Q_PROPERTY(QDeclarativeGeoRouteQuery *routeQuery READ routeQuery) + Q_PROPERTY(QDeclarativeGeoRouteQuery *routeQuery READ routeQuery REVISION 11) public: explicit QDeclarativeGeoRoute(QObject *parent = 0); diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h index 64c1ebf8..afffc21a 100644 --- a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h +++ b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h @@ -295,7 +295,7 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoRouteQuery : public QObject, publ Q_PROPERTY(QVariantList waypoints READ waypoints WRITE setWaypoints NOTIFY waypointsChanged) Q_PROPERTY(QJSValue excludedAreas READ excludedAreas WRITE setExcludedAreas NOTIFY excludedAreasChanged) Q_PROPERTY(QList featureTypes READ featureTypes NOTIFY featureTypesChanged) - Q_PROPERTY(QVariantMap extraParameters READ extraParameters) + Q_PROPERTY(QVariantMap extraParameters READ extraParameters REVISION 11) Q_PROPERTY(QQmlListProperty quickChildren READ declarativeChildren DESIGNABLE false) Q_CLASSINFO("DefaultProperty", "quickChildren") Q_INTERFACES(QQmlParserStatus) @@ -434,7 +434,7 @@ Q_SIGNALS: void segmentDetailChanged(); void queryDetailsChanged(); - void extraParametersChanged(); + Q_REVISION(11) void extraParametersChanged(); private Q_SLOTS: void excludedAreaCoordinateChanged(); diff --git a/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h b/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h index 13768411..f6a663f3 100644 --- a/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h +++ b/src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h @@ -206,7 +206,7 @@ public: Q_INVOKABLE bool supportsGeocoding(const GeocodingFeatures &feature = AnyGeocodingFeatures) const; Q_INVOKABLE bool supportsMapping(const MappingFeatures &feature = AnyMappingFeatures) const; Q_INVOKABLE bool supportsPlaces(const PlacesFeatures &feature = AnyPlacesFeatures) const; - Q_INVOKABLE bool supportsNavigation(const NavigationFeature &feature = AnyNavigationFeatures) const; + Q_REVISION(11) Q_INVOKABLE bool supportsNavigation(const NavigationFeature &feature = AnyNavigationFeatures) const; QStringList locales() const; void setLocales(const QStringList &locales); -- cgit v1.2.1 From e86a2f2a437a8c0e820e85ae4498a391c76bb823 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 19 Apr 2018 09:33:10 +0200 Subject: Doc: Remove \since tag from Waypoint::metadata The whole type got introduced only in 5.11. Change-Id: I4368c95dc6c0d39da0088e0aed6b72d3b34c2bc9 Reviewed-by: Alex Blasche --- src/location/declarativemaps/qdeclarativegeoroutemodel.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp index 0f0bb253..4ddd1f5b 100644 --- a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp +++ b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp @@ -1826,8 +1826,6 @@ void QDeclarativeGeoWaypoint::setBearing(qreal bearing) defined by the user, these can be set by using MapParameters. If the waypoint comes from the engine via signals, or as part of a read-only route query, the waypoint is intended to be read-only. - - \since 5.11 */ QVariantMap QDeclarativeGeoWaypoint::metadata() { -- cgit v1.2.1 From ecb6fbd235a8f23f0844bb2b926b78566c1aaa76 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Wed, 18 Apr 2018 14:34:25 +0200 Subject: Fix QGeoMapObject handling in reference implementation setVisible was neither changing the visibility nor triggering repaint. Pimpls weren't removing themselves in their destructors when dynamically added/removed via QGeoMapObjectView add/removeMapObject. This patch also factors out the duplicated QGeoMapObject support from QGeoTiledMapLabs and QGeoMapObjectsOverlay and moves it into an own class, QGeoMapObjectQSGSupport. To properly flush the scene graph nodes upon object removal, a pointer to the QSGNode is added to the MapObject struct, now moved inside QGeoMapObjectQSGSupport. Change-Id: Ie8c6d54f8f340ba3867717d9620791d3fe8021cc Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../declarativemaps/qdeclarativepolygonmapitem.cpp | 17 +- .../declarativemaps/qdeclarativepolygonmapitem_p.h | 8 +- .../qdeclarativepolylinemapitem.cpp | 69 ++++++- .../qdeclarativepolylinemapitem_p.h | 27 ++- src/location/declarativemaps/qgeomapobject.cpp | 5 +- src/location/labs/qgeotiledmaplabs.cpp | 150 ++------------ src/location/labs/qgeotiledmaplabs_p.h | 2 +- src/location/labs/qmapcircleobject.cpp | 3 +- src/location/labs/qmapiconobject.cpp | 3 +- src/location/labs/qmapobjectview.cpp | 62 +++--- src/location/labs/qmappolygonobject.cpp | 3 +- src/location/labs/qmappolylineobject.cpp | 3 +- src/location/labs/qmaprouteobject.cpp | 3 +- src/location/labs/qsg/qgeomapobjectqsgsupport.cpp | 224 +++++++++++++++++++++ src/location/labs/qsg/qgeomapobjectqsgsupport_p.h | 92 +++++++++ src/location/labs/qsg/qmapcircleobjectqsg.cpp | 10 +- src/location/labs/qsg/qmapcircleobjectqsg_p_p.h | 5 +- src/location/labs/qsg/qmapiconobjectqsg.cpp | 25 ++- src/location/labs/qsg/qmapiconobjectqsg_p_p.h | 5 +- src/location/labs/qsg/qmappolygonobjectqsg.cpp | 10 +- src/location/labs/qsg/qmappolygonobjectqsg_p_p.h | 5 +- src/location/labs/qsg/qmappolylineobjectqsg.cpp | 10 +- src/location/labs/qsg/qmappolylineobjectqsg_p_p.h | 5 +- src/location/labs/qsg/qmaprouteobjectqsg.cpp | 10 +- src/location/labs/qsg/qmaprouteobjectqsg_p_p.h | 5 +- src/location/labs/qsg/qqsgmapobject.cpp | 6 +- src/location/labs/qsg/qqsgmapobject_p.h | 8 +- src/location/maps/qgeomap_p.h | 2 +- src/location/maps/qgeomap_p_p.h | 2 +- .../itemsoverlay/qgeomapitemsoverlay.cpp | 156 +++----------- .../geoservices/itemsoverlay/qgeomapitemsoverlay.h | 2 + 31 files changed, 568 insertions(+), 369 deletions(-) create mode 100644 src/location/labs/qsg/qgeomapobjectqsgsupport.cpp create mode 100644 src/location/labs/qsg/qgeomapobjectqsgsupport_p.h diff --git a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp index 9e96f3c6..eab0f214 100644 --- a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp +++ b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp @@ -654,8 +654,7 @@ void QDeclarativePolygonMapItem::geometryChanged(const QRectF &newGeometry, cons MapPolygonNode::MapPolygonNode() : border_(new MapPolylineNode()), - geometry_(QSGGeometry::defaultAttributes_Point2D(), 0), - blocked_(true) + geometry_(QSGGeometry::defaultAttributes_Point2D(), 0) { geometry_.setDrawingMode(QSGGeometry::DrawTriangles); QSGGeometryNode::setMaterial(&fill_material_); @@ -668,14 +667,6 @@ MapPolygonNode::~MapPolygonNode() { } -/*! - \internal -*/ -bool MapPolygonNode::isSubtreeBlocked() const -{ - return blocked_; -} - /*! \internal */ @@ -692,13 +683,13 @@ void MapPolygonNode::update(const QColor &fillColor, const QColor &borderColor, * accuracy) */ if (fillShape->size() == 0) { if (borderShape->size() == 0) { - blocked_ = true; + setSubtreeBlocked(true); return; } else { - blocked_ = false; + setSubtreeBlocked(false); } } else { - blocked_ = false; + setSubtreeBlocked(false); } QSGGeometry *fill = QSGGeometryNode::geometry(); diff --git a/src/location/declarativemaps/qdeclarativepolygonmapitem_p.h b/src/location/declarativemaps/qdeclarativepolygonmapitem_p.h index febeb751..83983651 100644 --- a/src/location/declarativemaps/qdeclarativepolygonmapitem_p.h +++ b/src/location/declarativemaps/qdeclarativepolygonmapitem_p.h @@ -137,24 +137,20 @@ private: ////////////////////////////////////////////////////////////////////// -class Q_LOCATION_PRIVATE_EXPORT MapPolygonNode : public QSGGeometryNode +class Q_LOCATION_PRIVATE_EXPORT MapPolygonNode : public MapItemGeometryNode { public: MapPolygonNode(); - ~MapPolygonNode(); + ~MapPolygonNode() override; void update(const QColor &fillColor, const QColor &borderColor, const QGeoMapItemGeometry *fillShape, const QGeoMapItemGeometry *borderShape); - - bool isSubtreeBlocked() const override; - private: QSGFlatColorMaterial fill_material_; MapPolylineNode *border_; QSGGeometry geometry_; - bool blocked_; }; QT_END_NAMESPACE diff --git a/src/location/declarativemaps/qdeclarativepolylinemapitem.cpp b/src/location/declarativemaps/qdeclarativepolylinemapitem.cpp index dffec4d5..620ed14e 100644 --- a/src/location/declarativemaps/qdeclarativepolylinemapitem.cpp +++ b/src/location/declarativemaps/qdeclarativepolylinemapitem.cpp @@ -1014,29 +1014,76 @@ QGeoMap::ItemType QDeclarativePolylineMapItem::itemType() const /*! \internal */ -MapPolylineNode::MapPolylineNode() : - geometry_(QSGGeometry::defaultAttributes_Point2D(),0), - blocked_(true) +VisibleNode::VisibleNode() : m_blocked{true}, m_visible{true} { - geometry_.setDrawingMode(QSGGeometry::DrawTriangleStrip); - QSGGeometryNode::setMaterial(&fill_material_); - QSGGeometryNode::setGeometry(&geometry_); + } +VisibleNode::~VisibleNode() +{ + +} /*! \internal */ -MapPolylineNode::~MapPolylineNode() +bool VisibleNode::subtreeBlocked() const +{ + return m_blocked || !m_visible; +} + +/*! + \internal +*/ +void VisibleNode::setSubtreeBlocked(bool blocked) +{ + m_blocked = blocked; +} + +bool VisibleNode::visible() const +{ + return m_visible; +} + +/*! + \internal +*/ +void VisibleNode::setVisible(bool visible) { + m_visible = visible; } /*! \internal */ -bool MapPolylineNode::isSubtreeBlocked() const +MapItemGeometryNode::~MapItemGeometryNode() +{ + +} + +bool MapItemGeometryNode::isSubtreeBlocked() const +{ + return subtreeBlocked(); +} + + +/*! + \internal +*/ +MapPolylineNode::MapPolylineNode() : + geometry_(QSGGeometry::defaultAttributes_Point2D(),0) +{ + geometry_.setDrawingMode(QSGGeometry::DrawTriangleStrip); + QSGGeometryNode::setMaterial(&fill_material_); + QSGGeometryNode::setGeometry(&geometry_); +} + + +/*! + \internal +*/ +MapPolylineNode::~MapPolylineNode() { - return blocked_; } /*! @@ -1046,10 +1093,10 @@ void MapPolylineNode::update(const QColor &fillColor, const QGeoMapItemGeometry *shape) { if (shape->size() == 0) { - blocked_ = true; + setSubtreeBlocked(true); return; } else { - blocked_ = false; + setSubtreeBlocked(false); } QSGGeometry *fill = QSGGeometryNode::geometry(); diff --git a/src/location/declarativemaps/qdeclarativepolylinemapitem_p.h b/src/location/declarativemaps/qdeclarativepolylinemapitem_p.h index ca01de12..225f21d9 100644 --- a/src/location/declarativemaps/qdeclarativepolylinemapitem_p.h +++ b/src/location/declarativemaps/qdeclarativepolylinemapitem_p.h @@ -181,20 +181,39 @@ private: ////////////////////////////////////////////////////////////////////// -class Q_LOCATION_PRIVATE_EXPORT MapPolylineNode : public QSGGeometryNode +class Q_LOCATION_PRIVATE_EXPORT VisibleNode { +public: + VisibleNode(); + virtual ~VisibleNode(); + + bool subtreeBlocked() const; + void setSubtreeBlocked(bool blocked); + bool visible() const; + void setVisible(bool visible); + + bool m_blocked : 1; + bool m_visible : 1; +}; +class Q_LOCATION_PRIVATE_EXPORT MapItemGeometryNode : public QSGGeometryNode, public VisibleNode +{ +public: + ~MapItemGeometryNode() override; + bool isSubtreeBlocked() const override; +}; + +class Q_LOCATION_PRIVATE_EXPORT MapPolylineNode : public MapItemGeometryNode +{ public: MapPolylineNode(); - ~MapPolylineNode(); + ~MapPolylineNode() override; void update(const QColor &fillColor, const QGeoMapItemGeometry *shape); - bool isSubtreeBlocked() const override; private: QSGFlatColorMaterial fill_material_; QSGGeometry geometry_; - bool blocked_; }; QT_END_NAMESPACE diff --git a/src/location/declarativemaps/qgeomapobject.cpp b/src/location/declarativemaps/qgeomapobject.cpp index 391ac04c..9a2e37bd 100644 --- a/src/location/declarativemaps/qgeomapobject.cpp +++ b/src/location/declarativemaps/qgeomapobject.cpp @@ -198,8 +198,8 @@ void QGeoMapObject::setMap(QGeoMap *map) // old implementation gets destroyed if/when d_ptr gets replaced d_ptr->m_componentCompleted = oldCmponentCompleted; d_ptr->setVisible(oldVisible); + d_ptr->setMap(map); } - d_ptr->setMap(map); const QList kids = geoMapObjectChildren(); for (auto kid : kids) @@ -207,7 +207,8 @@ void QGeoMapObject::setMap(QGeoMap *map) // Each subclass is in charge to do the equivalent of // if (!map) { - // // Map was set, now it has ben re-set to NULL + // // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // // so m_map inside d_ptr can still be used to remove itself, inside the destructor. // d_ptr = new QMapCircleObjectPrivateDefault(*d); // // Old pimpl deleted implicitly by QExplicitlySharedDataPointer // } diff --git a/src/location/labs/qgeotiledmaplabs.cpp b/src/location/labs/qgeotiledmaplabs.cpp index 2e4b2c16..22d582c0 100644 --- a/src/location/labs/qgeotiledmaplabs.cpp +++ b/src/location/labs/qgeotiledmaplabs.cpp @@ -42,26 +42,20 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE -struct MapObject { - MapObject(QPointer &o, QQSGMapObject *sgo) - : object(o), sgObject(sgo) {} - QPointer object; - QQSGMapObject *sgObject = nullptr; -}; - class QGeoTiledMapLabsPrivate : public QGeoTiledMapPrivate { Q_DECLARE_PUBLIC(QGeoTiledMapLabs) public: - QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine); + QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine, QGeoTiledMapLabs *map); virtual ~QGeoTiledMapLabsPrivate(); QGeoMapObjectPrivate *createMapObjectImplementation(QGeoMapObject *obj) override; virtual QList mapObjects() const override; - static int findMapObject(QGeoMapObject *o, const QList &list); void removeMapObject(QGeoMapObject *obj); void updateMapObjects(QSGNode *root, QQuickWindow *window); @@ -72,14 +66,13 @@ protected: void changeCameraData(const QGeoCameraData &oldCameraData) override; void changeActiveMapType(const QGeoMapType mapType) override; - QList m_mapObjects; - QList m_pendingMapObjects; + QGeoMapObjectQSGSupport m_qsgSupport; }; -QGeoTiledMapLabsPrivate::QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine) +QGeoTiledMapLabsPrivate::QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine, QGeoTiledMapLabs *map) : QGeoTiledMapPrivate(engine) { - + m_qsgSupport.m_map = map; } QGeoTiledMapLabsPrivate::~QGeoTiledMapLabsPrivate() @@ -89,136 +82,27 @@ QGeoTiledMapLabsPrivate::~QGeoTiledMapLabsPrivate() QGeoMapObjectPrivate *QGeoTiledMapLabsPrivate::createMapObjectImplementation(QGeoMapObject *obj) { - switch (obj->type()) { - case QGeoMapObject::PolylineType: { - QMapPolylineObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapPolylineObjectPrivateQSG *pimpl = - new QMapPolylineObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::PolygonType: { - QMapPolygonObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapPolygonObjectPrivateQSG *pimpl = - new QMapPolygonObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::CircleType: { - QMapCircleObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapCircleObjectPrivateQSG *pimpl = - new QMapCircleObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::RouteType: { - QMapRouteObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapRouteObjectPrivateQSG *pimpl = - new QMapRouteObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::IconType: { - QMapIconObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapIconObjectPrivateQSG *pimpl = - new QMapIconObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - default: - qWarning() << "Unsupported object type: " << obj->type(); - break; - } - return nullptr; + return m_qsgSupport.createMapObjectImplementationPrivate(obj); } QList QGeoTiledMapLabsPrivate::mapObjects() const { - return QList(); -} - -int QGeoTiledMapLabsPrivate::findMapObject(QGeoMapObject *o, const QList &list) -{ - for (int i = 0; i < list.size(); ++i) - { - if (list.at(i).object.data() == o) - return i; - } - return -1; + return m_qsgSupport.mapObjects(); } void QGeoTiledMapLabsPrivate::removeMapObject(QGeoMapObject *obj) { - int idx = findMapObject(obj, m_mapObjects); - if (idx >= 0) { - m_mapObjects.removeAt(idx); - } else { - idx = findMapObject(obj, m_pendingMapObjects); - if (idx >= 0) { - m_pendingMapObjects.removeAt(idx); - } else { - // obj not here. - } - } + m_qsgSupport.removeMapObject(obj); } void QGeoTiledMapLabsPrivate::updateMapObjects(QSGNode *root, QQuickWindow *window) { - for (int i = 0; i < m_mapObjects.size(); ++i) { - // already added as node - if (!m_mapObjects.at(i).object) { - qWarning() << "m_mapObjects at "<node; - sgo->node = sgo->updateMapObjectNode(oldNode, root, window); - } - - QList toRemove; - for (int i = 0; i < m_pendingMapObjects.size(); ++i) { - // already added as node - QQSGMapObject *sgo = m_pendingMapObjects.at(i).sgObject; - QSGNode *oldNode = sgo->node; - sgo->updateGeometry(); // or subtree will be blocked - sgo->node = sgo->updateMapObjectNode(oldNode, root, window); - if (sgo->node) { - m_mapObjects << m_pendingMapObjects.at(i); - toRemove.push_front(i); - } else { - // leave it to be processed - } - } - - for (int i: qAsConst(toRemove)) - m_pendingMapObjects.removeAt(i); + m_qsgSupport.updateMapObjects(root, window); } void QGeoTiledMapLabsPrivate::updateObjectsGeometry() { - Q_Q(QGeoTiledMapLabs); - for (int i = 0; i < m_mapObjects.size(); ++i) { - // already added as node - if (!m_mapObjects.at(i).object) { - qWarning() << "m_mapObjects at "<updateGeometry(); - } - emit q->sgNodeChanged(); + m_qsgSupport.updateObjectsGeometry(); } void QGeoTiledMapLabsPrivate::changeViewportSize(const QSize &size) @@ -247,7 +131,7 @@ void QGeoTiledMapLabsPrivate::changeActiveMapType(const QGeoMapType mapType) QGeoTiledMapLabs::QGeoTiledMapLabs(QGeoTiledMappingManagerEngine *engine, QObject *parent) - : QGeoTiledMap(*new QGeoTiledMapLabsPrivate(engine), engine, parent) + : QGeoTiledMap(*new QGeoTiledMapLabsPrivate(engine, this), engine, parent) { } @@ -260,15 +144,7 @@ QGeoTiledMapLabs::~QGeoTiledMapLabs() bool QGeoTiledMapLabs::createMapObjectImplementation(QGeoMapObject *obj) { Q_D(QGeoTiledMapLabs); - QExplicitlySharedDataPointer pimpl = - QExplicitlySharedDataPointer(d->createMapObjectImplementation(obj)); - if (pimpl.constData()) { - bool res = obj->setImplementation(pimpl); - if (res) - emit sgNodeChanged(); - return res; - } - return false; + return d->m_qsgSupport.createMapObjectImplementation(obj, d); } QSGNode *QGeoTiledMapLabs::updateSceneGraph(QSGNode *node, QQuickWindow *window) diff --git a/src/location/labs/qgeotiledmaplabs_p.h b/src/location/labs/qgeotiledmaplabs_p.h index f6499784..4f179028 100644 --- a/src/location/labs/qgeotiledmaplabs_p.h +++ b/src/location/labs/qgeotiledmaplabs_p.h @@ -71,10 +71,10 @@ public: virtual ~QGeoTiledMapLabs(); bool createMapObjectImplementation(QGeoMapObject *obj) override; + void removeMapObject(QGeoMapObject *obj) override; protected: QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window) override; - void removeMapObject(QGeoMapObject *obj) override; QSGClipNode *m_clip = nullptr; QSGSimpleRectNode *m_simpleRectNode = nullptr; diff --git a/src/location/labs/qmapcircleobject.cpp b/src/location/labs/qmapcircleobject.cpp index 735ece5c..d7f1d58f 100644 --- a/src/location/labs/qmapcircleobject.cpp +++ b/src/location/labs/qmapcircleobject.cpp @@ -278,7 +278,8 @@ void QMapCircleObject::setMap(QGeoMap *map) QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected if (!map) { - // Map was set, now it has ben re-set to NULL + // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // so m_map inside d_ptr can still be used to remove itself, inside the destructor. d_ptr = new QMapCircleObjectPrivateDefault(*d); // Old pimpl deleted implicitly by QExplicitlySharedDataPointer } diff --git a/src/location/labs/qmapiconobject.cpp b/src/location/labs/qmapiconobject.cpp index 507492d2..be82ebbf 100644 --- a/src/location/labs/qmapiconobject.cpp +++ b/src/location/labs/qmapiconobject.cpp @@ -236,7 +236,8 @@ void QMapIconObject::setMap(QGeoMap *map) QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected if (!map) { - // Map was set, now it has ben re-set to NULL + // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // so m_map inside d_ptr can still be used to remove itself, inside the destructor. d_ptr = new QMapIconObjectPrivateDefault(*d); // Old pimpl deleted implicitly by QExplicitlySharedDataPointer } diff --git a/src/location/labs/qmapobjectview.cpp b/src/location/labs/qmapobjectview.cpp index e1161acd..175e7cc4 100644 --- a/src/location/labs/qmapobjectview.cpp +++ b/src/location/labs/qmapobjectview.cpp @@ -144,37 +144,6 @@ QList QMapObjectView::geoMapObjectChildren() const return kids; } -void QMapObjectView::setMap(QGeoMap *map) -{ - QMapObjectViewPrivate *d = static_cast(d_ptr.data()); - if (d->m_map == map) - return; - - QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected - - for (int i = 0; i < m_userAddedMapObjects.size(); ++i) { - auto obj = m_userAddedMapObjects.at(i); - if (obj && obj->map() != map) - obj->setMap(map); - } - - if (!map) { - // Map was set, now it has ben re-set to NULL - flushDelegateModel(); - flushUserAddedMapObjects(); - d_ptr = new QMapObjectViewPrivateDefault(*d); - } else if (d->m_componentCompleted) { - // Map was null, now it's set AND delegateModel is already complete. - // some delegates may have been incubated but not added to the map. - for (int i = 0; i < m_pendingMapObjects.size(); ++i) { - auto obj = m_pendingMapObjects.at(i); - if (obj && obj->map() != map) - obj->setMap(map); - } - m_pendingMapObjects.clear(); - } -} - void QMapObjectView::classBegin() { QQmlContext *ctx = qmlContext(this); @@ -381,5 +350,36 @@ void QMapObjectView::flushUserAddedMapObjects() } } +void QMapObjectView::setMap(QGeoMap *map) +{ + QMapObjectViewPrivate *d = static_cast(d_ptr.data()); + if (d->m_map == map) + return; + + QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected + + for (int i = 0; i < m_userAddedMapObjects.size(); ++i) { + auto obj = m_userAddedMapObjects.at(i); + if (obj && obj->map() != map) + obj->setMap(map); + } + + if (!map) { + // Map was set, now it has ben re-set to NULL + flushDelegateModel(); + flushUserAddedMapObjects(); + d_ptr = new QMapObjectViewPrivateDefault(*d); + } else if (d->m_componentCompleted) { + // Map was null, now it's set AND delegateModel is already complete. + // some delegates may have been incubated but not added to the map. + for (int i = 0; i < m_pendingMapObjects.size(); ++i) { + auto obj = m_pendingMapObjects.at(i); + if (obj && obj->map() != map) + obj->setMap(map); + } + m_pendingMapObjects.clear(); + } +} + QT_END_NAMESPACE diff --git a/src/location/labs/qmappolygonobject.cpp b/src/location/labs/qmappolygonobject.cpp index adc3259f..1d495899 100644 --- a/src/location/labs/qmappolygonobject.cpp +++ b/src/location/labs/qmappolygonobject.cpp @@ -246,7 +246,8 @@ void QMapPolygonObject::setMap(QGeoMap *map) QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected if (!map) { - // Map was set, now it has ben re-set to NULL + // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // so m_map inside d_ptr can still be used to remove itself, inside the destructor. d_ptr = new QMapPolygonObjectPrivateDefault(*d); // Old pimpl deleted implicitly by QExplicitlySharedDataPointer } diff --git a/src/location/labs/qmappolylineobject.cpp b/src/location/labs/qmappolylineobject.cpp index bea79327..1c351962 100644 --- a/src/location/labs/qmappolylineobject.cpp +++ b/src/location/labs/qmappolylineobject.cpp @@ -209,7 +209,8 @@ void QMapPolylineObject::setMap(QGeoMap *map) QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected if (!map) { - // Map was set, now it has ben re-set to NULL + // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // so m_map inside d_ptr can still be used to remove itself, inside the destructor. d_ptr = new QMapPolylineObjectPrivateDefault(*d); // Old pimpl deleted implicitly by QExplicitlySharedDataPointer } diff --git a/src/location/labs/qmaprouteobject.cpp b/src/location/labs/qmaprouteobject.cpp index 7e36322c..c3365d30 100644 --- a/src/location/labs/qmaprouteobject.cpp +++ b/src/location/labs/qmaprouteobject.cpp @@ -170,7 +170,8 @@ void QMapRouteObject::setMap(QGeoMap *map) QGeoMapObject::setMap(map); // This is where the specialized pimpl gets created and injected if (!map) { - // Map was set, now it has ben re-set to NULL + // Map was set, now it has ben re-set to NULL, but not inside d_ptr. + // so m_map inside d_ptr can still be used to remove itself, inside the destructor. d_ptr = new QMapRouteObjectPrivate(*d); // Old pimpl deleted implicitly by QExplicitlySharedDataPointer } diff --git a/src/location/labs/qsg/qgeomapobjectqsgsupport.cpp b/src/location/labs/qsg/qgeomapobjectqsgsupport.cpp new file mode 100644 index 00000000..e0e3a6d7 --- /dev/null +++ b/src/location/labs/qsg/qgeomapobjectqsgsupport.cpp @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qgeomapobjectqsgsupport_p.h" +#include + +QT_BEGIN_NAMESPACE + +static int findMapObject(QGeoMapObject *o, const QList &list) +{ + for (int i = 0; i < list.size(); ++i) + { + if (list.at(i).object.data() == o) + return i; + } + return -1; +} + +bool QGeoMapObjectQSGSupport::createMapObjectImplementation(QGeoMapObject *obj, QGeoMapPrivate *d) +{ + QExplicitlySharedDataPointer pimpl = + QExplicitlySharedDataPointer(d->createMapObjectImplementation(obj)); + if (pimpl.constData()) { + bool res = obj->setImplementation(pimpl); + if (res) + emit m_map->sgNodeChanged(); + return res; + } + return false; +} + +QGeoMapObjectPrivate *QGeoMapObjectQSGSupport::createMapObjectImplementationPrivate(QGeoMapObject *obj) +{ + QGeoMapObjectPrivate *res = nullptr; + + { + QQSGMapObject *sgo = nullptr; + switch (obj->type()) { + case QGeoMapObject::PolylineType: { + QMapPolylineObjectPrivate &oldImpl = static_cast(*obj->implementation()); + QMapPolylineObjectPrivateQSG *pimpl = + new QMapPolylineObjectPrivateQSG(oldImpl); + sgo = pimpl; + res = pimpl; + break; + } + case QGeoMapObject::PolygonType: { + QMapPolygonObjectPrivate &oldImpl = static_cast(*obj->implementation()); + QMapPolygonObjectPrivateQSG *pimpl = + new QMapPolygonObjectPrivateQSG(oldImpl); + sgo = pimpl; + res = pimpl; + break; + } + case QGeoMapObject::CircleType: { + QMapCircleObjectPrivate &oldImpl = static_cast(*obj->implementation()); + QMapCircleObjectPrivateQSG *pimpl = + new QMapCircleObjectPrivateQSG(oldImpl); + sgo = pimpl; + res = pimpl; + break; + } + case QGeoMapObject::RouteType: { + QMapRouteObjectPrivate &oldImpl = static_cast(*obj->implementation()); + QMapRouteObjectPrivateQSG *pimpl = + new QMapRouteObjectPrivateQSG(oldImpl); + sgo = pimpl; + res = pimpl; + break; + } + case QGeoMapObject::IconType: { + QMapIconObjectPrivate &oldImpl = static_cast(*obj->implementation()); + QMapIconObjectPrivateQSG *pimpl = + new QMapIconObjectPrivateQSG(oldImpl); + sgo = pimpl; + res = pimpl; + break; + } + default: + // Use the following warning only for debugging purposes. + // qWarning() << "QGeoMapObjectQSGSupport::createMapObjectImplementationPrivate: not instantiating pimpl for unsupported object type " << obj->type(); + break; + } + + if (res) { + QPointer p(obj); + MapObject mo(p, sgo); + m_pendingMapObjects << mo; + } + } + return res; +} + +QList QGeoMapObjectQSGSupport::mapObjects() const +{ + return QList(); +} + +void QGeoMapObjectQSGSupport::removeMapObject(QGeoMapObject *obj) +{ + int idx = findMapObject(obj, m_mapObjects); + if (idx >= 0) { + const MapObject &mo = m_mapObjects.takeAt(idx); + obj->disconnect(m_map); + m_removedMapObjects << mo; + emit m_map->sgNodeChanged(); + } else { + idx = findMapObject(obj, m_pendingMapObjects); + if (idx >= 0) { + m_pendingMapObjects.removeAt(idx); + obj->disconnect(m_map); + } else { + // obj not here. + } + } +} + +void QGeoMapObjectQSGSupport::updateMapObjects(QSGNode *root, QQuickWindow *window) +{ + for (int i = 0; i < m_removedMapObjects.size(); ++i) { + MapObject mo = m_removedMapObjects[i]; + if (mo.qsgNode) { + root->removeChildNode(mo.qsgNode); + delete mo.qsgNode; + mo.qsgNode = nullptr; + // mo.sgObject is now invalid as it is destroyed right after appending + // mo to m_removedMapObjects + } + } + m_removedMapObjects.clear(); + + for (int i = 0; i < m_mapObjects.size(); ++i) { + // already added as node + if (Q_UNLIKELY(!m_mapObjects.at(i).object)) { + qWarning() << "unexpected NULL pointer in m_mapObjects at "<updateMapObjectNode(oldNode, &mo.visibleNode, root, window); + if (Q_UNLIKELY(!mo.qsgNode)) { + qWarning() << "updateMapObjectNode for "<type() << " returned NULL"; + } else if (mo.visibleNode && (mo.visibleNode->visible() != mo.object->visible())) { + mo.visibleNode->setVisible(mo.object->visible()); + mo.qsgNode->markDirty(QSGNode::DirtySubtreeBlocked); + } + } + + QList toRemove; + for (int i = 0; i < m_pendingMapObjects.size(); ++i) { + // already added as node + MapObject &mo = m_pendingMapObjects[i]; + QQSGMapObject *sgo = mo.sgObject; + QSGNode *oldNode = mo.qsgNode; + sgo->updateGeometry(); // or subtree will be blocked + mo.qsgNode = sgo->updateMapObjectNode(oldNode, &mo.visibleNode, root, window); + if (mo.qsgNode) { + if (mo.visibleNode && (mo.visibleNode->visible() != mo.object->visible())) { + mo.visibleNode->setVisible(mo.object->visible()); + mo.qsgNode->markDirty(QSGNode::DirtySubtreeBlocked); + } + m_mapObjects << mo; + toRemove.push_front(i); + QObject::connect(mo.object, SIGNAL(visibleChanged()), m_map, SIGNAL(sgNodeChanged())); + } else { + // leave it to be processed, don't spit warnings + } + } + + for (int i: qAsConst(toRemove)) + m_pendingMapObjects.removeAt(i); +} + +void QGeoMapObjectQSGSupport::updateObjectsGeometry() +{ + for (int i = 0; i < m_mapObjects.size(); ++i) { + // already added as node + if (Q_UNLIKELY(!m_mapObjects.at(i).object)) { + qWarning() << "unexpected NULL pointer in m_mapObjects at "<updateGeometry(); + } + emit m_map->sgNodeChanged(); +} + +QT_END_NAMESPACE diff --git a/src/location/labs/qsg/qgeomapobjectqsgsupport_p.h b/src/location/labs/qsg/qgeomapobjectqsgsupport_p.h new file mode 100644 index 00000000..bb0477c5 --- /dev/null +++ b/src/location/labs/qsg/qgeomapobjectqsgsupport_p.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPOBJECTQSGSUPPORT_P_H +#define QGEOMAPOBJECTQSGSUPPORT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +struct Q_LOCATION_PRIVATE_EXPORT MapObject { + MapObject(QPointer &o, QQSGMapObject *sgo) + : object(o), sgObject(sgo) {} + + QPointer object; + QQSGMapObject *sgObject = nullptr; // this is a QMap*ObjectPrivateQSG. it becomes invalid when the pimpl is destroyed + VisibleNode *visibleNode = nullptr; // This is a Map*Node (like a MapPolygonNode) that is a QSGNode. This doesn't disappear by itself + QSGNode *qsgNode = nullptr; +}; + +class Q_LOCATION_PRIVATE_EXPORT QGeoMapObjectQSGSupport +{ +public: + bool createMapObjectImplementation(QGeoMapObject *obj, QGeoMapPrivate *d); + QGeoMapObjectPrivate *createMapObjectImplementationPrivate(QGeoMapObject *obj); + QList mapObjects() const; + void removeMapObject(QGeoMapObject *obj); + void updateMapObjects(QSGNode *root, QQuickWindow *window); + void updateObjectsGeometry(); + + QList m_mapObjects; + QList m_pendingMapObjects; + QList m_removedMapObjects; + QGeoMap *m_map = nullptr; +}; + +QT_END_NAMESPACE + +#endif // QGEOMAPOBJECTQSGSUPPORT_P_H diff --git a/src/location/labs/qsg/qmapcircleobjectqsg.cpp b/src/location/labs/qsg/qmapcircleobjectqsg.cpp index 9fe3ee0a..775016b9 100644 --- a/src/location/labs/qsg/qmapcircleobjectqsg.cpp +++ b/src/location/labs/qsg/qmapcircleobjectqsg.cpp @@ -60,7 +60,8 @@ QMapCircleObjectPrivateQSG::QMapCircleObjectPrivateQSG(const QMapCircleObjectPri QMapCircleObjectPrivateQSG::~QMapCircleObjectPrivateQSG() { - + if (m_map) + m_map->removeMapObject(q); } void QMapCircleObjectPrivateQSG::updateCirclePath() @@ -147,13 +148,18 @@ QGeoMapObjectPrivate *QMapCircleObjectPrivateQSG::clone() return new QMapCircleObjectPrivateQSG(static_cast(*this)); } -QSGNode *QMapCircleObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow * /*window*/) +QSGNode *QMapCircleObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow * /*window*/) { +// Q_UNUSED(visibleNode) // coz of -Werror=unused-but-set-parameter MapPolygonNode *node = static_cast(oldNode); bool created = false; if (!node) { node = new MapPolygonNode(); + *visibleNode = static_cast(node); created = true; } diff --git a/src/location/labs/qsg/qmapcircleobjectqsg_p_p.h b/src/location/labs/qsg/qmapcircleobjectqsg_p_p.h index 17d8568a..4e8162fa 100644 --- a/src/location/labs/qsg/qmapcircleobjectqsg_p_p.h +++ b/src/location/labs/qsg/qmapcircleobjectqsg_p_p.h @@ -72,7 +72,10 @@ public: // QQSGMapObject void updateGeometry() override; - QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window) override; + QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) override; // QGeoMapCirclePrivate interface void setCenter(const QGeoCoordinate ¢er) override; diff --git a/src/location/labs/qsg/qmapiconobjectqsg.cpp b/src/location/labs/qsg/qmapiconobjectqsg.cpp index 53d16179..47c39695 100644 --- a/src/location/labs/qsg/qmapiconobjectqsg.cpp +++ b/src/location/labs/qsg/qmapiconobjectqsg.cpp @@ -43,26 +43,19 @@ #include #include #include +#include QT_BEGIN_NAMESPACE -class RootNode : public QSGTransformNode +class RootNode : public QSGTransformNode, public VisibleNode { public: - RootNode() : QSGTransformNode() - { } + RootNode() { } bool isSubtreeBlocked() const override { - return m_blocked; + return subtreeBlocked(); } - - void setSubtreeBlocked(bool blocked) - { - m_blocked = blocked; - } - - bool m_blocked = false; }; QMapIconObjectPrivateQSG::QMapIconObjectPrivateQSG(QGeoMapObject *q) @@ -80,7 +73,8 @@ QMapIconObjectPrivateQSG::QMapIconObjectPrivateQSG(const QMapIconObjectPrivate & QMapIconObjectPrivateQSG::~QMapIconObjectPrivateQSG() { - + if (m_map) + m_map->removeMapObject(q); } void QMapIconObjectPrivateQSG::updateGeometry() @@ -100,8 +94,12 @@ void QMapIconObjectPrivateQSG::updateGeometry() // TODO: support and test for zoomLevel } -QSGNode *QMapIconObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode * root, QQuickWindow *window) +QSGNode *QMapIconObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) { + Q_UNUSED(visibleNode) bool created = false; RootNode *node = static_cast(oldNode); if (!node) { @@ -109,6 +107,7 @@ QSGNode *QMapIconObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode m_imageNode = window->createImageNode(); m_imageNode->setOwnsTexture(true); node->appendChildNode(m_imageNode); + *visibleNode = static_cast(node); created = true; } diff --git a/src/location/labs/qsg/qmapiconobjectqsg_p_p.h b/src/location/labs/qsg/qmapiconobjectqsg_p_p.h index a2f7cf40..c57828af 100644 --- a/src/location/labs/qsg/qmapiconobjectqsg_p_p.h +++ b/src/location/labs/qsg/qmapiconobjectqsg_p_p.h @@ -69,7 +69,10 @@ public: // QQSGMapObject void updateGeometry() override; - QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window) override; + QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) override; // QGeoMapIconPrivate interface void setCoordinate(const QGeoCoordinate &coordinate) override; diff --git a/src/location/labs/qsg/qmappolygonobjectqsg.cpp b/src/location/labs/qsg/qmappolygonobjectqsg.cpp index 27dcc80f..b9602a3a 100644 --- a/src/location/labs/qsg/qmappolygonobjectqsg.cpp +++ b/src/location/labs/qsg/qmappolygonobjectqsg.cpp @@ -57,7 +57,8 @@ QMapPolygonObjectPrivateQSG::QMapPolygonObjectPrivateQSG(const QMapPolygonObject QMapPolygonObjectPrivateQSG::~QMapPolygonObjectPrivateQSG() { - + if (m_map) + m_map->removeMapObject(q); } QList QMapPolygonObjectPrivateQSG::projectPath() @@ -74,13 +75,18 @@ QList QMapPolygonObjectPrivateQSG::projectPath() return geopathProjected_; } -QSGNode *QMapPolygonObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow * /*window*/) +QSGNode *QMapPolygonObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow */*window*/) { + Q_UNUSED(visibleNode) MapPolygonNode *node = static_cast(oldNode); bool created = false; if (!node) { node = new MapPolygonNode(); + *visibleNode = static_cast(node); created = true; } diff --git a/src/location/labs/qsg/qmappolygonobjectqsg_p_p.h b/src/location/labs/qsg/qmappolygonobjectqsg_p_p.h index bd5efcff..b288528a 100644 --- a/src/location/labs/qsg/qmappolygonobjectqsg_p_p.h +++ b/src/location/labs/qsg/qmappolygonobjectqsg_p_p.h @@ -68,7 +68,10 @@ public: // QQSGMapObject void updateGeometry() override; - QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window) override; + QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) override; // QGeoMapPolylinePrivate interface QList path() const override; diff --git a/src/location/labs/qsg/qmappolylineobjectqsg.cpp b/src/location/labs/qsg/qmappolylineobjectqsg.cpp index c0c3854e..6b782c77 100644 --- a/src/location/labs/qsg/qmappolylineobjectqsg.cpp +++ b/src/location/labs/qsg/qmappolylineobjectqsg.cpp @@ -61,7 +61,8 @@ QMapPolylineObjectPrivateQSG::QMapPolylineObjectPrivateQSG(const QMapPolylineObj QMapPolylineObjectPrivateQSG::~QMapPolylineObjectPrivateQSG() { - + if (m_map) + m_map->removeMapObject(q); } QList QMapPolylineObjectPrivateQSG::projectPath() @@ -96,13 +97,18 @@ void QMapPolylineObjectPrivateQSG::updateGeometry() m_geometry.translate(origin - m_geometry.firstPointOffset()); } -QSGNode *QMapPolylineObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow * /*window*/) +QSGNode *QMapPolylineObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow */*window*/) { + Q_UNUSED(visibleNode) MapPolylineNode *node = static_cast(oldNode); bool created = false; if (!node) { node = new MapPolylineNode(); + *visibleNode = static_cast(node); created = true; } diff --git a/src/location/labs/qsg/qmappolylineobjectqsg_p_p.h b/src/location/labs/qsg/qmappolylineobjectqsg_p_p.h index 52b5e89a..792413e5 100644 --- a/src/location/labs/qsg/qmappolylineobjectqsg_p_p.h +++ b/src/location/labs/qsg/qmappolylineobjectqsg_p_p.h @@ -68,7 +68,10 @@ public: // QQSGMapObject void updateGeometry() override; - QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window) override; + QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) override; // QGeoMapPolylinePrivate interface QList path() const override; diff --git a/src/location/labs/qsg/qmaprouteobjectqsg.cpp b/src/location/labs/qsg/qmaprouteobjectqsg.cpp index a8728e08..eaea64f3 100644 --- a/src/location/labs/qsg/qmaprouteobjectqsg.cpp +++ b/src/location/labs/qsg/qmaprouteobjectqsg.cpp @@ -57,7 +57,8 @@ QMapRouteObjectPrivateQSG::QMapRouteObjectPrivateQSG(const QMapRouteObjectPrivat QMapRouteObjectPrivateQSG::~QMapRouteObjectPrivateQSG() { - + if (m_map) + m_map->removeMapObject(q); } void QMapRouteObjectPrivateQSG::updateGeometry() @@ -65,9 +66,12 @@ void QMapRouteObjectPrivateQSG::updateGeometry() m_polyline->updateGeometry(); } -QSGNode *QMapRouteObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow * window) +QSGNode *QMapRouteObjectPrivateQSG::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) { - return m_polyline->updateMapObjectNode(oldNode, root, window); + return m_polyline->updateMapObjectNode(oldNode, visibleNode, root, window); } void QMapRouteObjectPrivateQSG::setRoute(const QDeclarativeGeoRoute *route) diff --git a/src/location/labs/qsg/qmaprouteobjectqsg_p_p.h b/src/location/labs/qsg/qmaprouteobjectqsg_p_p.h index 1c612532..0c946259 100644 --- a/src/location/labs/qsg/qmaprouteobjectqsg_p_p.h +++ b/src/location/labs/qsg/qmaprouteobjectqsg_p_p.h @@ -68,7 +68,10 @@ public: // QQSGMapObject void updateGeometry() override; - QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window) override; + QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window) override; // QMapRouteObjectPrivate interface void setRoute(const QDeclarativeGeoRoute *route) override; diff --git a/src/location/labs/qsg/qqsgmapobject.cpp b/src/location/labs/qsg/qqsgmapobject.cpp index 5b4f7dbf..ccda12d8 100644 --- a/src/location/labs/qsg/qqsgmapobject.cpp +++ b/src/location/labs/qsg/qqsgmapobject.cpp @@ -35,6 +35,7 @@ ****************************************************************************/ #include "qqsgmapobject_p.h" +#include QT_BEGIN_NAMESPACE @@ -48,7 +49,10 @@ QQSGMapObject::~QQSGMapObject() } -QSGNode *QQSGMapObject::updateMapObjectNode(QSGNode *oldNode, QSGNode * /*root*/, QQuickWindow * /*window*/) +QSGNode *QQSGMapObject::updateMapObjectNode(QSGNode *oldNode, + VisibleNode **/*visibleNode*/, + QSGNode * /*root*/, + QQuickWindow * /*window*/) { delete oldNode; return 0; diff --git a/src/location/labs/qsg/qqsgmapobject_p.h b/src/location/labs/qsg/qqsgmapobject_p.h index d3e54a68..1aecc990 100644 --- a/src/location/labs/qsg/qqsgmapobject_p.h +++ b/src/location/labs/qsg/qqsgmapobject_p.h @@ -40,6 +40,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -50,10 +51,11 @@ public: QQSGMapObject(); virtual ~QQSGMapObject(); - virtual QSGNode *updateMapObjectNode(QSGNode *oldNode, QSGNode *root, QQuickWindow *window); + virtual QSGNode *updateMapObjectNode(QSGNode *oldNode, + VisibleNode **visibleNode, + QSGNode *root, + QQuickWindow *window); virtual void updateGeometry(); - - QSGNode *node = nullptr; }; QT_END_NAMESPACE diff --git a/src/location/maps/qgeomap_p.h b/src/location/maps/qgeomap_p.h index e67340be..f6be5cae 100644 --- a/src/location/maps/qgeomap_p.h +++ b/src/location/maps/qgeomap_p.h @@ -151,13 +151,13 @@ public: virtual bool fitViewportToGeoRectangle(const QGeoRectangle &rectangle); virtual void setCopyrightVisible(bool visible); + virtual void removeMapObject(QGeoMapObject *obj); protected: QGeoMap(QGeoMapPrivate &dd, QObject *parent = 0); void setCameraData(const QGeoCameraData &cameraData); void setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities); virtual QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window) = 0; - virtual void removeMapObject(QGeoMapObject *obj); Q_SIGNALS: void cameraDataChanged(const QGeoCameraData &cameraData); diff --git a/src/location/maps/qgeomap_p_p.h b/src/location/maps/qgeomap_p_p.h index 18c72202..47780c47 100644 --- a/src/location/maps/qgeomap_p_p.h +++ b/src/location/maps/qgeomap_p_p.h @@ -80,6 +80,7 @@ public: const QGeoCameraCapabilities &cameraCapabilities() const; static const QGeoMapPrivate *get(const QGeoMap &map); + virtual QGeoMapObjectPrivate *createMapObjectImplementation(QGeoMapObject *obj); protected: /* Hooks into the actual map implementations */ @@ -90,7 +91,6 @@ protected: virtual void addMapItem(QDeclarativeGeoMapItemBase *item); virtual void removeMapItem(QDeclarativeGeoMapItemBase *item); - virtual QGeoMapObjectPrivate *createMapObjectImplementation(QGeoMapObject *obj); virtual QList mapObjects() const; virtual void changeViewportSize(const QSize &size) = 0; // called by QGeoMap::setSize() diff --git a/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.cpp b/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.cpp index 99146801..af0e263b 100644 --- a/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.cpp +++ b/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.cpp @@ -47,12 +47,8 @@ #include #include #include -struct MapObject { - MapObject(QPointer &o, QQSGMapObject *sgo) - : object(o), sgObject(sgo) {} - QPointer object; - QQSGMapObject *sgObject = nullptr; -}; +#include +#include #endif QT_BEGIN_NAMESPACE @@ -61,18 +57,16 @@ class QGeoMapItemsOverlayPrivate : public QGeoMapPrivate { Q_DECLARE_PUBLIC(QGeoMapItemsOverlay) public: - QGeoMapItemsOverlayPrivate(QGeoMappingManagerEngineItemsOverlay *engine); + QGeoMapItemsOverlayPrivate(QGeoMappingManagerEngineItemsOverlay *engine, QGeoMapItemsOverlay *map); virtual ~QGeoMapItemsOverlayPrivate(); #ifdef LOCATIONLABS QGeoMapObjectPrivate *createMapObjectImplementation(QGeoMapObject *obj) override; virtual QList mapObjects() const override; - static int findMapObject(QGeoMapObject *o, const QList &list); void removeMapObject(QGeoMapObject *obj); void updateMapObjects(QSGNode *root, QQuickWindow *window); - QList m_mapObjects; - QList m_pendingMapObjects; + QGeoMapObjectQSGSupport m_qsgSupport; #endif void updateObjectsGeometry(); @@ -83,7 +77,7 @@ protected: }; QGeoMapItemsOverlay::QGeoMapItemsOverlay(QGeoMappingManagerEngineItemsOverlay *engine, QObject *parent) - : QGeoMap(*(new QGeoMapItemsOverlayPrivate(engine)), parent) + : QGeoMap(*(new QGeoMapItemsOverlayPrivate(engine, this)), parent) { } @@ -99,6 +93,16 @@ QGeoMap::Capabilities QGeoMapItemsOverlay::capabilities() const | SupportsAnchoringCoordinate); } +bool QGeoMapItemsOverlay::createMapObjectImplementation(QGeoMapObject *obj) +{ +#ifndef LOCATIONLABS + return false; +#else + Q_D(QGeoMapItemsOverlay); + return d->m_qsgSupport.createMapObjectImplementation(obj, d); +#endif +} + QSGNode *QGeoMapItemsOverlay::updateSceneGraph(QSGNode *node, QQuickWindow *window) { #ifndef LOCATIONLABS @@ -119,9 +123,18 @@ QSGNode *QGeoMapItemsOverlay::updateSceneGraph(QSGNode *node, QQuickWindow *wind #endif } -QGeoMapItemsOverlayPrivate::QGeoMapItemsOverlayPrivate(QGeoMappingManagerEngineItemsOverlay *engine) +void QGeoMapItemsOverlay::removeMapObject(QGeoMapObject *obj) +{ +#ifdef LOCATIONLABS + Q_D(QGeoMapItemsOverlay); + d->removeMapObject(obj); +#endif +} + +QGeoMapItemsOverlayPrivate::QGeoMapItemsOverlayPrivate(QGeoMappingManagerEngineItemsOverlay *engine, QGeoMapItemsOverlay *map) : QGeoMapPrivate(engine, new QGeoProjectionWebMercator) { + m_qsgSupport.m_map = map; } QGeoMapItemsOverlayPrivate::~QGeoMapItemsOverlayPrivate() @@ -131,138 +144,29 @@ QGeoMapItemsOverlayPrivate::~QGeoMapItemsOverlayPrivate() #ifdef LOCATIONLABS QGeoMapObjectPrivate *QGeoMapItemsOverlayPrivate::createMapObjectImplementation(QGeoMapObject *obj) { - switch (obj->type()) { - case QGeoMapObject::PolylineType: { - QMapPolylineObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapPolylineObjectPrivateQSG *pimpl = - new QMapPolylineObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::PolygonType: { - QMapPolygonObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapPolygonObjectPrivateQSG *pimpl = - new QMapPolygonObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::CircleType: { - QMapCircleObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapCircleObjectPrivateQSG *pimpl = - new QMapCircleObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::RouteType: { - QMapRouteObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapRouteObjectPrivateQSG *pimpl = - new QMapRouteObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - case QGeoMapObject::IconType: { - QMapIconObjectPrivate &oldImpl = static_cast(*obj->implementation()); - QMapIconObjectPrivateQSG *pimpl = - new QMapIconObjectPrivateQSG(oldImpl); - QPointer p(obj); - MapObject mo(p, pimpl); - m_pendingMapObjects << mo; - return pimpl; - } - default: - qWarning() << "Unsupported object type: " << obj->type(); - break; - } - return nullptr; + return m_qsgSupport.createMapObjectImplementationPrivate(obj); } QList QGeoMapItemsOverlayPrivate::mapObjects() const { - return QList(); -} - -int QGeoMapItemsOverlayPrivate::findMapObject(QGeoMapObject *o, const QList &list) -{ - for (int i = 0; i < list.size(); ++i) - { - if (list.at(i).object.data() == o) - return i; - } - return -1; + return m_qsgSupport.mapObjects(); } void QGeoMapItemsOverlayPrivate::removeMapObject(QGeoMapObject *obj) { - int idx = findMapObject(obj, m_mapObjects); - if (idx >= 0) { - m_mapObjects.removeAt(idx); - } else { - idx = findMapObject(obj, m_pendingMapObjects); - if (idx >= 0) { - m_pendingMapObjects.removeAt(idx); - } else { - // obj not here. - } - } + m_qsgSupport.removeMapObject(obj); } void QGeoMapItemsOverlayPrivate::updateMapObjects(QSGNode *root, QQuickWindow *window) { - for (int i = 0; i < m_mapObjects.size(); ++i) { - // already added as node - if (!m_mapObjects.at(i).object) { - qWarning() << "m_mapObjects at "<node; - sgo->node = sgo->updateMapObjectNode(oldNode, root, window); - } - - QList toRemove; - for (int i = 0; i < m_pendingMapObjects.size(); ++i) { - // already added as node - QQSGMapObject *sgo = m_pendingMapObjects.at(i).sgObject; - QSGNode *oldNode = sgo->node; - sgo->updateGeometry(); // or subtree will be blocked - sgo->node = sgo->updateMapObjectNode(oldNode, root, window); - if (sgo->node) { - m_mapObjects << m_pendingMapObjects.at(i); - toRemove.push_front(i); - } else { - // leave it to be processed - } - } - - for (int i: qAsConst(toRemove)) - m_pendingMapObjects.removeAt(i); + m_qsgSupport.updateMapObjects(root, window); } #endif void QGeoMapItemsOverlayPrivate::updateObjectsGeometry() { #ifdef LOCATIONLABS - Q_Q(QGeoMapItemsOverlay); - for (int i = 0; i < m_mapObjects.size(); ++i) { - // already added as node - if (!m_mapObjects.at(i).object) { - qWarning() << "m_mapObjects at "<updateGeometry(); - } - emit q->sgNodeChanged(); + m_qsgSupport.updateObjectsGeometry(); #endif } diff --git a/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.h b/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.h index 42a59f06..1594ffb3 100644 --- a/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.h +++ b/src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.h @@ -54,6 +54,8 @@ public: virtual ~QGeoMapItemsOverlay(); QGeoMap::Capabilities capabilities() const override; + bool createMapObjectImplementation(QGeoMapObject *obj) override; + void removeMapObject(QGeoMapObject *obj) override; protected: QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window) override; -- cgit v1.2.1 From ed06a3b7a13fd148e1acb13cc0184d75672abe39 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Apr 2018 09:29:52 +0200 Subject: QDeclarativeGeoMap::copyrightsVisibleChanged() was not added in Qt 5.11 Change-Id: Id80bf6b1919f0c6d6f96a315289f67ddad220f2f Reviewed-by: Kai Koehne Reviewed-by: Paolo Angelelli --- src/imports/location/plugins.qmltypes | 1 - src/location/declarativemaps/qdeclarativegeomap_p.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/imports/location/plugins.qmltypes b/src/imports/location/plugins.qmltypes index 341da896..d2d9030a 100644 --- a/src/imports/location/plugins.qmltypes +++ b/src/imports/location/plugins.qmltypes @@ -197,7 +197,6 @@ Module { } Signal { name: "copyrightsVisibleChanged" - revision: 11 Parameter { name: "visible"; type: "bool" } } Signal { diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h index af08a953..7f1bf7ab 100644 --- a/src/location/declarativemaps/qdeclarativegeomap_p.h +++ b/src/location/declarativemaps/qdeclarativegeomap_p.h @@ -213,7 +213,7 @@ Q_SIGNALS: void mapItemsChanged(); void errorChanged(); void copyrightLinkActivated(const QString &link); - Q_REVISION(11) void copyrightsVisibleChanged(bool visible); + void copyrightsVisibleChanged(bool visible); void colorChanged(const QColor &color); void bearingChanged(qreal bearing); void tiltChanged(qreal tilt); -- cgit v1.2.1 From 3a6335f13aee6461b98375cea235a592456a5ce5 Mon Sep 17 00:00:00 2001 From: Antti Kokko Date: Fri, 20 Apr 2018 14:26:00 +0300 Subject: Add changes file for Qt 5.11.0 Change-Id: I0e017e06105ccbacc6fc77f51e544955d9d973d0 Reviewed-by: Lars Knoll Reviewed-by: Alex Blasche --- dist/changes-5.11.0 | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 dist/changes-5.11.0 diff --git a/dist/changes-5.11.0 b/dist/changes-5.11.0 new file mode 100644 index 00000000..aae63987 --- /dev/null +++ b/dist/changes-5.11.0 @@ -0,0 +1,116 @@ +Qt 5.11 introduces many new features and improvements as well as bugfixes +over the 5.10.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.0 Changes * +**************************************************************************** + +QtLocation +---------- + + - Qt.labs.location + * A new experimental QML plugin introduced, Qt.labs.location, which + offers two new categories of QML elements: Map Objects and the + Navigator type. Both are experimental, not supposed to work in every + setup (check documentation). This plugin can be disabled at configure + time, through the location-labs-plugin feature. + * Map objects are supposed to be QQuickItem-less equivalents of + Map Items. They are supposed to be easy to implement in plugins, and + to introduce minimal overhead. They come with a reference + implementation based on QSGNodes, that is supposed to work in all of the + currently offered raster based plugins. + At the present, the MapboxGL plugin does not offer map objects support. + * The Navigator type is a new QML api to expose turn-by-turn navigation + functions present in plugins. It requires a plugin supporting + one of the Navigation capabilities to actually work. + At the present, none of the open source plugins have these capabilities. + + - MapParameter + * MapParameter type now deprecated and re-registered under the DynamicParameter + name. + + - QGeoServiceProvider/QGeoServiceProviderFactory + * Added QGeoServiceProviderFactoryV2, capable of producing + QNavigationManagerEngine objects. + Note: QNavigationManagerEngine is private API. + + - QGeoPath + * The path property changed type, from QList to + QVariantList. This is binary-compatible with the previous release, + and source-compatible in QML. + It may, however, introduce source incompatibilities when using + the QObject property API in C++ (::property and ::setProperty), for + example in the generation of language bindings. + For the regular user-code, the use case was deemed as rare enough + (since QGeoShape has a public setter/getter for the path) to not cause + any problem. + As the beta phase passed without issues, this change was therefore left in place. + + - QGeoRoute + * QGeoRoute, QGeoRouteSegment and QGeoManeuver private implementation are + now (privately) exported and can be subclassed in plugins to provide + custom private implementations. + * QGeoRouteRequest now allows to specify extra parameters in QVariantMap form. + * RouteQuery (QDeclarativeGeoRouteQuery) now allows to specify extra parameters + through Map/DynamicParameters. + * Added extended attributes to QGeoManeuver/QDeclarativeGeoManeuver. + * [QTBUG-64066] Introduced new Waypoint QML type, intended to replace + QGeoCoordinate as mean to specify waypoints in a RouteQuery. + + - QPlace + * QPlace private implementation is now (privately) exported and can be + subclassed in plugins to provide custom private implementations. + * QPlaceContent::Type has a new value, CustomType. + + - QDeclarativeGeoMap + * [QTBUG-66315] Fixed a crash calling Map.clearMapItems before Map is + initialized. + * Fixed MapGestureArea not emitting when controlled with scroll wheel. + * [QTBUG-66880] Fixed clearData not triggering scene update. + * [QTBUG-67580] Fixed crash in QQuickGeoMapGestureArea. + * [QTBUG-67759] Fixed crash when calling clearData at startup. + + - Map Items + * [QTBUG-66758] Fixed re-set map items rendering stale geometry. + * [QTBUG-38459] Fixed the geometry of map items so that, if layers.enabled + is set to true, the scene graph renderer will not cut the items borders + anymore. + * [QTBUG-66692, QTBUG-66830] Fixed polyline geometry generation. + * [QTBUG-62086, QTBUG-65833] Fixed MapItemView not setting context data + upon item deletion. + * [QTBUG-67765] Fixed interaction with Map Items borders. + + - Plugins + * Mapbox: Added OnlinePlacesFeature, PlaceRecommendationsFeature, SearchSuggestionsFeature + and LocalizedPlacesFeature. + * Mapbox: Added OnlineGeocodingFeature, ReverseGeocodingFeature and LocalizedGeocodingFeature. + * Mapbox/OSM: OSRM backend now returns extended attributes for the maneuvers, such as + bearing_before, bearing_after, instruction, type and modifier. + * Mapbox/OSM: OSRM backend now uses Waypoint's bearing when sending a route request. + * Mapbox/OSM: Added OSRM's {leg,step}_index extra attribute to QGeoManeuver. + * Mapbox: Supported Mapbox Directions API voice & banner instructions. + * MapboxGL: Added map margins support via 'margins' map parameter. + * HERE: the plugin now uses Waypoint's bearing when sending a route request. + * OSM: supported the query limit parameter in the nominatim backend. + + +QtPositioning +---------- + + * [QTBUG-65937] Metatype for QGeoPositionInfo is now declared and registered. + This change introduces a potential source incompatibility, as existing user code may + contain the type registration already. -- cgit v1.2.1 From 3a03829cb854c299da220a073cae58614d72c5cb Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 26 Apr 2018 10:43:05 -0700 Subject: Fix build with clang The code uses both deprecated C++98 std::auto_ptr and C++14 TR std::experimental::optional and thus depends rather heavily on being compiled with an exact C++ version. Task-number: QTBUG-67810 Change-Id: I599b4a16f93ded6a9fb8fcf24c43c25f83a9f2fd Reviewed-by: Simon Hausmann --- .gitmodules | 2 +- src/3rdparty/mapbox-gl-native | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index a5343bfd..22c3849d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "src/3rdparty/mapbox-gl-native"] path = src/3rdparty/mapbox-gl-native url = ../qtlocation-mapboxgl.git - branch = upstream/qt-staging + branch = upstream/qt-staging-5.11.0 diff --git a/src/3rdparty/mapbox-gl-native b/src/3rdparty/mapbox-gl-native index 8c1be4ec..74df5203 160000 --- a/src/3rdparty/mapbox-gl-native +++ b/src/3rdparty/mapbox-gl-native @@ -1 +1 @@ -Subproject commit 8c1be4ec01ef46bf453856531ebf53b48ce3dbe7 +Subproject commit 74df5203628b47931b4edcb5e8fe352f40fe7df4 -- cgit v1.2.1 From d61a9ddc13a4fca19dbbf35ef9b607c6d676a4b2 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Thu, 3 May 2018 14:49:28 +0300 Subject: Let QDeclarativeNavigator::{start,stop} update m_active QDeclarativeNavigator should call QNavigatorManager::start() inside QDeclarativeNavigator::start(), however because we were already updating m_active in QDeclarativeNavigator::setActive(), the call for QNavigationManager::start() never happens. Task-number: QTBUG-68066 Change-Id: I486381fdec7fc77ac977ee46683fabd2465cf799 Reviewed-by: Paolo Angelelli --- src/location/labs/qdeclarativenavigator.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/location/labs/qdeclarativenavigator.cpp b/src/location/labs/qdeclarativenavigator.cpp index 475cb650..bcb74c90 100644 --- a/src/location/labs/qdeclarativenavigator.cpp +++ b/src/location/labs/qdeclarativenavigator.cpp @@ -312,10 +312,8 @@ void QDeclarativeNavigator::start() return; } - if (d_ptr->m_active) - return; - - d_ptr->m_active = d_ptr->m_navigationManager->start(); + if (!d_ptr->m_navigationManager->active()) + d_ptr->m_active = d_ptr->m_navigationManager->start(); } void QDeclarativeNavigator::stop() @@ -325,10 +323,8 @@ void QDeclarativeNavigator::stop() return; } - if (!d_ptr->m_active) - return; - - d_ptr->m_active = d_ptr->m_navigationManager->stop(); + if (d_ptr->m_navigationManager->active()) + d_ptr->m_active = d_ptr->m_navigationManager->stop(); } void QDeclarativeNavigator::pluginReady() -- cgit v1.2.1 From 139414573ab27bd1df1b491aeb6003a6fc0d3d5d Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Thu, 3 May 2018 14:04:02 +0200 Subject: Fix casting QGeoServiceProviderFactoryV2 qobject_cast ing to QGeoServiceProviderFactory when the instance is a QGeoServiceProviderFactoryV2 returns 0. Use factoryV2 in this case. Task-number: QTBUG-68062 Change-Id: Ibed1902749b6d06c905d309514c3750e75b75626 Reviewed-by: Alex Blasche Reviewed-by: Bruno de Oliveira Abinader --- src/location/maps/qgeoserviceprovider.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/location/maps/qgeoserviceprovider.cpp b/src/location/maps/qgeoserviceprovider.cpp index 3cb0f2df..2d8151ad 100644 --- a/src/location/maps/qgeoserviceprovider.cpp +++ b/src/location/maps/qgeoserviceprovider.cpp @@ -742,8 +742,11 @@ void QGeoServiceProviderPrivate::loadPlugin(const QVariantMap ¶meters) // load the actual plugin QObject *instance = loader()->instance(idx); - factory = qobject_cast(instance); factoryV2 = qobject_cast(instance); + if (!factoryV2) + factory = qobject_cast(instance); + else + factory = factoryV2; } QHash QGeoServiceProviderPrivate::plugins(bool reload) -- cgit v1.2.1