summaryrefslogtreecommitdiff
path: root/src/location/declarativemaps/qdeclarativegeomap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/declarativemaps/qdeclarativegeomap.cpp')
-rw-r--r--src/location/declarativemaps/qdeclarativegeomap.cpp63
1 files changed, 33 insertions, 30 deletions
diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp
index 19bc57ce..37cfc303 100644
--- a/src/location/declarativemaps/qdeclarativegeomap.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomap.cpp
@@ -255,6 +255,8 @@ QDeclarativeGeoMap::~QDeclarativeGeoMap()
delete m_copyrights.data();
m_copyrights.clear();
+
+ delete m_map;
}
/*!
@@ -293,17 +295,17 @@ void QDeclarativeGeoMap::onMapChildrenChanged()
copyrights = m_copyrights.data();
- connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+ connect(m_map, SIGNAL(copyrightsChanged(QImage)),
copyrights, SLOT(copyrightsChanged(QImage)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+ connect(m_map, SIGNAL(copyrightsChanged(QImage)),
this, SIGNAL(copyrightsChanged(QImage)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsChanged(QString)),
copyrights, SLOT(copyrightsChanged(QString)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsChanged(QString)),
this, SIGNAL(copyrightsChanged(QString)));
- connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)),
copyrights, SLOT(onCopyrightsStyleSheetChanged(QString)));
connect(copyrights, SIGNAL(linkActivated(QString)),
@@ -739,7 +741,7 @@ void QDeclarativeGeoMap::onCameraCapabilitiesChanged(const QGeoCameraCapabilitie
*/
void QDeclarativeGeoMap::mappingManagerInitialized()
{
- m_map = QPointer<QGeoMap>(m_mappingManager->createMap(this));
+ m_map = m_mappingManager->createMap(this);
if (!m_map)
return;
@@ -784,11 +786,11 @@ void QDeclarativeGeoMap::mappingManagerInitialized()
QImage copyrightImage;
if (!m_initialized && width() > 0 && height() > 0) {
QMetaObject::Connection copyrightStringCatcherConnection =
- connect(m_map.data(),
+ connect(m_map,
QOverload<const QString &>::of(&QGeoMap::copyrightsChanged),
[&copyrightString](const QString &copy){ copyrightString = copy; });
QMetaObject::Connection copyrightImageCatcherConnection =
- connect(m_map.data(),
+ connect(m_map,
QOverload<const QImage &>::of(&QGeoMap::copyrightsChanged),
[&copyrightImage](const QImage &copy){ copyrightImage = copy; });
m_map->setViewportSize(QSize(width(), height()));
@@ -800,28 +802,28 @@ void QDeclarativeGeoMap::mappingManagerInitialized()
m_copyrights = new QDeclarativeGeoMapCopyrightNotice(this);
m_copyrights->onCopyrightsStyleSheetChanged(m_map->copyrightsStyleSheet());
- connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+ connect(m_map, SIGNAL(copyrightsChanged(QImage)),
m_copyrights.data(), SLOT(copyrightsChanged(QImage)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)),
+ connect(m_map, SIGNAL(copyrightsChanged(QImage)),
this, SIGNAL(copyrightsChanged(QImage)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsChanged(QString)),
m_copyrights.data(), SLOT(copyrightsChanged(QString)));
- connect(m_map.data(), SIGNAL(copyrightsChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsChanged(QString)),
this, SIGNAL(copyrightsChanged(QString)));
if (!copyrightString.isEmpty())
- emit m_map.data()->copyrightsChanged(copyrightString);
+ emit m_map->copyrightsChanged(copyrightString);
else if (!copyrightImage.isNull())
- emit m_map.data()->copyrightsChanged(copyrightImage);
+ emit m_map->copyrightsChanged(copyrightImage);
- connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)),
+ connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)),
m_copyrights.data(), SLOT(onCopyrightsStyleSheetChanged(QString)));
connect(m_copyrights.data(), SIGNAL(linkActivated(QString)),
this, SIGNAL(copyrightLinkActivated(QString)));
- connect(m_map.data(), &QGeoMap::sgNodeChanged, this, &QQuickItem::update);
- connect(m_map.data(), &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged);
+ connect(m_map, &QGeoMap::sgNodeChanged, this, &QQuickItem::update);
+ connect(m_map, &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged);
// set visibility of copyright notice
m_copyrights->setCopyrightsVisible(m_copyrightsVisible);
@@ -1340,20 +1342,21 @@ QGeoShape QDeclarativeGeoMap::visibleRegion() const
const QList<QDoubleVector2D> &visibleRegion = m_map->geoProjection().visibleRegion();
QGeoPath path;
- for (const QDoubleVector2D &c: visibleRegion)
+ for (int i = 0; i < visibleRegion.size(); ++i) {
+ const QDoubleVector2D &c = visibleRegion.at(i);
+ // If a segment spans more than half of the map longitudinally, split in 2.
+ if (i && qAbs(visibleRegion.at(i-1).x() - c.x()) >= 0.5) { // This assumes a segment is never >= 1.0 (whole map span)
+ QDoubleVector2D extraPoint = (visibleRegion.at(i-1) + c) * 0.5;
+ path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
+ }
path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(c));
-
- QGeoRectangle vr = path.boundingGeoRectangle();
-
- bool empty = vr.topLeft().latitude() == vr.bottomRight().latitude() ||
- qFuzzyCompare(vr.topLeft().longitude(), vr.bottomRight().longitude()); // QTBUG-57690
-
- if (empty) {
- vr.setTopLeft(QGeoCoordinate(vr.topLeft().latitude(), -180));
- vr.setBottomRight(QGeoCoordinate(vr.bottomRight().latitude(), 180));
+ }
+ if (visibleRegion.size() >= 2 && qAbs(visibleRegion.last().x() - visibleRegion.first().x()) >= 0.5) {
+ QDoubleVector2D extraPoint = (visibleRegion.last() + visibleRegion.first()) * 0.5;
+ path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
}
- return vr;
+ return path.boundingGeoRectangle();
}
/*!
@@ -1440,7 +1443,7 @@ void QDeclarativeGeoMap::fitViewportToGeoShape()
QGeoCoordinate centerCoordinate = m_map->geoProjection().mapProjectionToGeo(center);
// position camera to the center of bounding box
- setCenter(centerCoordinate);
+ setProperty("center", QVariant::fromValue(centerCoordinate)); // not using setCenter(centerCoordinate) to honor a possible animation set on the center property
// if the shape is empty we just change center position, not zoom
double bboxWidth = (bottomRightPoint.x() - topLeftPoint.x()) * m_map->mapWidth();
@@ -1453,7 +1456,7 @@ void QDeclarativeGeoMap::fitViewportToGeoShape()
bboxHeight / (height() - margins));
zoomRatio = std::log(zoomRatio) / std::log(2.0);
double newZoom = qMax<double>(minimumZoomLevel(), zoomLevel() - zoomRatio);
- setZoomLevel(newZoom);
+ setProperty("zoomLevel", QVariant::fromValue(newZoom)); // not using setZoomLevel(newZoom) to honor a possible animation set on the zoomLevel property
}