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 #include "qgeomap_p.h"
38 #include "qgeomap_p_p.h"
39 #include "qgeocameracapabilities_p.h"
40 #include "qgeomappingmanagerengine_p.h"
41 #include "qdeclarativegeomapitembase_p.h"
42 #include "qgeomapobject_p.h"
43 #include "qgeomapobject_p_p.h"
44 #include <QtQuick/private/qquickitem_p.h>
45 #include <QDebug>
46 #include <QRectF>
47
48 QT_BEGIN_NAMESPACE
49
QGeoMap(QGeoMapPrivate & dd,QObject * parent)50 QGeoMap::QGeoMap(QGeoMapPrivate &dd, QObject *parent)
51 : QObject(dd,parent)
52 {
53 }
54
~QGeoMap()55 QGeoMap::~QGeoMap()
56 {
57 Q_D(QGeoMap);
58 clearParameters();
59 for (QGeoMapObject *p : d->mapObjects())
60 p->setMap(nullptr); // forces replacing pimpls with the default ones.
61 }
62
setViewportSize(const QSize & size)63 void QGeoMap::setViewportSize(const QSize& size)
64 {
65 Q_D(QGeoMap);
66 if (size == d->m_viewportSize)
67 return;
68 d->m_viewportSize = size;
69 d->m_geoProjection->setViewportSize(size);
70 d->changeViewportSize(size);
71 }
72
viewportSize() const73 QSize QGeoMap::viewportSize() const
74 {
75 Q_D(const QGeoMap);
76 return d->m_viewportSize;
77 }
78
viewportWidth() const79 int QGeoMap::viewportWidth() const
80 {
81 Q_D(const QGeoMap);
82 return d->m_viewportSize.width();
83 }
84
viewportHeight() const85 int QGeoMap::viewportHeight() const
86 {
87 Q_D(const QGeoMap);
88 return d->m_viewportSize.height();
89 }
90
setCameraData(const QGeoCameraData & cameraData)91 void QGeoMap::setCameraData(const QGeoCameraData &cameraData)
92 {
93 Q_D(QGeoMap);
94 if (cameraData == d->m_cameraData)
95 return;
96 d->m_cameraData = cameraData;
97 d->m_geoProjection->setCameraData(cameraData, false);
98 d->changeCameraData(cameraData);
99 emit cameraDataChanged(d->m_cameraData);
100 }
101
setCameraCapabilities(const QGeoCameraCapabilities & cameraCapabilities)102 void QGeoMap::setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities)
103 {
104 Q_D(QGeoMap);
105 d->setCameraCapabilities(cameraCapabilities);
106 }
107
handleEvent(QEvent * event)108 bool QGeoMap::handleEvent(QEvent *event)
109 {
110 Q_UNUSED(event);
111 return false;
112 }
113
setBearing(qreal bearing,const QGeoCoordinate & coordinate)114 bool QGeoMap::setBearing(qreal bearing, const QGeoCoordinate &coordinate) //FIXME visibleArea
115 {
116 Q_D(QGeoMap);
117 bool res = d->m_geoProjection->setBearing(bearing, coordinate);
118 if (!res)
119 return false;
120
121 setCameraData(geoProjection().cameraData());
122 return true;
123 }
124
anchorCoordinateToPoint(const QGeoCoordinate & coordinate,const QPointF & anchorPoint)125 bool QGeoMap::anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint)
126 {
127 Q_D(QGeoMap);
128 QGeoCoordinate newCenter = geoProjection().anchorCoordinateToPoint(coordinate, anchorPoint);
129 newCenter.setLatitude(qBound(d->m_minimumViewportLatitude, newCenter.latitude(), d->m_maximumViewportLatitude));
130 QGeoCameraData data = cameraData();
131 if (data.center() != newCenter) {
132 data.setCenter(newCenter);
133 setCameraData(data);
134 return true;
135 }
136 return false;
137 }
138
fitViewportToGeoRectangle(const QGeoRectangle & rectangle,const QMargins & borders)139 bool QGeoMap::fitViewportToGeoRectangle(const QGeoRectangle &rectangle, const QMargins &borders)
140 {
141 Q_UNUSED(rectangle);
142 Q_UNUSED(borders);
143 return false;
144 }
145
visibleRegion() const146 QGeoShape QGeoMap::visibleRegion() const
147 {
148 return geoProjection().visibleRegion();
149 }
150
cameraData() const151 const QGeoCameraData &QGeoMap::cameraData() const
152 {
153 Q_D(const QGeoMap);
154 return d->m_cameraData;
155 }
156
setActiveMapType(const QGeoMapType type)157 void QGeoMap::setActiveMapType(const QGeoMapType type)
158 {
159 Q_D(QGeoMap);
160 if (type == d->m_activeMapType)
161 return;
162 d->m_activeMapType = type;
163 d->setCameraCapabilities(d->m_engine->cameraCapabilities(type.mapId())); // emits
164 d->changeActiveMapType(type);
165 emit activeMapTypeChanged();
166 }
167
activeMapType() const168 const QGeoMapType QGeoMap::activeMapType() const
169 {
170 Q_D(const QGeoMap);
171 return d->m_activeMapType;
172 }
173
minimumZoom() const174 double QGeoMap::minimumZoom() const
175 {
176 Q_D(const QGeoMap);
177 return d->m_geoProjection->minimumZoom();
178 }
179
maximumCenterLatitudeAtZoom(const QGeoCameraData & cameraData) const180 double QGeoMap::maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
181 {
182 Q_D(const QGeoMap);
183 return d->maximumCenterLatitudeAtZoom(cameraData);
184 }
185
minimumCenterLatitudeAtZoom(const QGeoCameraData & cameraData) const186 double QGeoMap::minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
187 {
188 Q_D(const QGeoMap);
189 return d->minimumCenterLatitudeAtZoom(cameraData);
190 }
191
mapWidth() const192 double QGeoMap::mapWidth() const
193 {
194 Q_D(const QGeoMap);
195 return d->mapWidth();
196 }
197
mapHeight() const198 double QGeoMap::mapHeight() const
199 {
200 Q_D(const QGeoMap);
201 return d->mapHeight();
202 }
203
geoProjection() const204 const QGeoProjection &QGeoMap::geoProjection() const
205 {
206 Q_D(const QGeoMap);
207 return *(d->m_geoProjection);
208 }
209
cameraCapabilities() const210 QGeoCameraCapabilities QGeoMap::cameraCapabilities() const
211 {
212 Q_D(const QGeoMap);
213 return d->m_cameraCapabilities;
214 }
215
capabilities() const216 QGeoMap::Capabilities QGeoMap::capabilities() const
217 {
218 return Capabilities(QGeoMap::SupportsNothing);
219 }
220
prefetchData()221 void QGeoMap::prefetchData()
222 {
223
224 }
225
clearData()226 void QGeoMap::clearData()
227 {
228
229 }
230
addParameter(QGeoMapParameter * param)231 void QGeoMap::addParameter(QGeoMapParameter *param)
232 {
233 Q_D(QGeoMap);
234 if (param && !d->m_mapParameters.contains(param)) {
235 d->m_mapParameters.append(param);
236 d->addParameter(param);
237 }
238 }
239
removeParameter(QGeoMapParameter * param)240 void QGeoMap::removeParameter(QGeoMapParameter *param)
241 {
242 Q_D(QGeoMap);
243 if (param && d->m_mapParameters.contains(param)) {
244 d->removeParameter(param);
245 d->m_mapParameters.removeOne(param);
246 }
247 }
248
clearParameters()249 void QGeoMap::clearParameters()
250 {
251 Q_D(QGeoMap);
252 for (QGeoMapParameter *p : qAsConst(d->m_mapParameters))
253 d->removeParameter(p);
254 d->m_mapParameters.clear();
255 }
256
supportedMapItemTypes() const257 QGeoMap::ItemTypes QGeoMap::supportedMapItemTypes() const
258 {
259 Q_D(const QGeoMap);
260 return d->supportedMapItemTypes();
261 }
262
addMapItem(QDeclarativeGeoMapItemBase * item)263 void QGeoMap::addMapItem(QDeclarativeGeoMapItemBase *item)
264 {
265 Q_D(QGeoMap);
266 if (item && !d->m_mapItems.contains(item) && d->supportedMapItemTypes() & item->itemType()) {
267 d->m_mapItems.append(item);
268 d->addMapItem(item);
269 }
270 }
271
removeMapItem(QDeclarativeGeoMapItemBase * item)272 void QGeoMap::removeMapItem(QDeclarativeGeoMapItemBase *item)
273 {
274 Q_D(QGeoMap);
275 if (item && d->m_mapItems.contains(item)) {
276 d->removeMapItem(item);
277 d->m_mapItems.removeOne(item);
278 }
279 }
280
clearMapItems()281 void QGeoMap::clearMapItems()
282 {
283 Q_D(QGeoMap);
284 for (QDeclarativeGeoMapItemBase *p : d->m_mapItems)
285 d->removeMapItem(p);
286 d->m_mapItems.clear();
287 }
288
289 /*!
290 Fills obj with a backend-specific pimpl.
291 */
createMapObjectImplementation(QGeoMapObject * obj)292 bool QGeoMap::createMapObjectImplementation(QGeoMapObject *obj)
293 {
294 Q_D(QGeoMap);
295 QExplicitlySharedDataPointer<QGeoMapObjectPrivate> pimpl =
296 QExplicitlySharedDataPointer<QGeoMapObjectPrivate>(d->createMapObjectImplementation(obj));
297 if (pimpl.constData())
298 return obj->setImplementation(pimpl);
299 return false;
300 }
301
302 /*!
303 To be called in ~QGeoMapObjectPrivate overrides, if needed
304 */
removeMapObject(QGeoMapObject *)305 void QGeoMap::removeMapObject(QGeoMapObject * /*obj*/)
306 {
307 }
308
mapObjectsAt(const QGeoCoordinate &) const309 QList<QObject *> QGeoMap::mapObjectsAt(const QGeoCoordinate &/*coordinate*/) const
310 {
311 return QList<QObject *>();
312 }
313
setItemToWindowTransform(const QTransform & itemToWindowTransform)314 void QGeoMap::setItemToWindowTransform(const QTransform &itemToWindowTransform)
315 {
316 Q_D(QGeoMap);
317 d->m_geoProjection->setItemToWindowTransform(itemToWindowTransform);
318 }
319
setVisibleArea(const QRectF & visibleArea)320 void QGeoMap::setVisibleArea(const QRectF &visibleArea)
321 {
322 Q_D(QGeoMap);
323 const QRectF &va = d->visibleArea();
324 d->setVisibleArea(visibleArea);
325 if (va != d->visibleArea())
326 emit visibleAreaChanged();
327 }
328
visibleArea() const329 QRectF QGeoMap::visibleArea() const
330 {
331 Q_D(const QGeoMap);
332 return d->visibleArea();
333 }
334
mapObjects() const335 QList<QGeoMapObject *> QGeoMap::mapObjects() const
336 {
337 Q_D(const QGeoMap);
338 return d->mapObjects();
339 }
340
copyrightsStyleSheet() const341 QString QGeoMap::copyrightsStyleSheet() const
342 {
343 return QStringLiteral("#copyright-root { background: rgba(255, 255, 255, 128) }");
344 }
345
setAcceptedGestures(bool pan,bool flick,bool pinch,bool rotate,bool tilt)346 void QGeoMap::setAcceptedGestures(bool pan, bool flick, bool pinch, bool rotate, bool tilt)
347 {
348 Q_UNUSED(pan);
349 Q_UNUSED(flick);
350 Q_UNUSED(pinch);
351 Q_UNUSED(rotate);
352 Q_UNUSED(tilt);
353 }
354
setCopyrightVisible(bool visible)355 void QGeoMap::setCopyrightVisible(bool visible)
356 {
357 Q_D(QGeoMap);
358 if (d->m_copyrightVisible == visible)
359 return;
360
361 d->m_copyrightVisible = visible;
362 }
363
QGeoMapPrivate(QGeoMappingManagerEngine * engine,QGeoProjection * geoProjection)364 QGeoMapPrivate::QGeoMapPrivate(QGeoMappingManagerEngine *engine, QGeoProjection *geoProjection)
365 : QObjectPrivate(),
366 m_geoProjection(geoProjection),
367 m_engine(engine),
368 m_activeMapType(QGeoMapType())
369 {
370 // Setting the default camera caps without emitting anything
371 if (engine)
372 m_cameraCapabilities = m_engine->cameraCapabilities(m_activeMapType.mapId());
373 }
374
~QGeoMapPrivate()375 QGeoMapPrivate::~QGeoMapPrivate()
376 {
377 if (m_geoProjection)
378 delete m_geoProjection;
379 }
380
setCameraCapabilities(const QGeoCameraCapabilities & cameraCapabilities)381 void QGeoMapPrivate::setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities)
382 {
383 Q_Q(QGeoMap);
384 if (m_cameraCapabilities == cameraCapabilities)
385 return;
386 QGeoCameraCapabilities oldCaps = m_cameraCapabilities;
387 m_cameraCapabilities = cameraCapabilities;
388 emit q->cameraCapabilitiesChanged(oldCaps);
389 }
390
cameraCapabilities() const391 const QGeoCameraCapabilities &QGeoMapPrivate::cameraCapabilities() const
392 {
393 return m_cameraCapabilities;
394 }
395
get(const QGeoMap & map)396 const QGeoMapPrivate *QGeoMapPrivate::get(const QGeoMap &map)
397 {
398 return map.d_func();
399 }
400
addParameter(QGeoMapParameter * param)401 void QGeoMapPrivate::addParameter(QGeoMapParameter *param)
402 {
403 Q_UNUSED(param);
404 }
405
removeParameter(QGeoMapParameter * param)406 void QGeoMapPrivate::removeParameter(QGeoMapParameter *param)
407 {
408 Q_UNUSED(param);
409 }
410
supportedMapItemTypes() const411 QGeoMap::ItemTypes QGeoMapPrivate::supportedMapItemTypes() const
412 {
413 return QGeoMap::NoItem;
414 }
415
addMapItem(QDeclarativeGeoMapItemBase * item)416 void QGeoMapPrivate::addMapItem(QDeclarativeGeoMapItemBase *item)
417 {
418 Q_UNUSED(item);
419 }
420
removeMapItem(QDeclarativeGeoMapItemBase * item)421 void QGeoMapPrivate::removeMapItem(QDeclarativeGeoMapItemBase *item)
422 {
423 Q_UNUSED(item);
424 }
425
createMapObjectImplementation(QGeoMapObject * obj)426 QGeoMapObjectPrivate *QGeoMapPrivate::createMapObjectImplementation(QGeoMapObject *obj)
427 {
428 Q_UNUSED(obj);
429 return nullptr;
430 }
431
mapObjects() const432 QList<QGeoMapObject *> QGeoMapPrivate::mapObjects() const
433 {
434 return QList<QGeoMapObject *>();
435 }
436
mapWidth() const437 double QGeoMapPrivate::mapWidth() const
438 {
439 if (m_geoProjection->projectionType() == QGeoProjection::ProjectionWebMercator)
440 return static_cast<const QGeoProjectionWebMercator *>(m_geoProjection)->mapWidth();
441 return 0; // override this for maps supporting other projections
442 }
443
mapHeight() const444 double QGeoMapPrivate::mapHeight() const
445 {
446 if (m_geoProjection->projectionType() == QGeoProjection::ProjectionWebMercator)
447 return static_cast<const QGeoProjectionWebMercator *>(m_geoProjection)->mapHeight();
448 return 0; // override this for maps supporting other projections
449 }
450
setCopyrightVisible(bool visible)451 void QGeoMapPrivate::setCopyrightVisible(bool visible)
452 {
453 m_copyrightVisible = visible;
454 }
455
copyrightVisible() const456 bool QGeoMapPrivate::copyrightVisible() const
457 {
458 return m_copyrightVisible;
459 }
460
maximumCenterLatitudeAtZoom(const QGeoCameraData & cameraData) const461 double QGeoMapPrivate::maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
462 {
463 m_maximumViewportLatitude = m_geoProjection->maximumCenterLatitudeAtZoom(cameraData);
464 return m_maximumViewportLatitude;
465 }
466
minimumCenterLatitudeAtZoom(const QGeoCameraData & cameraData) const467 double QGeoMapPrivate::minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
468 {
469 m_minimumViewportLatitude = m_geoProjection->minimumCenterLatitudeAtZoom(cameraData);
470 return m_minimumViewportLatitude;
471 }
472
setVisibleArea(const QRectF &)473 void QGeoMapPrivate::setVisibleArea(const QRectF &/*visibleArea*/)
474 {
475
476 }
477
visibleArea() const478 QRectF QGeoMapPrivate::visibleArea() const
479 {
480 return QRectF();
481 }
482
clampVisibleArea(const QRectF & visibleArea) const483 QRectF QGeoMapPrivate::clampVisibleArea(const QRectF &visibleArea) const
484 {
485 qreal xp = qMin<qreal>(visibleArea.x(), qMax(m_viewportSize.width() - 1, 0));
486 qreal yp = qMin<qreal>(visibleArea.y(), qMax(m_viewportSize.height() - 1, 0));
487 qreal w = qMin<qreal>(visibleArea.width(), qMax<qreal>(m_viewportSize.width() - xp, 0));
488 qreal h = qMin<qreal>(visibleArea.height(), qMax<qreal>(m_viewportSize.height() - yp, 0));
489 return QRectF(xp, yp, w, h);
490 }
491
492 QT_END_NAMESPACE
493