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
66QT_BEGIN_NAMESPACE
67
68class QDeclarativeGeoServiceProvider;
69class QDeclarativeGeoMapType;
70class QDeclarativeGeoMapCopyrightNotice;
71class QDeclarativeGeoMapParameter;
72
73class 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
107public:
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 &center);
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
211Q_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 &copyrightsImage);
232 void copyrightsChanged(const QString &copyrightsHtml);
233 void mapReadyChanged(bool ready);
234 Q_REVISION(11) void mapObjectsChanged();
235 void visibleAreaChanged();
236 Q_REVISION(14) void visibleRegionChanged();
237
238protected:
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
273private 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
281private:
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
291private:
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
343QT_END_NAMESPACE
344
345QML_DECLARE_TYPE(QDeclarativeGeoMap)
346
347#endif
348

source code of qtlocation/src/location/declarativemaps/qdeclarativegeomap_p.h