Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qdeclarativegeomap.cpp
Go to the documentation of this file.
1// Copyright (C) 2015 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
10#include "qgeomap_p.h"
11#include "qgeoprojection_p.h"
12#include <QtPositioning/QGeoCircle>
13#include <QtPositioning/QGeoRectangle>
14#include <QtPositioning/QGeoPath>
15#include <QtPositioning/QGeoPolygon>
16#include <QtQuick/QQuickWindow>
17#include <QtQuick/QSGRectangleNode>
18#include <QtQml/qqmlinfo.h>
19#include <QtQuick/private/qquickitem_p.h>
20#include <cmath>
21
22#ifndef M_PI
23#define M_PI 3.141592653589793238463
24#endif
25
26
28
30{
31 bearing = std::fmod(bearing, qreal(360.0));
32 if (bearing < 0.0)
33 bearing += 360.0;
34
35 return bearing;
36}
37
127 : QQuickItem(parent)
128{
130
131 m_activeMapType = QGeoMapType(QGeoMapType::NoMap,
132 tr("No Map"),
133 tr("No Map"),
134 false, false,
135 0,
138 m_cameraData.setCenter(QGeoCoordinate(51.5073,-0.1277)); //London city center
139 m_cameraData.setZoomLevel(8.0);
140
141 m_cameraCapabilities.setTileSize(256);
142 m_cameraCapabilities.setSupportsBearing(true);
143 m_cameraCapabilities.setSupportsTilting(true);
144 m_cameraCapabilities.setMinimumZoomLevel(0);
145 m_cameraCapabilities.setMaximumZoomLevel(30);
146 m_cameraCapabilities.setMinimumTilt(0);
147 m_cameraCapabilities.setMaximumTilt(89.5);
148 m_cameraCapabilities.setMinimumFieldOfView(1);
149 m_cameraCapabilities.setMaximumFieldOfView(179);
150
151 m_minimumZoomLevel = m_cameraCapabilities.minimumZoomLevel();
152 m_maximumZoomLevel = m_cameraCapabilities.maximumZoomLevel();
153 m_minimumTilt = m_cameraCapabilities.minimumTilt();
154 m_maximumTilt = m_cameraCapabilities.maximumTilt();
155 m_minimumFieldOfView = m_cameraCapabilities.minimumFieldOfView();
156 m_maximumFieldOfView = m_cameraCapabilities.maximumFieldOfView();
157}
158
160{
161 // Removing map items from m_map
162 if (m_map) {
163 m_map->clearMapItems();
164 }
165
166 // Remove the items from the map, making them deletable.
167 // Go in the same order as in removeMapChild: views, groups, then items
168 if (!m_mapViews.isEmpty()) {
169 const auto mapViews = m_mapViews;
170 for (QDeclarativeGeoMapItemView *v : mapViews) { // so that removeMapItemView_real can safely modify m_mapViews;
171 if (!v)
172 continue;
173
175 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(parent);
176 if (group)
177 continue; // Ignore non-top-level MIVs. They will be recursively processed.
178 // Identify them as being parented by a MapItemGroup.
179
181 }
182 }
183
184 if (!m_mapItemGroups.isEmpty()) {
185 const auto mapGroups = m_mapItemGroups;
186 for (QDeclarativeGeoMapItemGroup *g : mapGroups) {
187 if (!g)
188 continue;
189
191 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(parent);
192 if (group)
193 continue; // Ignore non-top-level Groups. They will be recursively processed.
194 // Identify them as being parented by a MapItemGroup.
195
197 }
198 }
199
200 // remove any remaining map items associations
201 const auto mapItems = m_mapItems;
202 for (auto mi: mapItems)
203 removeMapItem_real(mi.data());
204
205 if (m_copyrights.data())
206 delete m_copyrights.data();
207 m_copyrights.clear();
208
209 delete m_map; // map objects get reset here
210}
211
212void QDeclarativeGeoMap::onSupportedMapTypesChanged()
213{
214 m_supportedMapTypes = m_mappingManager->supportedMapTypes();
215 if (m_supportedMapTypes.isEmpty()) {
216 m_map->setActiveMapType(QGeoMapType()); // no supported map types: setting an invalid one
217 } else if (!m_supportedMapTypes.contains(m_map->activeMapType())) {
218 QGeoMapType type = m_supportedMapTypes.at(0);
219 m_activeMapType = type;
220 m_map->setActiveMapType(type);
221 }
222
224}
225
227{
228 if (m_error == error && m_errorString == errorString)
229 return;
230 m_error = error;
231 m_errorString = errorString;
233}
234
240{
241 // try to keep change signals in the end
242 bool visibleAreaHasChanged = false;
243
244 QGeoCoordinate center = m_cameraData.center();
245
246 setMinimumZoomLevel(m_map->minimumZoom(), false);
247
248 double bearing = m_cameraData.bearing();
249 double tilt = m_cameraData.tilt();
250 double fov = m_cameraData.fieldOfView(); // Must be 45.0
251 QGeoCameraData cameraData = m_cameraData;
252
253 if (!m_cameraCapabilities.supportsBearing() && bearing != 0.0)
254 cameraData.setBearing(0);
255
256 if (!m_cameraCapabilities.supportsTilting() && tilt != 0.0)
257 cameraData.setTilt(0);
258
259 m_map->setVisibleArea(m_visibleArea);
260 if (m_map->visibleArea() != m_visibleArea)
261 visibleAreaHasChanged = true;
262
263 cameraData.setFieldOfView(qBound(m_cameraCapabilities.minimumFieldOfView(),
264 fov,
265 m_cameraCapabilities.maximumFieldOfView()));
266
267 // set latitude boundary check
268 m_maximumViewportLatitude = m_map->maximumCenterLatitudeAtZoom(cameraData);
269 m_minimumViewportLatitude = m_map->minimumCenterLatitudeAtZoom(cameraData);
270
271 center.setLatitude(qBound(m_minimumViewportLatitude, center.latitude(), m_maximumViewportLatitude));
272 cameraData.setCenter(center);
273
275 this, &QDeclarativeGeoMap::onCameraDataChanged);
276 m_map->setCameraData(cameraData); // This normally triggers property changed signals.
277 // BUT not in this case, since m_cameraData is already == cameraData.
278 // So, emit visibleRegionChanged() separately, as
279 // the effective visible region becomes available only now.
280
281 m_initialized = true;
282
283 if (visibleAreaHasChanged)
286
287 emit mapReadyChanged(true);
288 emit visibleRegionChanged();
289
290 if (m_copyrights) // To not update during initialize()
291 update();
292}
293
297void QDeclarativeGeoMap::pluginReady()
298{
299 QGeoServiceProvider *provider = m_plugin->sharedGeoServiceProvider();
300 m_mappingManager = provider->mappingManager();
301
302 if (provider->mappingError() != QGeoServiceProvider::NoError) {
303 setError(provider->mappingError(), provider->mappingErrorString());
304 return;
305 }
306
307 if (!m_mappingManager) {
308 //TODO Should really be EngineNotSetError (see QML GeoCodeModel)
309 setError(QGeoServiceProvider::NotSupportedError, tr("Plugin does not support mapping."));
310 return;
311 }
312
313 if (!m_mappingManager->isInitialized()) {
314 connect(m_mappingManager, &QGeoMappingManager::initialized,
315 this, &QDeclarativeGeoMap::mappingManagerInitialized);
316 } else {
317 mappingManagerInitialized();
318 }
319
320 // make sure this is only called once
322 this, &QDeclarativeGeoMap::pluginReady);
323}
324
329{
330 m_componentCompleted = true;
331 populateMap();
333}
334
340void QDeclarativeGeoMap::populateMap()
341{
342 QSet<QObject *> kids(children().cbegin(), children().cend());
343 const QList<QQuickItem *> quickKids = childItems();
344 for (QQuickItem *ite: quickKids)
345 kids.insert(ite);
346
347 for (QObject *k : std::as_const(kids)) {
348 addMapChild(k);
349 }
350}
351
355void QDeclarativeGeoMap::setupMapView(QDeclarativeGeoMapItemView *view)
356{
357 view->setMap(this);
358}
359
364{
365 if (!m_map) {
366 delete oldNode;
367 return nullptr;
368 }
369
370 QSGRectangleNode *root = static_cast<QSGRectangleNode *>(oldNode);
371 if (!root)
372 root = window()->createRectangleNode();
373
374 root->setRect(boundingRect());
375 root->setColor(m_color);
376
377 QSGNode *content = root->childCount() ? root->firstChild() : 0;
378 content = m_map->updateSceneGraph(content, window());
379 if (content && root->childCount() == 0)
380 root->appendChildNode(content);
381
382 return root;
383}
384
395{
396 if (m_plugin) {
397 qmlWarning(this) << QStringLiteral("Plugin is a write-once property, and cannot be set again.");
398 return;
399 }
400 m_plugin = plugin;
401 emit pluginChanged(m_plugin);
402
403 if (m_plugin->isAttached()) {
404 pluginReady();
405 } else {
407 this, &QDeclarativeGeoMap::pluginReady);
408 }
409}
410
414void QDeclarativeGeoMap::onCameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities)
415{
416 if (m_map->cameraCapabilities() == oldCameraCapabilities)
417 return;
418
419 m_cameraCapabilities = m_map->cameraCapabilities();
420
421 setMaximumZoomLevel(m_cameraCapabilities.maximumZoomLevel(), false);
422 setMinimumZoomLevel(m_cameraCapabilities.minimumZoomLevel(), false);
423 setMinimumTilt(m_cameraCapabilities.minimumTilt(), false);
424 setMaximumTilt(m_cameraCapabilities.maximumTilt(), false);
425 setMinimumFieldOfView(m_cameraCapabilities.minimumFieldOfView(), false);
426 setMaximumFieldOfView(m_cameraCapabilities.maximumFieldOfView(), false);
427}
428
433void QDeclarativeGeoMap::mappingManagerInitialized()
434{
435 m_map = m_mappingManager->createMap(this);
436
437 if (!m_map)
438 return;
439
440 // Any map items that were added before the plugin was ready
441 // need to have setMap called again
442 for (const QPointer<QDeclarativeGeoMapItemBase> &item : std::as_const(m_mapItems)) {
443 if (item) {
444 item->setMap(this, m_map);
445 m_map->addMapItem(item.data()); // m_map filters out what is not supported.
446 }
447 }
448
449 /* COPY NOTICE SETUP */
450 m_copyrights = new QDeclarativeGeoMapCopyrightNotice(this);
451 m_copyrights->setCopyrightsZ(m_maxChildZ + 1);
452 m_copyrights->setCopyrightsVisible(m_copyrightsVisible);
453 m_copyrights->setMapSource(this);
454
455 m_supportedMapTypes = m_mappingManager->supportedMapTypes();
456
457 if (m_activeMapType != QGeoMapType() && m_plugin->name().toLatin1() == m_activeMapType.pluginName()) {
458 m_map->setActiveMapType(m_activeMapType);
459 } else {
460 if (!m_supportedMapTypes.isEmpty()) {
461 m_activeMapType = m_supportedMapTypes.at(0);
462 m_map->setActiveMapType(m_activeMapType);
463 } else {
464 m_activeMapType = QGeoMapType(QGeoMapType::NoMap,
465 tr("No Map"),
466 tr("No Map"),
467 false,
468 false,
469 0,
472 }
473 }
474
475 // Update camera capabilities
476 onCameraCapabilitiesChanged(m_cameraCapabilities);
477
478 // Map tiles are built in this call. m_map->minimumZoom() becomes operational
479 // after this has been called at least once, after creation.
480 // However, getting into the following block may fire a copyrightsChanged that would get lost,
481 // as the connections are set up after.
482 QString copyrightString;
483 QImage copyrightImage;
484 if (!m_initialized && width() > 0 && height() > 0) {
485 QMetaObject::Connection copyrightStringCatcherConnection =
487 [&copyrightString](const QString &copy){ copyrightString = copy; });
488 QMetaObject::Connection copyrightImageCatcherConnection =
490 [&copyrightImage](const QImage &copy){ copyrightImage = copy; });
491 m_map->setViewportSize(QSize(width(), height()));
492 initialize(); // This emits the caught signals above
493 QObject::disconnect(copyrightStringCatcherConnection);
494 QObject::disconnect(copyrightImageCatcherConnection);
495 }
496
497
498 /* COPYRIGHT SIGNALS REWIRING */
503 if (!copyrightString.isEmpty())
504 emit m_map->copyrightsChanged(copyrightString);
505 else if (!copyrightImage.isNull())
506 emit m_map->copyrightsImageChanged(copyrightImage);
507
508 m_window = window();
509 if (m_window) {
512 }
515 this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged);
516
517 // This prefetches a buffer around the map
518 m_map->prefetchData();
519
521 this, &QDeclarativeGeoMap::onSupportedMapTypesChanged);
526
527 // Any map item groups that were added before the plugin was ready
528 // DO NOT need to have setMap called again on their children map items
529 // because they have been added to m_mapItems, which is processed right above.
530
531 if (m_initialized)
532 update();
533}
534
539{
540 return m_plugin;
541}
542
550void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet)
551{
552 if (minimumZoomLevel >= 0) {
553 qreal oldMinimumZoomLevel = this->minimumZoomLevel();
554
555 if (userSet)
556 m_userMinimumZoomLevel = minimumZoomLevel;
557 else
558 m_minimumZoomLevel = minimumZoomLevel;
559
562
563 if (oldMinimumZoomLevel != this->minimumZoomLevel())
565 }
566}
567
583{
584 return qMax(qMin(m_maximumZoomLevel, m_userMinimumZoomLevel), m_minimumZoomLevel);
585}
586
592void QDeclarativeGeoMap::setMaximumZoomLevel(qreal maximumZoomLevel, bool userSet)
593{
594 if (maximumZoomLevel >= 0) {
595 qreal oldMaximumZoomLevel = this->maximumZoomLevel();
596
597 if (userSet)
598 m_userMaximumZoomLevel = maximumZoomLevel;
599 else
600 m_maximumZoomLevel = maximumZoomLevel;
601
604
605 if (oldMaximumZoomLevel != this->maximumZoomLevel())
607 }
608}
609
620{
621 return qMin(qMax(m_minimumZoomLevel, m_userMaximumZoomLevel), m_maximumZoomLevel);
622}
623
635{
636 return setZoomLevel(zoomLevel, m_cameraCapabilities.overzoomEnabled());
637}
638
649void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom)
650{
651 if (zoomLevel < 0)
652 return;
653
654 if (m_initialized) {
655 QGeoCameraData cameraData = m_map->cameraData();
656 if (cameraData.zoomLevel() == zoomLevel)
657 return;
658
659 cameraData.setZoomLevel(qBound<qreal>(overzoom ? m_map->minimumZoom() : m_cameraCapabilities.minimumZoomLevel(),
660 zoomLevel,
661 overzoom ? 30 : maximumZoomLevel()));
662 m_maximumViewportLatitude = m_map->maximumCenterLatitudeAtZoom(cameraData);
663 m_minimumViewportLatitude = m_map->minimumCenterLatitudeAtZoom(cameraData);
664 QGeoCoordinate coord = cameraData.center();
665 coord.setLatitude(qBound(m_minimumViewportLatitude, coord.latitude(), m_maximumViewportLatitude));
666 cameraData.setCenter(coord);
667 m_map->setCameraData(cameraData);
668 } else {
669 const bool zlHasChanged = zoomLevel != m_cameraData.zoomLevel();
670 m_cameraData.setZoomLevel(zoomLevel);
671 if (zlHasChanged) {
673 // do not emit visibleRegionChanged() here, because, if the map isn't initialized,
674 // the getter won't return anything updated
675 }
676 }
677}
678
680{
681 // dispatch items appropriately
682 QDeclarativeGeoMapItemView *mapView = qobject_cast<QDeclarativeGeoMapItemView *>(child);
683 if (mapView)
684 return addMapItemView_real(mapView);
685
686 QDeclarativeGeoMapItemGroup *itemGroup = qobject_cast<QDeclarativeGeoMapItemGroup *>(child);
687 if (itemGroup) // addMapItemView calls addMapItemGroup
688 return addMapItemGroup_real(itemGroup);
689
690 QDeclarativeGeoMapItemBase *mapItem = qobject_cast<QDeclarativeGeoMapItemBase *>(child);
691 if (mapItem)
692 return addMapItem_real(mapItem);
693
694 return false;
695}
696
698{
699 // dispatch items appropriately
700 QDeclarativeGeoMapItemView *mapView = qobject_cast<QDeclarativeGeoMapItemView *>(child);
701 if (mapView)
702 return removeMapItemView_real(mapView);
703
704 QDeclarativeGeoMapItemGroup *itemGroup = qobject_cast<QDeclarativeGeoMapItemGroup *>(child);
705 if (itemGroup) // removeMapItemView calls removeMapItemGroup for itself.
706 return removeMapItemGroup_real(itemGroup);
707
708 QDeclarativeGeoMapItemBase *mapItem = qobject_cast<QDeclarativeGeoMapItemBase *>(child);
709 if (mapItem)
710 return removeMapItem_real(mapItem);
711
712 return false;
713}
714
716{
718 // Nested groups have parent set in parent's componentComplete()
719 // Those instantiated by MapItemView's delegateModel, however, do not,
720 // but have setParentItem set.
721 return qobject_cast<QDeclarativeGeoMapItemGroup *>(parent)
722 || qobject_cast<QDeclarativeGeoMapItemGroup *>(group->parentItem());
723}
724
726{
727 if (m_initialized)
728 return m_map->cameraData().zoomLevel();
729 return m_cameraData.zoomLevel();
730}
731
743{
745 if (m_initialized) {
746 QGeoCameraData cameraData = m_map->cameraData();
747 cameraData.setBearing(bearing);
748 m_map->setCameraData(cameraData);
749 } else {
750 const bool bearingHasChanged = bearing != m_cameraData.bearing();
751 m_cameraData.setBearing(bearing);
752 if (bearingHasChanged) {
754 // do not emit visibleRegionChanged() here, because, if the map isn't initialized,
755 // the getter won't return anything updated
756 }
757 }
758}
759
773{
774 if (!m_initialized)
775 return;
776
777 const QGeoCoordinate currentCenter = center();
778 const qreal currentBearing = QDeclarativeGeoMap::bearing();
780
781 if (!coordinate.isValid()
782 || !qIsFinite(bearing)
783 || (coordinate == currentCenter && bearing == currentBearing))
784 return;
785
787 m_map->setBearing(bearing, coordinate);
788}
789
791{
792 if (m_initialized)
793 return m_map->cameraData().bearing();
794 return m_cameraData.bearing();
795}
796
810{
812
813 if (m_initialized) {
814 QGeoCameraData cameraData = m_map->cameraData();
815 cameraData.setTilt(tilt);
816 m_map->setCameraData(cameraData);
817 } else {
818 const bool tiltHasChanged = tilt != m_cameraData.tilt();
819 m_cameraData.setTilt(tilt);
820 if (tiltHasChanged) {
822 // do not emit visibleRegionChanged() here, because, if the map isn't initialized,
823 // the getter won't return anything updated
824 }
825 }
826}
827
829{
830 if (m_initialized)
831 return m_map->cameraData().tilt();
832 return m_cameraData.tilt();
833}
834
835void QDeclarativeGeoMap::setMinimumTilt(qreal minimumTilt, bool userSet)
836{
837 if (minimumTilt >= 0) {
838 qreal oldMinimumTilt = this->minimumTilt();
839
840 if (userSet)
841 m_userMinimumTilt = minimumTilt;
842 else
843 m_minimumTilt = minimumTilt;
844
845 if (tilt() < minimumTilt)
847
848 if (oldMinimumTilt != this->minimumTilt())
850 }
851}
852
870{
872
873 if (m_initialized) {
874 QGeoCameraData cameraData = m_map->cameraData();
875 cameraData.setFieldOfView(fieldOfView);
876 m_map->setCameraData(cameraData);
877 } else {
878 const bool fovChanged = fieldOfView != m_cameraData.fieldOfView();
879 m_cameraData.setFieldOfView(fieldOfView);
880 if (fovChanged) {
882 // do not emit visibleRegionChanged() here, because, if the map isn't initialized,
883 // the getter won't return anything updated
884 }
885 }
886}
887
889{
890 if (m_initialized)
891 return m_map->cameraData().fieldOfView();
892 return m_cameraData.fieldOfView();
893}
894
895void QDeclarativeGeoMap::setMinimumFieldOfView(qreal minimumFieldOfView, bool userSet)
896{
897 if (minimumFieldOfView > 0 && minimumFieldOfView < 180.0) {
898 qreal oldMinimumFoV = this->minimumFieldOfView();
899
900 if (userSet)
901 m_userMinimumFieldOfView = minimumFieldOfView;
902 else
903 m_minimumFieldOfView = minimumFieldOfView;
904
907
908 if (oldMinimumFoV != this->minimumFieldOfView())
910 }
911}
912
927{
928 return qMax(qMin(m_maximumFieldOfView, m_userMinimumFieldOfView), m_minimumFieldOfView);
929}
930
931void QDeclarativeGeoMap::setMaximumFieldOfView(qreal maximumFieldOfView, bool userSet)
932{
933 if (maximumFieldOfView > 0 && maximumFieldOfView < 180.0) {
934 qreal oldMaximumFoV = this->maximumFieldOfView();
935 if (userSet)
936 m_userMaximumFieldOfView = maximumFieldOfView;
937 else
938 m_maximumFieldOfView = maximumFieldOfView;
939
942
943 if (oldMaximumFoV != this->maximumFieldOfView())
945 }
946}
947
962{
963 return qMin(qMax(m_minimumFieldOfView, m_userMaximumFieldOfView), m_maximumFieldOfView);
964}
965
982{
983 return qMax(qMin(m_maximumTilt, m_userMinimumTilt), m_minimumTilt);
984}
985
986void QDeclarativeGeoMap::setMaximumTilt(qreal maximumTilt, bool userSet)
987{
988 if (maximumTilt >= 0) {
989 qreal oldMaximumTilt = this->maximumTilt();
990
991 if (userSet)
992 m_userMaximumTilt = maximumTilt;
993 else
994 m_maximumTilt = maximumTilt;
995
996 if (tilt() > maximumTilt)
998
999 if (oldMaximumTilt != this->maximumTilt())
1001 }
1002}
1003
1020{
1021 return qMin(qMax(m_minimumTilt, m_userMaximumTilt), m_maximumTilt);
1022}
1023
1033{
1034 if (!center.isValid())
1035 return;
1036
1037 if (m_initialized) {
1039 coord.setLatitude(qBound(m_minimumViewportLatitude, center.latitude(), m_maximumViewportLatitude));
1040 QGeoCameraData cameraData = m_map->cameraData();
1041 cameraData.setCenter(coord);
1042 m_map->setCameraData(cameraData);
1043 } else {
1044 const bool centerHasChanged = center != m_cameraData.center();
1045 m_cameraData.setCenter(center);
1046 if (centerHasChanged) {
1048 // do not emit visibleRegionChanged() here, because, if the map isn't initialized,
1049 // the getter won't return anything updated
1050 }
1051 }
1052}
1053
1055{
1056 if (m_initialized)
1057 return m_map->cameraData().center();
1058 return m_cameraData.center();
1059}
1060
1061
1081{
1082 if (shape.boundingGeoRectangle() == visibleRegion())
1083 return;
1084
1085 m_visibleRegion = shape.boundingGeoRectangle();
1086 if (!m_visibleRegion.isValid()
1087 || (m_visibleRegion.bottomRight().latitude() >= 85.0) // rect entirely outside web mercator
1088 || (m_visibleRegion.topLeft().latitude() <= -85.0)) {
1089 // shape invalidated -> nothing to fit anymore
1090 m_visibleRegion = QGeoRectangle();
1091 m_pendingFitViewport = false;
1092 emit visibleRegionChanged();
1093 return;
1094 }
1095
1096 if (!m_map || !width() || !height()) {
1097 m_pendingFitViewport = true;
1098 emit visibleRegionChanged();
1099 return;
1100 }
1101
1102 fitViewportToGeoShape(m_visibleRegion);
1103 emit visibleRegionChanged();
1104}
1105
1107{
1108 if (!m_map || !width() || !height())
1109 return m_visibleRegion;
1110
1112 return m_map->visibleRegion();
1113 } else {
1114 // ToDo: handle projections not supporting visible region in a better way.
1115 // This approach will fail when horizon is in the view or the map is greatly zoomed out.
1116 QList<QGeoCoordinate> visiblePoly;
1117 visiblePoly << m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(0,0), false);
1118 visiblePoly << m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(m_map->viewportWidth() - 1,
1119 0), false);
1120 visiblePoly << m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(m_map->viewportWidth() - 1,
1121 m_map->viewportHeight() - 1), false);
1122 visiblePoly << m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(0,
1123 m_map->viewportHeight() - 1), false);
1124 QGeoPath path;
1125 path.setPath(visiblePoly);
1126 return path.boundingGeoRectangle();
1127 }
1128}
1129
1142{
1143 if (m_copyrightsVisible == visible)
1144 return;
1145
1146 if (!m_copyrights.isNull())
1147 m_copyrights->setCopyrightsVisible(visible);
1148
1149 m_copyrightsVisible = visible;
1151}
1152
1154{
1155 return m_copyrightsVisible;
1156}
1157
1158
1159
1168{
1169 if (color != m_color) {
1170 m_color = color;
1171 update();
1172 emit colorChanged(m_color);
1173 }
1174}
1175
1177{
1178 return m_color;
1179}
1180
1192{
1193 if (m_initialized)
1194 return m_map->visibleArea();
1195 return m_visibleArea;
1196}
1197
1199{
1200 const QRectF oldVisibleArea = QDeclarativeGeoMap::visibleArea();
1201 if (visibleArea == oldVisibleArea)
1202 return;
1203
1204 if (!visibleArea.isValid() && !visibleArea.isEmpty()) // values < 0
1205 return;
1206
1207 if (m_initialized) {
1209 const QRectF newVisibleArea = QDeclarativeGeoMap::visibleArea();
1210 if (newVisibleArea != oldVisibleArea) {
1211 // polish map items
1212 for (const QPointer<QDeclarativeGeoMapItemBase> &i: std::as_const(m_mapItems)) {
1213 if (i)
1214 i->visibleAreaChanged();
1215 }
1216 }
1217 } else {
1218 m_visibleArea = visibleArea;
1219 const QRectF newVisibleArea = QDeclarativeGeoMap::visibleArea();
1220 if (newVisibleArea != oldVisibleArea)
1222 }
1223}
1224
1236{
1237 return m_initialized;
1238}
1239
1240QMargins QDeclarativeGeoMap::mapMargins() const
1241{
1242 const QRectF va = m_map->visibleArea();
1243 if (va.isEmpty())
1244 return QMargins();
1245 return QMargins( va.x()
1246 , va.y()
1247 , width() - va.width() - va.x()
1248 , height() - va.height() - va.y());
1249}
1250
1258QList<QGeoMapType> QDeclarativeGeoMap::supportedMapTypes()
1259{
1260 return m_supportedMapTypes;
1261}
1262
1282{
1283 if (!m_map || !(m_map->capabilities() & QGeoMap::SupportsAnchoringCoordinate))
1284 return;
1285
1286 if (!coordinate.isValid()
1287 || !qIsFinite(point.x())
1288 || !qIsFinite(point.y()))
1289 return;
1290
1291 m_map->anchorCoordinateToPoint(coordinate, point);
1292}
1293
1303{
1304 if (m_map)
1305 return m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(position), clipToViewPort);
1306 else
1307 return QGeoCoordinate();
1308}
1309
1318QPointF QDeclarativeGeoMap::fromCoordinate(const QGeoCoordinate &coordinate, bool clipToViewPort) const
1319{
1320 if (m_map)
1321 return m_map->geoProjection().coordinateToItemPosition(coordinate, clipToViewPort).toPointF();
1322 else
1323 return QPointF(qQNaN(), qQNaN());
1324}
1325
1337void QDeclarativeGeoMap::pan(int dx, int dy)
1338{
1339 if (!m_map)
1340 return;
1341 if (dx == 0 && dy == 0)
1342 return;
1343
1345 QDoubleVector2D(m_map->viewportWidth() / 2 + dx,
1346 m_map->viewportHeight() / 2 + dy));
1348}
1349
1350
1357{
1358 if (!m_map)
1359 return;
1360 m_map->prefetchData();
1361}
1362
1371{
1372 if (m_map)
1373 m_map->clearData();
1374}
1375
1389{
1390 QMargins m(10, 10, 10, 10); // lets defaults to 10 if margins is invalid
1391 switch (margins.typeId()) {
1392 case QMetaType::Int:
1393 case QMetaType::Double: {
1394 const int value = int(margins.toDouble());
1396 }
1397 break;
1398 // ToDo: Support distinct margins in some QML form. Perhaps QRect?
1399 default:
1400 break;
1401 }
1402 fitViewportToGeoShape(shape, m);
1403}
1404
1405void QDeclarativeGeoMap::fitViewportToGeoShape(const QGeoShape &shape, const QMargins &borders)
1406{
1407 if (!m_map || !shape.isValid())
1408 return;
1409
1411 // This case remains handled here, and not inside QGeoMap*::fitViewportToGeoRectangle,
1412 // in order to honor animations on center and zoomLevel
1413 const QMargins margins = borders + mapMargins();
1414 const QGeoProjectionWebMercator &p = static_cast<const QGeoProjectionWebMercator&>(m_map->geoProjection());
1415 const QPair<QGeoCoordinate, qreal> fitData = p.fitViewportToGeoRectangle(shape.boundingGeoRectangle(),
1416 margins);
1417 if (!fitData.first.isValid())
1418 return;
1419
1420 // position camera to the center of bounding box
1421 setProperty("center", QVariant::fromValue(fitData.first)); // not using setCenter(centerCoordinate) to honor a possible animation set on the center property
1422
1423 if (!qIsFinite(fitData.second))
1424 return;
1425 double newZoom = qMax<double>(minimumZoomLevel(), fitData.second);
1426 setProperty("zoomLevel", QVariant::fromValue(newZoom)); // not using setZoomLevel(newZoom) to honor a possible animation set on the zoomLevel property
1428 // Animations cannot be honored in this case, as m_map acts as a black box
1429 m_map->fitViewportToGeoRectangle(m_visibleRegion, borders);
1430 }
1431 // else out of luck
1432}
1433
1447{
1448 return m_errorString;
1449}
1450
1468{
1469 return m_error;
1470}
1471
1473{
1474 return m_map;
1475}
1476
1478{
1479 if (change == ItemChildAddedChange) {
1480 QQuickItem *child = value.item;
1481 QQuickItem *mapItem = qobject_cast<QDeclarativeGeoMapItemBase *>(child);
1482 if (!mapItem)
1483 mapItem = qobject_cast<QDeclarativeGeoMapItemGroup *>(child);
1484
1485 if (mapItem) {
1486 qreal z = mapItem->z();
1487 if (z > m_maxChildZ) { // Ignore children removal
1488 m_maxChildZ = z;
1489 // put the copyrights notice object at the highest z order
1490 if (m_copyrights)
1491 m_copyrights->setCopyrightsZ(m_maxChildZ + 1);
1492 }
1493 }
1494 } else if (change == ItemSceneChange) {
1495 if (m_window) {
1498 }
1499 m_window = value.window;
1500 if (m_window) {
1503 }
1504 }
1506}
1507
1508void QDeclarativeGeoMap::attachCopyrightNotice(bool initialVisibility)
1509{
1510 if (initialVisibility) {
1511 ++m_copyNoticesVisible;
1512 if (m_map)
1513 m_map->setCopyrightVisible(m_copyNoticesVisible > 0);
1514 }
1515}
1516
1517void QDeclarativeGeoMap::detachCopyrightNotice(bool currentVisibility)
1518{
1519 if (currentVisibility) {
1520 --m_copyNoticesVisible;
1521 if (m_map)
1522 m_map->setCopyrightVisible(m_copyNoticesVisible > 0);
1523 }
1524}
1525
1526void QDeclarativeGeoMap::onAttachedCopyrightNoticeVisibilityChanged()
1527{
1529 m_copyNoticesVisible += ( int(copy->copyrightsVisible()) * 2 - 1);
1530 if (m_map)
1531 m_map->setCopyrightVisible(m_copyNoticesVisible > 0);
1532}
1533
1534void QDeclarativeGeoMap::onCameraDataChanged(const QGeoCameraData &cameraData)
1535{
1536 bool centerHasChanged = cameraData.center() != m_cameraData.center();
1537 bool bearingHasChanged = cameraData.bearing() != m_cameraData.bearing();
1538 bool tiltHasChanged = cameraData.tilt() != m_cameraData.tilt();
1539 bool fovHasChanged = cameraData.fieldOfView() != m_cameraData.fieldOfView();
1540 bool zoomHasChanged = cameraData.zoomLevel() != m_cameraData.zoomLevel();
1541
1542 m_cameraData = cameraData;
1543 // polish map items
1544 for (const QPointer<QDeclarativeGeoMapItemBase> &i: std::as_const(m_mapItems)) {
1545 if (i)
1546 i->baseCameraDataChanged(m_cameraData); // Consider optimizing this further, removing the contained duplicate if conditions.
1547 }
1548
1549 if (centerHasChanged)
1550 emit centerChanged(m_cameraData.center());
1551 if (zoomHasChanged)
1552 emit zoomLevelChanged(m_cameraData.zoomLevel());
1553 if (bearingHasChanged)
1554 emit bearingChanged(m_cameraData.bearing());
1555 if (tiltHasChanged)
1556 emit tiltChanged(m_cameraData.tilt());
1557 if (fovHasChanged)
1558 emit fieldOfViewChanged(m_cameraData.fieldOfView());
1559 if (centerHasChanged || zoomHasChanged || bearingHasChanged
1560 || tiltHasChanged || fovHasChanged)
1561 emit visibleRegionChanged();
1562}
1563
1575QList<QObject *> QDeclarativeGeoMap::mapItems()
1576{
1577 QList<QObject *> ret;
1578 for (const auto &ptr : m_mapItems) {
1579 if (ptr)
1580 ret << ptr.data();
1581 }
1582 return ret;
1583}
1584
1608
1610{
1611 if (!item || item->quickMap())
1612 return false;
1613 // If the item comes from a MapItemGroup, do not reparent it.
1614 if (!qobject_cast<QDeclarativeGeoMapItemGroup *>(item->parentItem()))
1615 item->setParentItem(this);
1616 m_mapItems.append(item);
1617 if (m_map) {
1618 item->setMap(this, m_map);
1619 m_map->addMapItem(item);
1620 }
1621 return true;
1622}
1623
1638
1640{
1641 if (!ptr)
1642 return false;
1643 QPointer<QDeclarativeGeoMapItemBase> item(ptr);
1644 if (!m_mapItems.contains(item))
1645 return false;
1646 if (m_map)
1647 m_map->removeMapItem(ptr);
1648 if (item->parentItem() == this)
1649 item->setParentItem(0);
1650 item->setMap(0, 0);
1651 // these can be optimized for perf, as we already check the 'contains' above
1652 m_mapItems.removeOne(item);
1653 return true;
1654}
1655
1664{
1665 if (m_mapItems.isEmpty())
1666 return;
1667
1668 qsizetype removed = 0;
1669 for (qsizetype i = 0; i < m_mapItemGroups.count(); ++i) {
1670 auto item = m_mapItemGroups.at(i);
1671 // Processing only top-level groups (!views)
1672 if (qobject_cast<QDeclarativeGeoMapItemView *>(item))
1673 continue;
1674
1675
1676 if (item->parentItem() != this)
1677 continue;
1678
1680 removed++;
1681 --i;
1682 }
1683 }
1684
1685 while (!m_mapItems.isEmpty())
1686 removed += removeMapItem_real(m_mapItems.first());
1687
1688 if (removed)
1690}
1691
1707
1709{
1710 if (!itemGroup || itemGroup->quickMap()) // Already added to some map
1711 return false;
1712
1713 itemGroup->setQuickMap(this);
1714
1715 if (!isGroupNested(itemGroup))
1716 itemGroup->setParentItem(this);
1717
1718 QPointer<QDeclarativeGeoMapItemGroup> g(itemGroup);
1719 m_mapItemGroups.append(g);
1720
1721 const QList<QQuickItem *> quickKids = itemGroup->childItems();
1722 int count = 0;
1723 for (auto c: quickKids) {
1724 count += addMapChild(c); // this calls addMapItemGroup recursively, if needed
1725 }
1726 return count;
1727}
1728
1743
1745{
1746 if (!itemGroup || itemGroup->quickMap() != this) // cant remove an itemGroup added to another map
1747 return false;
1748
1749 QPointer<QDeclarativeGeoMapItemGroup> g(itemGroup);
1750 if (!m_mapItemGroups.removeOne(g))
1751 return false;
1752
1753 const QList<QQuickItem *> quickKids = itemGroup->childItems();
1754 int count = 0;
1755 for (auto c: quickKids) {
1757 }
1758 itemGroup->setQuickMap(nullptr);
1759 if (itemGroup->parentItem() == this)
1760 itemGroup->setParentItem(0);
1761 return count;
1762}
1763
1778
1780{
1781 if (!itemView || itemView->m_map != this) // can't remove a view that is already added to another map
1782 return false;
1783
1784 itemView->removeInstantiatedItems(false); // remove the items without using transitions AND abort ongoing ones
1785 itemView->m_map = 0;
1786 m_mapViews.removeOne(itemView);
1787 return removeMapItemGroup_real(itemView); // at this point, all delegate instances have been removed.
1788}
1789
1791{
1792 if (!m_initialized)
1793 return;
1794
1795 // Update itemToWindowTransform into QGeoProjection
1796 QTransform item2Window = QQuickItemPrivate::get(this)->itemToWindowTransform();
1797 if (!property("layer").isNull() && property("layer").value<QObject *>()->property("enabled").toBool())
1798 item2Window.reset(); // When layer is enabled, the item is rendered offscreen with no transformation, then the layer is applied
1799
1800 m_map->setItemToWindowTransform(item2Window);
1801
1802 m_sgNodeHasChanged = false;
1803}
1804
1806{
1807 m_sgNodeHasChanged = true;
1808 update();
1809}
1810
1825
1827{
1828 if (!itemView || itemView->m_map) // can't add a view twice
1829 return false;
1830
1831 int count = addMapItemGroup_real(itemView); // at this point, delegates aren't yet incubated.
1832 // Not appending it to m_mapViews because it seems unnecessary even if the
1833 // itemView is a child of this (in which case it would be destroyed
1834 m_mapViews.append(itemView);
1835 setupMapView(itemView);
1836 return count;
1837}
1838
1850{
1851 if (m_activeMapType != mapType) {
1852 if (m_map) {
1853 if (mapType.pluginName() == m_plugin->name().toLatin1()) {
1854 m_map->setActiveMapType(mapType);
1855 m_activeMapType = mapType;
1857 }
1858 } else {
1859 m_activeMapType = mapType;
1861 }
1862 }
1863}
1864
1866{
1867 return m_activeMapType;
1868}
1869
1873void QDeclarativeGeoMap::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
1874{
1875 QQuickItem::geometryChange(newGeometry, oldGeometry);
1876
1877 if (!m_map || newGeometry.size().isEmpty())
1878 return;
1879
1880 m_map->setViewportSize(newGeometry.size().toSize());
1881
1882 if (!m_initialized) {
1883 initialize();
1884 } else {
1885 setMinimumZoomLevel(m_map->minimumZoom(), false);
1886
1887 // Update the center latitudinal threshold
1888 QGeoCameraData cameraData = m_map->cameraData();
1889 const double maximumCenterLatitudeAtZoom = m_map->maximumCenterLatitudeAtZoom(cameraData);
1890 const double minimumCenterLatitudeAtZoom = m_map->minimumCenterLatitudeAtZoom(cameraData);
1891 if (maximumCenterLatitudeAtZoom != m_maximumViewportLatitude
1892 || minimumCenterLatitudeAtZoom != m_minimumViewportLatitude) {
1893 m_maximumViewportLatitude = maximumCenterLatitudeAtZoom;
1894 m_minimumViewportLatitude = minimumCenterLatitudeAtZoom;
1895 QGeoCoordinate coord = cameraData.center();
1896 coord.setLatitude(qBound(m_minimumViewportLatitude, coord.latitude(), m_maximumViewportLatitude));
1897 cameraData.setCenter(coord);
1898 m_map->setCameraData(cameraData);
1899 }
1900 if (oldGeometry.size() != newGeometry.size()) {
1901 // polish map items
1902 for (const QPointer<QDeclarativeGeoMapItemBase> &i: std::as_const(m_mapItems)) {
1903 if (i)
1904 i->polishAndUpdate();
1905 }
1906 }
1907 }
1908
1909 /*
1910 The fitViewportTo*() functions depend on a valid map geometry.
1911 If they were called prior to the first resize they cause
1912 the zoomlevel to jump to 0 (showing the world). Therefore the
1913 calls were queued up until now.
1914
1915 Multiple fitViewportTo*() calls replace each other.
1916 */
1917 if (m_pendingFitViewport && width() && height()) {
1918 fitViewportToGeoShape(m_visibleRegion);
1919 m_pendingFitViewport = false;
1920 }
1921
1922}
1923
1938{
1939 if (items.size()) {
1940 QList<QPointer<QDeclarativeGeoMapItemBase> > itms;
1941 for (const QVariant &i: items) {
1942 QDeclarativeGeoMapItemBase *itm = qobject_cast<QDeclarativeGeoMapItemBase *>(i.value<QObject *>());
1943 if (itm)
1944 itms.append(itm);
1945 }
1946 fitViewportToMapItemsRefine(itms, true, false);
1947 } else {
1948 fitViewportToMapItemsRefine(m_mapItems, true, false);
1949 }
1950}
1951
1962{
1963 fitViewportToMapItemsRefine(m_mapItems, true, true);
1964}
1965
1969void QDeclarativeGeoMap::fitViewportToMapItemsRefine(const QList<QPointer<QDeclarativeGeoMapItemBase> > &mapItems,
1970 bool refine,
1971 bool onlyVisible)
1972{
1973 if (!m_map)
1974 return;
1975
1976 if (mapItems.size() == 0)
1977 return;
1978
1979 double minX = qInf();
1980 double maxX = -qInf();
1981 double minY = qInf();
1982 double maxY = -qInf();
1983 double topLeftX = 0;
1984 double topLeftY = 0;
1985 double bottomRightX = 0;
1986 double bottomRightY = 0;
1987 bool haveQuickItem = false;
1988
1989 // find bounds of all map items
1990 qsizetype itemCount = 0;
1991 for (qsizetype i = 0; i < mapItems.count(); ++i) {
1992 if (!mapItems.at(i))
1993 continue;
1995 if (!item || (onlyVisible && (!item->isVisible() || item->mapItemOpacity() <= 0.0)))
1996 continue;
1997
1998 // skip quick items in the first pass and refine the fit later
1999 QDeclarativeGeoMapQuickItem *quickItem =
2000 qobject_cast<QDeclarativeGeoMapQuickItem*>(item);
2001 if (refine && quickItem) {
2002 haveQuickItem = true;
2003 continue;
2004 }
2005 // Force map items to update immediately. Needed to ensure correct item size and positions
2006 // when recursively calling this function.
2007 // TODO: See if we really need updatePolish on delegated items, in particular
2008 // in relation to
2009 // a) fitViewportToMapItems
2010 // b) presence of MouseArea
2011 //
2012 // This is also legacy code. It must be updated to not operate on screen sizes.
2013 if (item->isPolishScheduled())
2014 item->updatePolish();
2015
2016 if (quickItem && quickItem->matrix_ && !quickItem->matrix_->m_matrix.isIdentity()) {
2017 // TODO: recalculate the center/zoom level so that the item becomes projectable again
2018 if (quickItem->zoomLevel() == 0.0) // the item is unprojectable, should be skipped.
2019 continue;
2020
2021 QRectF brect = item->boundingRect();
2022 brect = quickItem->matrix_->m_matrix.mapRect(brect);
2023 QPointF transformedPosition = quickItem->matrix_->m_matrix.map(item->position());
2024 topLeftX = transformedPosition.x();
2025 topLeftY = transformedPosition.y();
2026 bottomRightX = topLeftX + brect.width();
2027 bottomRightY = topLeftY + brect.height();
2028 } else {
2029 QGeoRectangle brect = item->geoShape().boundingGeoRectangle();
2030 topLeftX = fromCoordinate(brect.topLeft(), false).x();
2031 topLeftY = fromCoordinate(brect.topLeft(), false).y();
2032 bottomRightX = fromCoordinate(brect.bottomRight(), false).x();
2033 bottomRightY = fromCoordinate(brect.bottomRight(), false).y();
2034 }
2035
2036 minX = qMin(minX, topLeftX);
2037 maxX = qMax(maxX, bottomRightX);
2038 minY = qMin(minY, topLeftY);
2039 maxY = qMax(maxY, bottomRightY);
2040
2041 ++itemCount;
2042 }
2043
2044 if (itemCount == 0) {
2045 if (haveQuickItem)
2046 fitViewportToMapItemsRefine(mapItems, false, onlyVisible);
2047 return;
2048 }
2049 double bboxWidth = maxX - minX;
2050 double bboxHeight = maxY - minY;
2051 double bboxCenterX = minX + (bboxWidth / 2.0);
2052 double bboxCenterY = minY + (bboxHeight / 2.0);
2053
2054 // position camera to the center of bounding box
2055 QGeoCoordinate coordinate;
2056 coordinate = m_map->geoProjection().itemPositionToCoordinate(QDoubleVector2D(bboxCenterX, bboxCenterY), false);
2057 setProperty("center", QVariant::fromValue(coordinate));
2058
2059 // adjust zoom
2060 double bboxWidthRatio = bboxWidth / (bboxWidth + bboxHeight);
2061 double mapWidthRatio = width() / (width() + height());
2062 double zoomRatio;
2063
2064 if (bboxWidthRatio > mapWidthRatio)
2065 zoomRatio = bboxWidth / width();
2066 else
2067 zoomRatio = bboxHeight / height();
2068
2069 qreal newZoom = std::log10(zoomRatio) / std::log10(0.5);
2070 newZoom = std::floor(qMax(minimumZoomLevel(), (zoomLevel() + newZoom)));
2071 setProperty("zoomLevel", QVariant::fromValue(newZoom));
2072
2073 // as map quick items retain the same screen size after the camera zooms in/out
2074 // we refine the viewport again to achieve better results
2075 if (refine)
2076 fitViewportToMapItemsRefine(mapItems, false, onlyVisible);
2077}
2078
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
void setMapSource(QDeclarativeGeoMap *mapSource)
void removeInstantiatedItems(bool transition=true)
friend class QDeclarativeGeoMapCopyrightNotice
bool removeMapChild(QObject *child)
void setActiveMapType(const QGeoMapType &mapType)
\qmlproperty mapType QtLocation::Map::activeMapType
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override
void zoomLevelChanged(qreal zoomLevel)
void setMinimumTilt(qreal minimumTilt, bool userSet=true)
QGeoServiceProvider::Error error
void activeMapTypeChanged()
void maximumFieldOfViewChanged(qreal maximumFieldOfView)
void setBearing(qreal bearing)
\qmlproperty real QtLocation::Map::bearing
bool addMapItem_real(QDeclarativeGeoMapItemBase *item)
bool removeMapItemGroup_real(QDeclarativeGeoMapItemGroup *itemGroup)
void supportedMapTypesChanged()
Q_INVOKABLE void clearData()
\qmlmethod void QtLocation::Map::clearData()
Q_INVOKABLE void removeMapItemGroup(QDeclarativeGeoMapItemGroup *itemGroup)
\qmlmethod void QtLocation::Map::removeMapItemGroup(MapItemGroup itemGroup)
void fitViewportToGeoShape(const QGeoShape &shape, const QMargins &borders=QMargins(10, 10, 10, 10))
\qmlmethod void QtLocation::Map::fitViewportToGeoShape(geoShape, margins)
void copyrightsVisibleChanged(bool visible)
void minimumZoomLevelChanged(qreal minimumZoomLevel)
void setVisibleArea(const QRectF &visibleArea)
Q_INVOKABLE void fitViewportToMapItems(const QVariantList &items={})
\qmlmethod void QtLocation::Map::fitViewportToMapItems(list<MapItems> items = {})
Q_INVOKABLE void fitViewportToVisibleMapItems()
\qmlmethod void QtLocation::Map::fitViewportToVisibleMapItems()
void componentComplete() override
void copyrightsChanged(const QString &copyrightsHtml)
void setZoomLevel(qreal zoomLevel)
\qmlproperty real QtLocation::Map::zoomLevel
void minimumTiltChanged(qreal minimumTilt)
void pluginChanged(QDeclarativeGeoServiceProvider *plugin)
bool isGroupNested(QDeclarativeGeoMapItemGroup *group) const
void setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet=true)
Q_INVOKABLE QGeoCoordinate toCoordinate(const QPointF &position, bool clipToViewPort=true) const
\qmlmethod coordinate QtLocation::Map::toCoordinate(QPointF position, bool clipToViewPort)
Q_INVOKABLE void removeMapItemView(QDeclarativeGeoMapItemView *itemView)
\qmlmethod void QtLocation::Map::removeMapItemView(MapItemView itemView)
bool removeMapItem_real(QDeclarativeGeoMapItemBase *item)
void bearingChanged(qreal bearing)
void minimumFieldOfViewChanged(qreal minimumFieldOfView)
void setError(QGeoServiceProvider::Error error, const QString &errorString)
void itemChange(ItemChange, const ItemChangeData &) override
Called when change occurs for this item.
Q_INVOKABLE void addMapItemGroup(QDeclarativeGeoMapItemGroup *itemGroup)
\qmlmethod void QtLocation::Map::addMapItemGroup(MapItemGroup itemGroup)
bool addMapItemView_real(QDeclarativeGeoMapItemView *itemView)
Q_INVOKABLE void removeMapItem(QDeclarativeGeoMapItemBase *item)
\qmlmethod void QtLocation::Map::removeMapItem(MapItem item)
void setColor(const QColor &color)
\qmlproperty color QtLocation::Map::color
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
void setMaximumTilt(qreal maximumTilt, bool userSet=true)
QList< QObject * > mapItems
\qmlproperty list<MapItem> QtLocation::Map::mapItems
QDeclarativeGeoMap(QQuickItem *parent=nullptr)
\qmltype Map \instantiates QDeclarativeGeoMap \inqmlmodule QtLocation
void setTilt(qreal tilt)
\qmlproperty real QtLocation::Map::tilt
void mapReadyChanged(bool ready)
void setCenter(const QGeoCoordinate &center)
\qmlproperty coordinate QtLocation::Map::center
Q_INVOKABLE QPointF fromCoordinate(const QGeoCoordinate &coordinate, bool clipToViewPort=true) const
\qmlmethod point QtLocation::Map::fromCoordinate(coordinate coordinate, bool clipToViewPort)
Q_INVOKABLE void clearMapItems()
\qmlmethod void QtLocation::Map::clearMapItems()
QList< QGeoMapType > supportedMapTypes
\qmlproperty list<mapType> QtLocation::Map::supportedMapTypes
void fieldOfViewChanged(qreal fieldOfView)
Q_INVOKABLE void prefetchData()
\qmlmethod void QtLocation::Map::prefetchData()
void setPlugin(QDeclarativeGeoServiceProvider *plugin)
\qmlproperty Plugin QtLocation::Map::plugin
void setCopyrightsVisible(bool visible)
\qmlproperty bool QtLocation::Map::copyrightsVisible
void tiltChanged(qreal tilt)
void maximumTiltChanged(qreal maximumTilt)
void setVisibleRegion(const QGeoShape &shape)
\qmlproperty geoshape QtLocation::Map::visibleRegion
void setMaximumZoomLevel(qreal maximumZoomLevel, bool userSet=true)
void setFieldOfView(qreal fieldOfView)
\qmlproperty real QtLocation::Map::fieldOfView
void copyrightsImageChanged(const QImage &copyrightsImage)
Q_INVOKABLE void pan(int dx, int dy)
\qmlmethod void QtLocation::Map::pan(int dx, int dy)
QDeclarativeGeoServiceProvider * plugin
void setMaximumFieldOfView(qreal maximumFieldOfView, bool userSet=true)
bool addMapItemGroup_real(QDeclarativeGeoMapItemGroup *itemGroup)
bool addMapChild(QObject *child)
Q_INVOKABLE void addMapItemView(QDeclarativeGeoMapItemView *itemView)
\qmlmethod void QtLocation::Map::addMapItemView(MapItemView itemView)
Q_INVOKABLE void alignCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &point)
\qmlmethod void QtLocation::Map::alignCoordinateToPoint(coordinate coordinate, QPointF point)
Q_INVOKABLE void addMapItem(QDeclarativeGeoMapItemBase *item)
\qmlmethod void QtLocation::Map::addMapItem(MapItem item)
void setMinimumFieldOfView(qreal minimumFieldOfView, bool userSet=true)
void centerChanged(const QGeoCoordinate &coordinate)
void maximumZoomLevelChanged(qreal maximumZoomLevel)
bool removeMapItemView_real(QDeclarativeGeoMapItemView *itemView)
QGeoServiceProvider * sharedGeoServiceProvider() const
void setSupportsBearing(bool supportsBearing)
Sets whether the associated plugin can render a map when the camera has an arbitrary bearing to suppo...
qreal maximumTilt
\qmlproperty qreal cameraCapabilities::maximumTilt
void setMaximumZoomLevel(double maximumZoomLevel)
bool overzoomEnabled() const
Returns whether overzooming is supported by the associated plugin.
bool supportsBearing() const
Returns whether the associated plugin can render a map when the camera has an arbitrary bearing.
qreal minimumZoomLevel
\qmlproperty qreal cameraCapabilities::minimumZoomLevel
void setMaximumTilt(double maximumTilt)
qreal maximumZoomLevel
\qmlproperty qreal cameraCapabilities::maximumZoomLevel
void setMaximumFieldOfView(double maximumFieldOfView)
void setMinimumFieldOfView(double minimumFieldOfView)
void setMinimumTilt(double minimumTilt)
void setMinimumZoomLevel(double minimumZoomLevel)
qreal maximumFieldOfView
\qmlproperty qreal cameraCapabilities::maximumFieldOfView
qreal minimumTilt
\qmlproperty qreal cameraCapabilities::minimumTilt
bool supportsTilting() const
Returns whether the associated plugin can render a map when the camera is tilted.
void setSupportsTilting(bool supportsTilting)
Sets whether the associated plugin can render a map when the camera is tilted to supportsTilting.
qreal minimumFieldOfView
\qmlproperty qreal cameraCapabilities::minimumFieldOfView
double zoomLevel() const
void setTilt(double tilt)
double tilt() const
void setZoomLevel(double zoomLevel)
void setCenter(const QGeoCoordinate &coordinate)
void setBearing(double bearing)
double fieldOfView() const
double bearing() const
QGeoCoordinate center() const
void setFieldOfView(double fieldOfView)
\inmodule QtPositioning
double latitude
This property holds the latitude in decimal degrees.
void setLatitude(double latitude)
Sets the latitude (in decimal degrees) to latitude.
bool isValid
This property holds the validity of this geo coordinate.
QByteArray pluginName() const
void setCameraData(const QGeoCameraData &cameraData)
Definition qgeomap.cpp:51
virtual bool setBearing(qreal bearing, const QGeoCoordinate &coordinate)
Definition qgeomap.cpp:74
@ SupportsFittingViewportToGeoRectangle
Definition qgeomap_p.h:63
@ SupportsVisibleRegion
Definition qgeomap_p.h:60
@ SupportsAnchoringCoordinate
Definition qgeomap_p.h:62
@ SupportsSetBearing
Definition qgeomap_p.h:61
virtual bool fitViewportToGeoRectangle(const QGeoRectangle &rectangle, const QMargins &borders)
Definition qgeomap.cpp:99
void setActiveMapType(const QGeoMapType &mapType)
Definition qgeomap.cpp:117
virtual Capabilities capabilities() const
Definition qgeomap.cpp:176
virtual void prefetchData()
Definition qgeomap.cpp:181
void clearMapItems()
Definition qgeomap.cpp:215
double maximumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
Definition qgeomap.cpp:140
virtual QSGNode * updateSceneGraph(QSGNode *node, QQuickWindow *window)=0
void visibleAreaChanged()
void setViewportSize(const QSize &viewportSize)
Definition qgeomap.cpp:23
virtual QGeoShape visibleRegion() const
Definition qgeomap.cpp:106
QGeoCameraCapabilities cameraCapabilities() const
Definition qgeomap.cpp:170
void sgNodeChanged()
void cameraDataChanged(const QGeoCameraData &cameraData)
virtual void setCopyrightVisible(bool visible)
Definition qgeomap.cpp:258
virtual bool anchorCoordinateToPoint(const QGeoCoordinate &coordinate, const QPointF &anchorPoint)
Definition qgeomap.cpp:85
virtual void setItemToWindowTransform(const QTransform &itemToWindowTransform)
Definition qgeomap.cpp:223
const QGeoProjection & geoProjection() const
Definition qgeomap.cpp:164
void removeMapItem(QDeclarativeGeoMapItemBase *item)
Definition qgeomap.cpp:206
QGeoMapType activeMapType() const
Definition qgeomap.cpp:128
void addMapItem(QDeclarativeGeoMapItemBase *item)
Definition qgeomap.cpp:197
void cameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities)
virtual void clearData()
Definition qgeomap.cpp:186
void copyrightsChanged(const QString &copyrightsHtml)
QRectF visibleArea() const
Definition qgeomap.cpp:238
double minimumCenterLatitudeAtZoom(const QGeoCameraData &cameraData) const
Definition qgeomap.cpp:146
void copyrightsImageChanged(const QImage &copyrightsImage)
const QGeoCameraData & cameraData() const
Definition qgeomap.cpp:111
int viewportHeight() const
Definition qgeomap.cpp:45
int viewportWidth() const
Definition qgeomap.cpp:39
void setVisibleArea(const QRectF &visibleArea)
Definition qgeomap.cpp:229
double minimumZoom() const
Definition qgeomap.cpp:134
void initialized()
This signal is emitted when the mapping manager has been initialized and is ready to be used.
QGeoMap * createMap(QObject *parent)
Returns a new QGeoMap instance which will be managed by this manager.
QList< QGeoMapType > supportedMapTypes() const
void supportedMapTypesChanged()
bool isInitialized() const
Return whether the manager has been initialized (will be done automatically but may take some time).
\inmodule QtPositioning
Definition qgeopath.h:16
QPair< QGeoCoordinate, qreal > fitViewportToGeoRectangle(const QGeoRectangle &rectangle, const QMargins &margins) const
virtual ProjectionType projectionType() const =0
virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport=true) const =0
virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport=true) const =0
\inmodule QtPositioning
QGeoCoordinate topLeft
This property holds the top left coordinate of this geo rectangle.
QGeoCoordinate bottomRight
This property holds the bottom right coordinate of this geo rectangle.
\inmodule QtLocation
QGeoMappingManager * mappingManager() const
Returns the QGeoMappingManager made available by the service provider.
Error mappingError() const
Returns an error code describing the error which occurred during the last attempt to create a mapping...
Error
Describes an error related to the loading and setup of a service provider plugin.
QString mappingErrorString() const
Returns a string describing the error which occurred during the last attempt to create a mapping mana...
\inmodule QtPositioning
Definition qgeoshape.h:17
bool isValid
This property holds the validity of the geo shape.
Definition qgeoshape.h:20
Q_INVOKABLE QGeoRectangle boundingGeoRectangle() const
Returns a QGeoRectangle representing the geographical bounding rectangle of the geo shape,...
virtual QRectF boundingRect() const =0
This pure virtual function defines the outer bounds of the item as a rectangle; all painting must be ...
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
QVariant data(int key) const
Returns this item's custom data for the key key as a QVariant.
QGraphicsItem * parentItem() const
Returns a pointer to this item's parent item.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
\inmodule QtGui
Definition qimage.h:37
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
T & first()
Definition qlist.h:645
bool removeOne(const AT &t)
Definition qlist.h:598
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
qsizetype count() const noexcept
Definition qlist.h:398
void append(parameter_type t)
Definition qlist.h:458
\inmodule QtCore
Definition qmargins.h:24
\inmodule QtCore Represents a handle to a signal-slot (or signal-functor) connection.
\inmodule QtCore
Definition qobject.h:103
const QObjectList & children() const
Returns a list of child objects.
Definition qobject.h:201
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
QObject * sender() const
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; othe...
Definition qobject.cpp:2658
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
Definition qobject.cpp:3236
\inmodule QtCore\reentrant
Definition qpoint.h:217
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:343
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:348
void clear() noexcept
Definition qpointer.h:87
T * data() const noexcept
Definition qpointer.h:73
bool isNull() const noexcept
Definition qpointer.h:84
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
QList< QQuickItem * > childItems() const
Returns the children of this item.
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
bool visible
\qmlproperty bool QtQuick::Item::visible
Definition qquickitem.h:80
qreal z
\qmlproperty real QtQuick::Item::z
Definition qquickitem.h:74
void componentComplete() override
\reimp Derived classes should call the base class method before adding their own actions to perform a...
virtual QRectF boundingRect() const
Returns the extents of the item in its own coordinate system: a rectangle from {0,...
void setFlags(Flags flags)
Enables the specified flags for this item.
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
Definition qquickitem.h:75
QQuickItem * parentItem() const
virtual void itemChange(ItemChange, const ItemChangeData &)
Called when change occurs for this item.
QQuickItem * parent
\qmlproperty Item QtQuick::Item::parent This property holds the visual parent of the item.
Definition qquickitem.h:67
QPointF position() const
qreal height
This property holds the height of this item.
Definition qquickitem.h:76
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:144
@ ItemChildAddedChange
Definition qquickitem.h:145
@ ItemClipsChildrenToShape
Definition qquickitem.h:130
void update()
Schedules a call to updatePaintNode() for this item.
void beforeSynchronizing()
This signal is emitted before the scene graph is synchronized with the QML state.
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr bool isEmpty() const noexcept
Returns true if the rectangle is empty, otherwise returns false.
Definition qrect.h:661
constexpr qreal y() const noexcept
Returns the y-coordinate of the rectangle's top edge.
Definition qrect.h:672
constexpr qreal height() const noexcept
Returns the height of the rectangle.
Definition qrect.h:732
constexpr qreal width() const noexcept
Returns the width of the rectangle.
Definition qrect.h:729
constexpr qreal x() const noexcept
Returns the x-coordinate of the rectangle's left edge.
Definition qrect.h:669
constexpr QSizeF size() const noexcept
Returns the size of the rectangle.
Definition qrect.h:735
constexpr bool isValid() const noexcept
Returns true if the rectangle is valid, otherwise returns false.
Definition qrect.h:666
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
Definition qsgnode.h:37
int childCount() const
Returns the number of child nodes.
Definition qsgnode.cpp:556
void appendChildNode(QSGNode *node)
Appends node to this node's list of children.
Definition qsgnode.cpp:398
QSGNode * firstChild() const
Returns the first child of this node.
Definition qsgnode.h:105
The QSGRectangleNode class is a convenience class for drawing solid filled rectangles using scenegrap...
virtual void setRect(const QRectF &rect)=0
Sets the rectangle of this rect node to rect.
virtual void setColor(const QColor &color)=0
Sets the color of this rectangle to color.
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QByteArray toLatin1() const &
Definition qstring.h:630
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
\inmodule QtCore
Definition qvariant.h:65
double toDouble(bool *ok=nullptr) const
Returns the variant as a double if the variant has userType() \l QMetaType::Double,...
int typeId() const
Returns the storage type of the value stored in the variant.
Definition qvariant.h:340
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
void colorChanged()
cache insert(employee->id(), employee)
Combined button and popup list for selecting options.
@ DirectConnection
static jboolean copy(JNIEnv *, jobject)
#define QByteArrayLiteral(str)
Definition qbytearray.h:52
DBusConnection const char DBusError * error
static QT_BEGIN_NAMESPACE qreal sanitizeBearing(qreal bearing)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qIsFinite(qfloat16 f) noexcept
Definition qfloat16.h:285
return ret
static ControlElement< T > * ptr(QWidget *widget)
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qInf()
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qQNaN()
GLsizei const GLfloat * v
[13]
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
const GLfloat * m
GLint GLsizei GLsizei height
GLfloat GLfloat GLfloat GLfloat GLfloat maxY
GLenum GLenum GLsizei count
GLfloat minY
GLint GLsizei width
GLuint color
[2]
GLenum type
GLboolean GLuint group
GLboolean GLboolean g
GLfloat GLfloat GLfloat GLfloat maxX
const GLubyte * c
GLuint coord
GLsizei const GLchar *const * path
GLfloat GLfloat p
[1]
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define QStringLiteral(str)
#define tr(X)
#define emit
ptrdiff_t qsizetype
Definition qtypes.h:165
double qreal
Definition qtypes.h:187
const char property[13]
Definition qwizard.cpp:101
myObject disconnect()
[26]
QGraphicsItem * item
QList< QTreeWidgetItem * > items
QLayoutItem * child
[0]
QQuickView * view
[0]
args<< 1<< 2;QJSValue threeAgain=fun.call(args);QString fileName="helloworld.qs";QFile scriptFile(fileName);if(!scriptFile.open(QIODevice::ReadOnly)) QTextStream stream(&scriptFile);QString contents=stream.readAll();scriptFile.close();myEngine.evaluate(contents, fileName);myEngine.globalObject().setProperty("myNumber", 123);...QJSValue myNumberPlusOne=myEngine.evaluate("myNumber + 1");QJSValue result=myEngine.evaluate(...);if(result.isError()) qDebug()<< "Uncaught exception at line"<< result.property("lineNumber").toInt()<< ":"<< result.toString();QPushButton *button=new QPushButton;QJSValue scriptButton=myEngine.newQObject(button);myEngine.globalObject().setProperty("button", scriptButton);myEngine.evaluate("button.checkable = true");qDebug()<< scriptButton.property("checkable").toBool();scriptButton.property("show").call();QJSEngine engine;QObject *myQObject=new QObject();myQObject- setProperty)("dynamicProperty", 3)
bool contains(const AT &t) const noexcept
Definition qlist.h:45
QT_BEGIN_NAMESPACE bool toBool(const QString &str)
Definition utils.h:14
\inmodule QtQuick
Definition qquickitem.h:159