| 1 | /**************************************************************************** | 
| 2 | ** | 
| 3 | ** Copyright (C) 2015 The Qt Company Ltd. | 
| 4 | ** Contact: http://www.qt.io/licensing/ | 
| 5 | ** | 
| 6 | ** This file is part of the QtLocation module of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:LGPL3$ | 
| 9 | ** Commercial License Usage | 
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | 
| 11 | ** accordance with the commercial license agreement provided with the | 
| 12 | ** Software or, alternatively, in accordance with the terms contained in | 
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | 
| 14 | ** and conditions see http://www.qt.io/terms-conditions. For further | 
| 15 | ** information use the contact form at http://www.qt.io/contact-us. | 
| 16 | ** | 
| 17 | ** GNU Lesser General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
| 19 | ** General Public License version 3 as published by the Free Software | 
| 20 | ** Foundation and appearing in the file LICENSE.LGPLv3 included in the | 
| 21 | ** packaging of this file. Please review the following information to | 
| 22 | ** ensure the GNU Lesser General Public License version 3 requirements | 
| 23 | ** will be met: https://www.gnu.org/licenses/lgpl.html. | 
| 24 | ** | 
| 25 | ** GNU General Public License Usage | 
| 26 | ** Alternatively, this file may be used under the terms of the GNU | 
| 27 | ** General Public License version 2.0 or later as published by the Free | 
| 28 | ** Software Foundation and appearing in the file LICENSE.GPL included in | 
| 29 | ** the packaging of this file. Please review the following information to | 
| 30 | ** ensure the GNU General Public License version 2.0 requirements will be | 
| 31 | ** met: http://www.gnu.org/licenses/gpl-2.0.html. | 
| 32 | ** | 
| 33 | ** $QT_END_LICENSE$ | 
| 34 | ** | 
| 35 | ****************************************************************************/ | 
| 36 |  | 
| 37 | #ifndef QDECLARATIVEGEOMAP_H | 
| 38 | #define QDECLARATIVEGEOMAP_H | 
| 39 |  | 
| 40 | // | 
| 41 | //  W A R N I N G | 
| 42 | //  ------------- | 
| 43 | // | 
| 44 | // This file is not part of the Qt API.  It exists purely as an | 
| 45 | // implementation detail.  This header file may change from version to | 
| 46 | // version without notice, or even be removed. | 
| 47 | // | 
| 48 | // We mean it. | 
| 49 | // | 
| 50 |  | 
| 51 | #include <QtLocation/private/qlocationglobal_p.h> | 
| 52 | #include <QtLocation/private/qdeclarativegeomapitemview_p.h> | 
| 53 | #include <QtLocation/private/qquickgeomapgesturearea_p.h> | 
| 54 | #include <QtLocation/private/qdeclarativegeomapitemgroup_p.h> | 
| 55 | #include <QtLocation/qgeoserviceprovider.h> | 
| 56 | #include <QtLocation/private/qgeocameradata_p.h> | 
| 57 | #include <QtLocation/private/qgeocameracapabilities_p.h> | 
| 58 | #include <QtQuick/QQuickItem> | 
| 59 | #include <QtCore/QList> | 
| 60 | #include <QtCore/QPointer> | 
| 61 | #include <QtGui/QColor> | 
| 62 | #include <QtPositioning/qgeorectangle.h> | 
| 63 | #include <QtLocation/private/qgeomap_p.h> | 
| 64 | #include <QtQuick/private/qquickitemchangelistener_p.h> | 
| 65 |  | 
| 66 | QT_BEGIN_NAMESPACE | 
| 67 |  | 
| 68 | class QDeclarativeGeoServiceProvider; | 
| 69 | class QDeclarativeGeoMapType; | 
| 70 | class QDeclarativeGeoMapCopyrightNotice; | 
| 71 | class QDeclarativeGeoMapParameter; | 
| 72 |  | 
| 73 | class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoMap : public QQuickItem | 
| 74 | { | 
| 75 |     Q_OBJECT | 
| 76 |     Q_ENUMS(QGeoServiceProvider::Error) | 
| 77 |     Q_PROPERTY(QQuickGeoMapGestureArea *gesture READ gesture CONSTANT) | 
| 78 |     Q_PROPERTY(QDeclarativeGeoServiceProvider *plugin READ plugin WRITE setPlugin NOTIFY pluginChanged) | 
| 79 |     Q_PROPERTY(qreal minimumZoomLevel READ minimumZoomLevel WRITE setMinimumZoomLevel NOTIFY minimumZoomLevelChanged) | 
| 80 |     Q_PROPERTY(qreal maximumZoomLevel READ maximumZoomLevel WRITE setMaximumZoomLevel NOTIFY maximumZoomLevelChanged) | 
| 81 |     Q_PROPERTY(qreal zoomLevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged) | 
| 82 |  | 
| 83 |     Q_PROPERTY(qreal tilt READ tilt WRITE setTilt NOTIFY tiltChanged) | 
| 84 |     Q_PROPERTY(qreal minimumTilt READ minimumTilt WRITE setMinimumTilt NOTIFY minimumTiltChanged) | 
| 85 |     Q_PROPERTY(qreal maximumTilt READ maximumTilt WRITE setMaximumTilt NOTIFY maximumTiltChanged) | 
| 86 |  | 
| 87 |     Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged) | 
| 88 |  | 
| 89 |     Q_PROPERTY(qreal fieldOfView READ fieldOfView WRITE setFieldOfView NOTIFY fieldOfViewChanged) | 
| 90 |     Q_PROPERTY(qreal minimumFieldOfView READ minimumFieldOfView WRITE setMinimumFieldOfView NOTIFY minimumFieldOfViewChanged) | 
| 91 |     Q_PROPERTY(qreal maximumFieldOfView READ maximumFieldOfView WRITE setMaximumFieldOfView NOTIFY minimumFieldOfViewChanged) | 
| 92 |  | 
| 93 |     Q_PROPERTY(QDeclarativeGeoMapType *activeMapType READ activeMapType WRITE setActiveMapType NOTIFY activeMapTypeChanged) | 
| 94 |     Q_PROPERTY(QQmlListProperty<QDeclarativeGeoMapType> supportedMapTypes READ supportedMapTypes NOTIFY supportedMapTypesChanged) | 
| 95 |     Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) | 
| 96 |     Q_PROPERTY(QList<QObject *> mapItems READ mapItems NOTIFY mapItemsChanged) | 
| 97 |     Q_PROPERTY(QList<QObject *> mapParameters READ mapParameters) | 
| 98 |     Q_PROPERTY(QGeoServiceProvider::Error error READ error NOTIFY errorChanged) | 
| 99 |     Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged) | 
| 100 |     Q_PROPERTY(QGeoShape visibleRegion READ visibleRegion WRITE setVisibleRegion NOTIFY visibleRegionChanged) | 
| 101 |     Q_PROPERTY(bool copyrightsVisible READ copyrightsVisible WRITE setCopyrightsVisible NOTIFY copyrightsVisibleChanged) | 
| 102 |     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) | 
| 103 |     Q_PROPERTY(bool mapReady READ mapReady NOTIFY mapReadyChanged) | 
| 104 |     Q_PROPERTY(QRectF visibleArea READ visibleArea WRITE setVisibleArea NOTIFY visibleAreaChanged  REVISION 12) | 
| 105 |     Q_INTERFACES(QQmlParserStatus) | 
| 106 |  | 
| 107 | public: | 
| 108 |  | 
| 109 |     explicit QDeclarativeGeoMap(QQuickItem *parent = 0); | 
| 110 |     ~QDeclarativeGeoMap(); | 
| 111 |  | 
| 112 |     void setPlugin(QDeclarativeGeoServiceProvider *plugin); | 
| 113 |     QDeclarativeGeoServiceProvider *plugin() const; | 
| 114 |  | 
| 115 |     void setActiveMapType(QDeclarativeGeoMapType *mapType); | 
| 116 |     QDeclarativeGeoMapType *activeMapType() const; | 
| 117 |  | 
| 118 |     void setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet = true); | 
| 119 |     qreal minimumZoomLevel() const; | 
| 120 |     qreal implicitMinimumZoomLevel() const; | 
| 121 |     qreal effectiveMinimumZoomLevel() const; | 
| 122 |  | 
| 123 |     void setMaximumZoomLevel(qreal maximumZoomLevel, bool userSet = true); | 
| 124 |     qreal maximumZoomLevel() const; | 
| 125 |  | 
| 126 |     void setZoomLevel(qreal zoomLevel); | 
| 127 |     qreal zoomLevel() const; | 
| 128 |  | 
| 129 |     void setBearing(qreal bearing); | 
| 130 |     qreal bearing() const; | 
| 131 |  | 
| 132 |     void setTilt(qreal tilt); | 
| 133 |     qreal tilt() const; | 
| 134 |     void setMinimumTilt(qreal minimumTilt, bool userSet = true); | 
| 135 |     qreal minimumTilt() const; | 
| 136 |     void setMaximumTilt(qreal maximumTilt, bool userSet = true); | 
| 137 |     qreal maximumTilt() const; | 
| 138 |  | 
| 139 |     void setFieldOfView(qreal fieldOfView); | 
| 140 |     qreal fieldOfView() const; | 
| 141 |     void setMinimumFieldOfView(qreal minimumFieldOfView, bool userSet = true); | 
| 142 |     qreal minimumFieldOfView() const; | 
| 143 |     void setMaximumFieldOfView(qreal maximumFieldOfView, bool userSet = true); | 
| 144 |     qreal maximumFieldOfView() const; | 
| 145 |  | 
| 146 |     void setCenter(const QGeoCoordinate ¢er); | 
| 147 |     QGeoCoordinate center() const; | 
| 148 |  | 
| 149 |     void setVisibleRegion(const QGeoShape &shape); | 
| 150 |     QGeoShape visibleRegion() const; | 
| 151 |  | 
| 152 |     void setCopyrightsVisible(bool visible); | 
| 153 |     bool copyrightsVisible() const; | 
| 154 |  | 
| 155 |     void setColor(const QColor &color); | 
| 156 |     QColor color() const; | 
| 157 |  | 
| 158 |     QRectF visibleArea() const; | 
| 159 |     void setVisibleArea(const QRectF &visibleArea); | 
| 160 |  | 
| 161 |     bool mapReady() const; | 
| 162 |  | 
| 163 |     QQmlListProperty<QDeclarativeGeoMapType> supportedMapTypes(); | 
| 164 |  | 
| 165 |     Q_INVOKABLE void setBearing(qreal bearing, const QGeoCoordinate &coordinate); | 
| 166 |     Q_INVOKABLE void alignCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &point); | 
| 167 |  | 
| 168 |     Q_INVOKABLE void removeMapItem(QDeclarativeGeoMapItemBase *item); | 
| 169 |     Q_INVOKABLE void addMapItem(QDeclarativeGeoMapItemBase *item); | 
| 170 |  | 
| 171 |     Q_INVOKABLE void addMapItemGroup(QDeclarativeGeoMapItemGroup *itemGroup); | 
| 172 |     Q_INVOKABLE void removeMapItemGroup(QDeclarativeGeoMapItemGroup *itemGroup); | 
| 173 |  | 
| 174 |     Q_INVOKABLE void removeMapItemView(QDeclarativeGeoMapItemView *itemView); | 
| 175 |     Q_INVOKABLE void addMapItemView(QDeclarativeGeoMapItemView *itemView); | 
| 176 |  | 
| 177 |     Q_INVOKABLE void clearMapItems(); | 
| 178 |     QList<QObject *> mapItems(); | 
| 179 |  | 
| 180 |     Q_INVOKABLE void addMapParameter(QDeclarativeGeoMapParameter *parameter); | 
| 181 |     Q_INVOKABLE void removeMapParameter(QDeclarativeGeoMapParameter *parameter); | 
| 182 |     Q_INVOKABLE void clearMapParameters(); | 
| 183 |     QList<QObject *> mapParameters(); | 
| 184 |  | 
| 185 |     void addMapObject(QGeoMapObject *object); // Not invokable as currently meant to be used through a main MapObjectView | 
| 186 |     void removeMapObject(QGeoMapObject *object); | 
| 187 |     void clearMapObjects(); | 
| 188 |     QList<QGeoMapObject *> mapObjects(); | 
| 189 |  | 
| 190 |  | 
| 191 |     Q_INVOKABLE QGeoCoordinate toCoordinate(const QPointF &position, bool clipToViewPort = true) const; | 
| 192 |     Q_INVOKABLE QPointF fromCoordinate(const QGeoCoordinate &coordinate, bool clipToViewPort = true) const; | 
| 193 |  | 
| 194 |     QQuickGeoMapGestureArea *gesture(); | 
| 195 |  | 
| 196 |     Q_INVOKABLE void fitViewportToMapItems(const QVariantList &items = {}); | 
| 197 |     Q_INVOKABLE void fitViewportToVisibleMapItems(); | 
| 198 |     Q_INVOKABLE void pan(int dx, int dy); | 
| 199 |     Q_INVOKABLE void prefetchData(); // optional hint for prefetch | 
| 200 |     Q_INVOKABLE void clearData(); | 
| 201 |     Q_REVISION(13) Q_INVOKABLE void fitViewportToGeoShape(const QGeoShape &shape, QVariant margins); | 
| 202 |     void fitViewportToGeoShape(const QGeoShape &shape, const QMargins &borders = QMargins(10, 10, 10, 10)); | 
| 203 |  | 
| 204 |     QString errorString() const; | 
| 205 |     QGeoServiceProvider::Error error() const; | 
| 206 |     QGeoMap* map() const; | 
| 207 |  | 
| 208 |     // From QQuickItem | 
| 209 |     void itemChange(ItemChange, const ItemChangeData &) override; | 
| 210 |  | 
| 211 | Q_SIGNALS: | 
| 212 |     void pluginChanged(QDeclarativeGeoServiceProvider *plugin); | 
| 213 |     void zoomLevelChanged(qreal zoomLevel); | 
| 214 |     void centerChanged(const QGeoCoordinate &coordinate); | 
| 215 |     void activeMapTypeChanged(); | 
| 216 |     void supportedMapTypesChanged(); | 
| 217 |     void minimumZoomLevelChanged(); | 
| 218 |     void maximumZoomLevelChanged(); | 
| 219 |     void mapItemsChanged(); | 
| 220 |     void errorChanged(); | 
| 221 |     void copyrightLinkActivated(const QString &link); | 
| 222 |     void copyrightsVisibleChanged(bool visible); | 
| 223 |     void colorChanged(const QColor &color); | 
| 224 |     void bearingChanged(qreal bearing); | 
| 225 |     void tiltChanged(qreal tilt); | 
| 226 |     void fieldOfViewChanged(qreal fieldOfView); | 
| 227 |     void minimumTiltChanged(qreal minimumTilt); | 
| 228 |     void maximumTiltChanged(qreal maximumTilt); | 
| 229 |     void minimumFieldOfViewChanged(qreal minimumFieldOfView); | 
| 230 |     void maximumFieldOfViewChanged(qreal maximumFieldOfView); | 
| 231 |     void copyrightsChanged(const QImage ©rightsImage); | 
| 232 |     void copyrightsChanged(const QString ©rightsHtml); | 
| 233 |     void mapReadyChanged(bool ready); | 
| 234 |     Q_REVISION(11) void mapObjectsChanged(); | 
| 235 |     void visibleAreaChanged(); | 
| 236 |     Q_REVISION(14) void visibleRegionChanged(); | 
| 237 |  | 
| 238 | protected: | 
| 239 |     void mousePressEvent(QMouseEvent *event) override ; | 
| 240 |     void mouseMoveEvent(QMouseEvent *event) override ; | 
| 241 |     void mouseReleaseEvent(QMouseEvent *event) override ; | 
| 242 |     void mouseUngrabEvent() override ; | 
| 243 |     void touchUngrabEvent() override; | 
| 244 |     void touchEvent(QTouchEvent *event) override ; | 
| 245 | #if QT_CONFIG(wheelevent) | 
| 246 |     void wheelEvent(QWheelEvent *event) override ; | 
| 247 | #endif | 
| 248 |  | 
| 249 |     bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; | 
| 250 |     bool sendMouseEvent(QMouseEvent *event); | 
| 251 |     bool sendTouchEvent(QTouchEvent *event); | 
| 252 |  | 
| 253 |     void componentComplete() override; | 
| 254 |     QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; | 
| 255 |     void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; | 
| 256 |  | 
| 257 |     void setError(QGeoServiceProvider::Error error, const QString &errorString); | 
| 258 |     void initialize(); | 
| 259 |     void setZoomLevel(qreal zoomLevel, bool overzoom); | 
| 260 |     bool addMapChild(QObject *child); | 
| 261 |     bool removeMapChild(QObject *child); | 
| 262 |     bool isGroupNested(QDeclarativeGeoMapItemGroup *group); | 
| 263 |  | 
| 264 |     bool addMapItem_real(QDeclarativeGeoMapItemBase *item); | 
| 265 |     bool removeMapItem_real(QDeclarativeGeoMapItemBase *item); | 
| 266 |     bool addMapItemGroup_real(QDeclarativeGeoMapItemGroup *itemGroup); | 
| 267 |     bool removeMapItemGroup_real(QDeclarativeGeoMapItemGroup *itemGroup); | 
| 268 |     bool addMapItemView_real(QDeclarativeGeoMapItemView *itemView); | 
| 269 |     bool removeMapItemView_real(QDeclarativeGeoMapItemView *itemView); | 
| 270 |     void updateItemToWindowTransform(); | 
| 271 |     void onSGNodeChanged(); | 
| 272 |  | 
| 273 | private Q_SLOTS: | 
| 274 |     void mappingManagerInitialized(); | 
| 275 |     void pluginReady(); | 
| 276 |     void onSupportedMapTypesChanged(); | 
| 277 |     void onCameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities); | 
| 278 |     void onAttachedCopyrightNoticeVisibilityChanged(); | 
| 279 |     void onCameraDataChanged(const QGeoCameraData &cameraData); | 
| 280 |  | 
| 281 | private: | 
| 282 |     void setupMapView(QDeclarativeGeoMapItemView *view); | 
| 283 |     void populateMap(); | 
| 284 |     void populateParameters(); | 
| 285 |     void fitViewportToMapItemsRefine(const QList<QPointer<QDeclarativeGeoMapItemBase> > &mapItems, bool refine, bool onlyVisible); | 
| 286 |     bool isInteractive(); | 
| 287 |     void attachCopyrightNotice(bool initialVisibility); | 
| 288 |     void detachCopyrightNotice(bool currentVisibility); | 
| 289 |     QMargins mapMargins() const; | 
| 290 |  | 
| 291 | private: | 
| 292 |     QDeclarativeGeoServiceProvider *m_plugin; | 
| 293 |     QGeoMappingManager *m_mappingManager; | 
| 294 |     QDeclarativeGeoMapType *m_activeMapType; | 
| 295 |     QList<QDeclarativeGeoMapType *> m_supportedMapTypes; | 
| 296 |     QList<QDeclarativeGeoMapItemView *> m_mapViews; | 
| 297 |     QQuickGeoMapGestureArea *m_gestureArea; | 
| 298 |     QPointer<QGeoMap> m_map; | 
| 299 |     QPointer<QDeclarativeGeoMapCopyrightNotice> m_copyrights; | 
| 300 |     QList<QPointer<QDeclarativeGeoMapItemBase> > m_mapItems; | 
| 301 |     QList<QPointer<QDeclarativeGeoMapItemGroup> > m_mapItemGroups; | 
| 302 |     QString m_errorString; | 
| 303 |     QGeoServiceProvider::Error m_error; | 
| 304 |     QGeoRectangle m_visibleRegion; | 
| 305 |     QColor m_color; | 
| 306 |     QGeoCameraData m_cameraData; | 
| 307 |     bool m_componentCompleted; | 
| 308 |     bool m_pendingFitViewport; | 
| 309 |     bool m_copyrightsVisible; | 
| 310 |     double m_maximumViewportLatitude; | 
| 311 |     double m_minimumViewportLatitude = 0.0; | 
| 312 |     bool m_initialized; | 
| 313 |     bool m_sgNodeHasChanged = false; | 
| 314 |     QList<QDeclarativeGeoMapParameter *> m_mapParameters; | 
| 315 |     QList<QGeoMapObject*> m_pendingMapObjects; // Used only in the initialization phase | 
| 316 |     QGeoCameraCapabilities m_cameraCapabilities; | 
| 317 |     qreal m_userMinimumZoomLevel; | 
| 318 |     qreal m_userMaximumZoomLevel; | 
| 319 |  | 
| 320 |     qreal m_minimumTilt; | 
| 321 |     qreal m_maximumTilt; | 
| 322 |     qreal m_userMinimumTilt; | 
| 323 |     qreal m_userMaximumTilt; | 
| 324 |  | 
| 325 |     qreal m_minimumFieldOfView; | 
| 326 |     qreal m_maximumFieldOfView; | 
| 327 |     qreal m_userMinimumFieldOfView; | 
| 328 |     qreal m_userMaximumFieldOfView; | 
| 329 |  | 
| 330 |     int m_copyNoticesVisible = 0; | 
| 331 |     qreal m_maxChildZ = 0; | 
| 332 |     QRectF m_visibleArea; | 
| 333 |  | 
| 334 |  | 
| 335 |     friend class QDeclarativeGeoMapItem; | 
| 336 |     friend class QDeclarativeGeoMapItemView; | 
| 337 |     friend class QQuickGeoMapGestureArea; | 
| 338 |     friend class QDeclarativeGeoMapCopyrightNotice; | 
| 339 |     Q_DISABLE_COPY(QDeclarativeGeoMap) | 
| 340 | }; | 
| 341 |  | 
| 342 |  | 
| 343 | QT_END_NAMESPACE | 
| 344 |  | 
| 345 | QML_DECLARE_TYPE(QDeclarativeGeoMap) | 
| 346 |  | 
| 347 | #endif | 
| 348 |  |