/**************************************************************************** ** ** 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 "qgeotiledmaplabs_p.h" #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QGeoTiledMapLabsPrivate : public QGeoTiledMapPrivate { Q_DECLARE_PUBLIC(QGeoTiledMapLabs) public: QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine, QGeoTiledMapLabs *map); virtual ~QGeoTiledMapLabsPrivate(); QGeoMapObjectPrivate *createMapObjectImplementation(QGeoMapObject *obj) override; virtual QList mapObjects() const override; void removeMapObject(QGeoMapObject *obj); QListmapObjectsAt(const QGeoCoordinate &coordinate) const; void updateMapObjects(QSGNode *root, QQuickWindow *window); void updateObjectsGeometry(); protected: void changeViewportSize(const QSize &size) override; void changeCameraData(const QGeoCameraData &oldCameraData) override; void changeActiveMapType(const QGeoMapType mapType) override; QGeoMapObjectQSGSupport m_qsgSupport; }; QGeoTiledMapLabsPrivate::QGeoTiledMapLabsPrivate(QGeoTiledMappingManagerEngine *engine, QGeoTiledMapLabs *map) : QGeoTiledMapPrivate(engine) { m_qsgSupport.m_map = map; } QGeoTiledMapLabsPrivate::~QGeoTiledMapLabsPrivate() { } QGeoMapObjectPrivate *QGeoTiledMapLabsPrivate::createMapObjectImplementation(QGeoMapObject *obj) { return m_qsgSupport.createMapObjectImplementationPrivate(obj); } QList QGeoTiledMapLabsPrivate::mapObjects() const { return m_qsgSupport.mapObjects(); } void QGeoTiledMapLabsPrivate::removeMapObject(QGeoMapObject *obj) { m_qsgSupport.removeMapObject(obj); } QList QGeoTiledMapLabsPrivate::mapObjectsAt(const QGeoCoordinate &coordinate) const { // ToDo: use a space partitioning strategy QList res; for (const auto o: mapObjects()) { // explicitly handle lines bool contains = false; if (o->type() == QGeoMapObject::PolylineType ) { QMapPolylineObject *mpo = static_cast(o); qreal mpp = QLocationUtils::metersPerPixel(m_cameraData.zoomLevel(), coordinate); QGeoPath path = o->geoShape(); path.setWidth(mpp * mpo->border()->width()); contains = path.contains(coordinate); } else if (o->type() == QGeoMapObject::RouteType) { qreal mpp = QLocationUtils::metersPerPixel(m_cameraData.zoomLevel(), coordinate); QGeoPath path = o->geoShape(); path.setWidth(mpp * 4); // MapRouteObjectQSG has a hardcoded 4 pixels width; contains = path.contains(coordinate); } else { contains = o->geoShape().contains(coordinate); } if (contains) res.append(o); } return res; } void QGeoTiledMapLabsPrivate::updateMapObjects(QSGNode *root, QQuickWindow *window) { m_qsgSupport.updateMapObjects(root, window); } void QGeoTiledMapLabsPrivate::updateObjectsGeometry() { m_qsgSupport.updateObjectsGeometry(); } void QGeoTiledMapLabsPrivate::changeViewportSize(const QSize &size) { updateObjectsGeometry(); QGeoTiledMapPrivate::changeViewportSize(size); } void QGeoTiledMapLabsPrivate::changeCameraData(const QGeoCameraData &oldCameraData) { updateObjectsGeometry(); QGeoTiledMapPrivate::changeCameraData(oldCameraData); } void QGeoTiledMapLabsPrivate::changeActiveMapType(const QGeoMapType mapType) { updateObjectsGeometry(); QGeoTiledMapPrivate::changeActiveMapType(mapType); } /* QGeoTiledMapLabs */ QGeoTiledMapLabs::QGeoTiledMapLabs(QGeoTiledMappingManagerEngine *engine, QObject *parent) : QGeoTiledMap(*new QGeoTiledMapLabsPrivate(engine, this), engine, parent) { } QGeoTiledMapLabs::~QGeoTiledMapLabs() { } bool QGeoTiledMapLabs::createMapObjectImplementation(QGeoMapObject *obj) { Q_D(QGeoTiledMapLabs); return d->m_qsgSupport.createMapObjectImplementation(obj, d); } QSGNode *QGeoTiledMapLabs::updateSceneGraph(QSGNode *node, QQuickWindow *window) { Q_D(QGeoTiledMapLabs); QSGNode *root = QGeoTiledMap::updateSceneGraph(node, window); d->updateMapObjects(root, window); return root; } void QGeoTiledMapLabs::removeMapObject(QGeoMapObject *obj) { Q_D(QGeoTiledMapLabs); d->removeMapObject(obj); } QList QGeoTiledMapLabs::mapObjectsAt(const QGeoCoordinate &coordinate) const { Q_D(const QGeoTiledMapLabs); return d->mapObjectsAt(coordinate); } QGeoTiledMapLabs::QGeoTiledMapLabs(QGeoTiledMapLabsPrivate &dd, QGeoTiledMappingManagerEngine *engine, QObject *parent) : QGeoTiledMap(dd, engine, parent) { } QT_END_NAMESPACE