diff options
-rw-r--r-- | src/imports/location/qdeclarativegeomap.cpp | 164 | ||||
-rw-r--r-- | src/imports/location/qdeclarativegeomap_p.h | 7 | ||||
-rw-r--r-- | src/imports/location/qquickgeomapgesturearea.cpp | 13 | ||||
-rw-r--r-- | src/location/maps/maps.pri | 2 | ||||
-rw-r--r-- | src/location/maps/qgeocameradata.cpp | 4 | ||||
-rw-r--r-- | src/location/maps/qgeomap.cpp | 42 | ||||
-rw-r--r-- | src/location/maps/qgeomap_p.h | 7 | ||||
-rw-r--r-- | src/location/maps/qgeomap_p_p.h | 1 | ||||
-rw-r--r-- | src/location/maps/qgeomapcontroller.cpp | 215 | ||||
-rw-r--r-- | src/location/maps/qgeomapcontroller_p.h | 112 | ||||
-rw-r--r-- | src/location/maps/qgeotiledmap.cpp | 106 | ||||
-rw-r--r-- | src/location/maps/qgeotiledmap_p.h | 3 | ||||
-rw-r--r-- | src/location/maps/qgeotiledmap_p_p.h | 3 | ||||
-rw-r--r-- | src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp | 3 | ||||
-rw-r--r-- | tests/auto/auto.pro | 1 | ||||
-rw-r--r-- | tests/auto/declarative_ui/tst_map.qml | 35 | ||||
-rw-r--r-- | tests/auto/qgeomapcontroller/qgeomapcontroller.pro | 7 | ||||
-rw-r--r-- | tests/auto/qgeomapcontroller/tst_qgeomapcontroller.cpp | 369 | ||||
-rw-r--r-- | tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp | 1 |
19 files changed, 183 insertions, 912 deletions
diff --git a/src/imports/location/qdeclarativegeomap.cpp b/src/imports/location/qdeclarativegeomap.cpp index c9dfe189..2878d3b6 100644 --- a/src/imports/location/qdeclarativegeomap.cpp +++ b/src/imports/location/qdeclarativegeomap.cpp @@ -39,7 +39,6 @@ #include "qdeclarativegeomapcopyrightsnotice_p.h" #include "qdeclarativegeoserviceprovider_p.h" #include "qdeclarativegeomaptype_p.h" -#include "qgeomapcontroller_p.h" #include "qgeomappingmanager_p.h" #include "qgeocameracapabilities_p.h" #include "qgeomap_p.h" @@ -173,17 +172,16 @@ QDeclarativeGeoMap::QDeclarativeGeoMap(QQuickItem *parent) m_plugin(0), m_serviceProvider(0), m_mappingManager(0), - m_center(51.5073,-0.1277), //London city center m_activeMapType(0), m_gestureArea(new QQuickGeoMapGestureArea(this)), m_map(0), m_error(QGeoServiceProvider::NoError), - m_zoomLevel(8.0), m_color(QColor::fromRgbF(0.9, 0.9, 0.9)), m_componentCompleted(false), m_mappingManagerInitialized(false), m_pendingFitViewport(false), - m_copyrightsVisible(true) + m_copyrightsVisible(true), + m_maximumViewportLatitude(0.0) { setAcceptHoverEvents(false); setAcceptedMouseButtons(Qt::LeftButton); @@ -195,6 +193,8 @@ QDeclarativeGeoMap::QDeclarativeGeoMap(QQuickItem *parent) m_activeMapType = new QDeclarativeGeoMapType(QGeoMapType(QGeoMapType::NoMap, tr("No Map"), tr("No Map"), false, false, 0), this); + m_cameraData.setCenter(QGeoCoordinate(51.5073,-0.1277)); //London city center + m_cameraData.setZoomLevel(8.0); } QDeclarativeGeoMap::~QDeclarativeGeoMap() @@ -275,6 +275,29 @@ void QDeclarativeGeoMap::setError(QGeoServiceProvider::Error error, const QStrin emit errorChanged(); } +void QDeclarativeGeoMap::initialize() +{ + // try to keep center change signal in the end + bool centerHasChanged = false; + + setMinimumZoomLevel(m_map->minimumZoomForMapSize(width(), height())); + + // set latitude bundary check + m_maximumViewportLatitude = m_map->maximumLatitudeForZoom(m_cameraData.zoomLevel()); + QGeoCoordinate center = m_cameraData.center(); + center.setLatitude(qBound(-m_maximumViewportLatitude, center.latitude(), m_maximumViewportLatitude)); + + if (center != m_cameraData.center()) { + centerHasChanged = true; + m_cameraData.setCenter(center); + } + + m_map->setCameraData(m_cameraData); + + if (centerHasChanged) + emit centerChanged(m_cameraData.center()); +} + /*! \internal */ @@ -475,7 +498,6 @@ void QDeclarativeGeoMap::mappingManagerInitialized() m_map = m_mappingManager->createMap(this); m_gestureArea->setMap(m_map); - m_map->setActiveMapType(QGeoMapType()); QList<QGeoMapType> types = m_mappingManager->supportedMapTypes(); for (int i = 0; i < types.size(); ++i) { QDeclarativeGeoMapType *type = new QDeclarativeGeoMapType(types[i], this); @@ -486,16 +508,10 @@ void QDeclarativeGeoMap::mappingManagerInitialized() QDeclarativeGeoMapType *type = m_supportedMapTypes.at(0); m_activeMapType = type; m_map->setActiveMapType(type->mapType()); + } else { + m_map->setActiveMapType(m_activeMapType->mapType()); } - // Map tiles are built in this call. m_map->minimumZoom() becomes operational - // after this has been called at least once, after creation. - m_map->resize(width(), height()); - - // once mappingManagerInitilized_ is set, zoomLevel() returns the default initialised - // zoom level of the map (controller). Overwrite it here to whatever the user chose. - m_map->mapController()->setZoom(m_zoomLevel); - //The zoom level limits are only restricted by the plugins values, if the user has set a more //strict zoom level limit before initialization nothing is done here. //minimum zoom level might be changed to limit gray bundaries @@ -506,8 +522,14 @@ void QDeclarativeGeoMap::mappingManagerInitialized() || m_mappingManager->cameraCapabilities().maximumZoomLevel() < m_gestureArea->maximumZoomLevel()) setMaximumZoomLevel(m_mappingManager->cameraCapabilities().maximumZoomLevel()); - // Finally, set the center too - m_map->mapController()->setCenter(m_center); + + // Map tiles are built in this call. m_map->minimumZoom() becomes operational + // after this has been called at least once, after creation. + + if (width() > 0 && height() > 0) { + m_map->resize(width(), height()); + initialize(); + } m_copyrights = new QDeclarativeGeoMapCopyrightNotice(this); connect(m_map, SIGNAL(copyrightsChanged(QImage)), @@ -521,15 +543,6 @@ void QDeclarativeGeoMap::mappingManagerInitialized() SIGNAL(updateRequired()), this, SLOT(update())); - connect(m_map->mapController(), - SIGNAL(centerChanged(QGeoCoordinate)), - this, - SIGNAL(centerChanged(QGeoCoordinate))); - connect(m_map->mapController(), - SIGNAL(zoomChanged(qreal)), - this, - SLOT(mapZoomLevelChanged(qreal))); - // set visibility of copyright notice m_copyrights->setCopyrightsVisible(m_copyrightsVisible); @@ -540,7 +553,6 @@ void QDeclarativeGeoMap::mappingManagerInitialized() emit minimumZoomLevelChanged(); emit maximumZoomLevelChanged(); - emit zoomLevelChanged(m_zoomLevel); emit supportedMapTypesChanged(); emit activeMapTypeChanged(); @@ -569,11 +581,14 @@ QDeclarativeGeoServiceProvider *QDeclarativeGeoMap::plugin() const */ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel) { - if (m_gestureArea && minimumZoomLevel >= 0) { + + if (minimumZoomLevel >= 0) { qreal oldMinimumZoomLevel = this->minimumZoomLevel(); - if (m_mappingManagerInitialized) { - minimumZoomLevel = qBound(m_map->minimumZoom(),minimumZoomLevel,m_mappingManager->cameraCapabilities().maximumZoomLevel()); - } + if (m_mappingManagerInitialized) + minimumZoomLevel = qBound(m_mappingManager->cameraCapabilities().minimumZoomLevel(), minimumZoomLevel, maximumZoomLevel()); + double minimumViewportZoomLevel = m_map->minimumZoomForMapSize(width(),height()); + if (minimumZoomLevel < minimumViewportZoomLevel) + minimumZoomLevel = minimumViewportZoomLevel; m_gestureArea->setMinimumZoomLevel(minimumZoomLevel); @@ -616,11 +631,10 @@ qreal QDeclarativeGeoMap::minimumZoomLevel() const */ void QDeclarativeGeoMap::setMaximumZoomLevel(qreal maximumZoomLevel) { - if (m_gestureArea && maximumZoomLevel >= 0) { + if (maximumZoomLevel >= 0) { qreal oldMaximumZoomLevel = this->maximumZoomLevel(); - if (m_mappingManagerInitialized) { - maximumZoomLevel = qBound(m_map->minimumZoom(),double(maximumZoomLevel),m_mappingManager->cameraCapabilities().maximumZoomLevel()); - } + if (m_mappingManagerInitialized) + maximumZoomLevel = qBound(minimumZoomLevel(), double(maximumZoomLevel), m_mappingManager->cameraCapabilities().maximumZoomLevel()); m_gestureArea->setMaximumZoomLevel(maximumZoomLevel); @@ -661,24 +675,34 @@ qreal QDeclarativeGeoMap::maximumZoomLevel() const */ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel) { - if (m_zoomLevel == zoomLevel || zoomLevel < 0) + if (m_cameraData.zoomLevel() == zoomLevel || zoomLevel < 0) return; + //small optiomatization to avoid double setCameraData + bool centerHasChanged = false; + if (m_mappingManagerInitialized) { - m_zoomLevel = qBound(minimumZoomLevel(), zoomLevel, maximumZoomLevel()); - m_map->mapController()->setZoom(m_zoomLevel); + m_cameraData.setZoomLevel(qBound(minimumZoomLevel(), zoomLevel, maximumZoomLevel())); + m_maximumViewportLatitude = m_map->maximumLatitudeForZoom(m_cameraData.zoomLevel()); + QGeoCoordinate coord = m_cameraData.center(); + coord.setLatitude(qBound(-m_maximumViewportLatitude, coord.latitude(), m_maximumViewportLatitude)); + if (coord != m_cameraData.center()) { + centerHasChanged = true; + m_cameraData.setCenter(coord); + } + m_map->setCameraData(m_cameraData); } else { - m_zoomLevel = zoomLevel; + m_cameraData.setZoomLevel(zoomLevel); } - emit zoomLevelChanged(zoomLevel); + + if (centerHasChanged) + emit centerChanged(m_cameraData.center()); + emit zoomLevelChanged(m_cameraData.zoomLevel()); } qreal QDeclarativeGeoMap::zoomLevel() const { - if (m_mappingManagerInitialized) - return m_map->mapController()->zoom(); - else - return m_zoomLevel; + return m_cameraData.zoomLevel(); } /*! @@ -691,28 +715,27 @@ qreal QDeclarativeGeoMap::zoomLevel() const */ void QDeclarativeGeoMap::setCenter(const QGeoCoordinate ¢er) { - if (!m_mappingManagerInitialized && center == m_center) + if (center == m_cameraData.center()) return; if (!center.isValid()) return; - m_center = center; - - if (m_center.isValid() && m_mappingManagerInitialized) { - m_map->mapController()->setCenter(m_center); - update(); + if (m_mappingManagerInitialized) { + QGeoCoordinate coord(center); + coord.setLatitude(qBound(-m_maximumViewportLatitude, center.latitude(), m_maximumViewportLatitude)); + m_cameraData.setCenter(coord); + m_map->setCameraData(m_cameraData); } else { - emit centerChanged(m_center); + m_cameraData.setCenter(center); } + + emit centerChanged(m_cameraData.center()); } QGeoCoordinate QDeclarativeGeoMap::center() const { - if (m_mappingManagerInitialized) - return m_map->mapController()->center(); - else - return m_center; + return m_cameraData.center(); } @@ -869,22 +892,11 @@ void QDeclarativeGeoMap::fitViewportToGeoShape() qreal newZoom = std::log10(zoomRatio) / std::log10(0.5); - newZoom = std::floor(qMax(minimumZoomLevel(), (m_map->mapController()->zoom() + newZoom))); + newZoom = std::floor(qMax(minimumZoomLevel(), (zoomLevel() + newZoom))); setProperty("zoomLevel", QVariant::fromValue(newZoom)); } /*! - \internal -*/ -void QDeclarativeGeoMap::mapZoomLevelChanged(qreal zoom) -{ - if (zoom == m_zoomLevel) - return; - m_zoomLevel = zoom; - emit zoomLevelChanged(m_zoomLevel); -} - -/*! \qmlproperty list<MapType> QtLocation::Map::supportedMapTypes This read-only property holds the set of \l{MapType}{map types} supported by this map. @@ -943,7 +955,12 @@ void QDeclarativeGeoMap::pan(int dx, int dy) { if (!m_mappingManagerInitialized) return; - m_map->mapController()->pan(dx, dy); + if (dx == 0 && dy == 0) + return; + QGeoCoordinate coord = m_map->itemPositionToCoordinate( + QDoubleVector2D(m_map->width() / 2 + dx, + m_map->height() / 2 + dy)); + setCenter(coord); } @@ -1218,14 +1235,19 @@ QDeclarativeGeoMapType * QDeclarativeGeoMap::activeMapType() const void QDeclarativeGeoMap::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { m_gestureArea->setSize(newGeometry.size()); + QQuickItem::geometryChanged(newGeometry, oldGeometry); - if (!m_mappingManagerInitialized) + if (!m_mappingManagerInitialized || !newGeometry.size().isValid()) return; m_map->resize(newGeometry.width(), newGeometry.height()); - //Them minimum allowed zoom level to limit gray bundaries might have changed - setMinimumZoomLevel(m_map->minimumZoom()); - QQuickItem::geometryChanged(newGeometry, oldGeometry); + + + if (!oldGeometry.size().isValid()) // TBD: see following commit + initialize(); + else + setMinimumZoomLevel(m_map->minimumZoomForMapSize(newGeometry.width(), newGeometry.height())); + /*! The fitViewportTo*() functions depend on a valid map geometry. @@ -1343,7 +1365,7 @@ void QDeclarativeGeoMap::fitViewportToMapItemsRefine(bool refine) zoomRatio = bboxHeight / height(); qreal newZoom = std::log10(zoomRatio) / std::log10(0.5); - newZoom = std::floor(qMax(minimumZoomLevel(), (m_map->mapController()->zoom() + newZoom))); + newZoom = std::floor(qMax(minimumZoomLevel(), (zoomLevel() + newZoom))); setProperty("zoomLevel", QVariant::fromValue(newZoom)); // as map quick items retain the same screen size after the camera zooms in/out diff --git a/src/imports/location/qdeclarativegeomap_p.h b/src/imports/location/qdeclarativegeomap_p.h index 06c39640..3db1aed2 100644 --- a/src/imports/location/qdeclarativegeomap_p.h +++ b/src/imports/location/qdeclarativegeomap_p.h @@ -168,10 +168,9 @@ protected: void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; void setError(QGeoServiceProvider::Error error, const QString &errorString); - + void initialize(); private Q_SLOTS: void mappingManagerInitialized(); - void mapZoomLevelChanged(qreal zoom); void pluginReady(); void onMapChildrenChanged(); @@ -186,7 +185,6 @@ private: QDeclarativeGeoServiceProvider *m_plugin; QGeoServiceProvider *m_serviceProvider; QGeoMappingManager *m_mappingManager; - QGeoCoordinate m_center; QDeclarativeGeoMapType *m_activeMapType; QList<QDeclarativeGeoMapType *> m_supportedMapTypes; QList<QDeclarativeGeoMapItemView *> m_mapViews; @@ -197,13 +195,14 @@ private: QMutex m_updateMutex; QString m_errorString; QGeoServiceProvider::Error m_error; - qreal m_zoomLevel; QGeoShape m_region; QColor m_color; + QGeoCameraData m_cameraData; bool m_componentCompleted; bool m_mappingManagerInitialized; bool m_pendingFitViewport; bool m_copyrightsVisible; + double m_maximumViewportLatitude; friend class QDeclarativeGeoMapItem; friend class QDeclarativeGeoMapItemView; diff --git a/src/imports/location/qquickgeomapgesturearea.cpp b/src/imports/location/qquickgeomapgesturearea.cpp index 629c9658..1a3b3c16 100644 --- a/src/imports/location/qquickgeomapgesturearea.cpp +++ b/src/imports/location/qquickgeomapgesturearea.cpp @@ -36,7 +36,6 @@ #include "qquickgeomapgesturearea_p.h" #include "qdeclarativegeomap_p.h" -#include "qgeomapcontroller_p.h" #include "error_messages.h" #include <QtGui/QGuiApplication> @@ -325,7 +324,7 @@ void QQuickGeoMapGestureArea::setMap(QGeoMap *map) m_map = map; m_flick.m_animation = new QQuickGeoCoordinateAnimation(this); - m_flick.m_animation->setTargetObject(m_map->mapController()); + m_flick.m_animation->setTargetObject(m_declarativeMap); m_flick.m_animation->setProperty(QStringLiteral("center")); m_flick.m_animation->setEasing(QEasingCurve(QEasingCurve::OutQuad)); connect(m_flick.m_animation, &QQuickAbstractAnimation::stopped, this, &QQuickGeoMapGestureArea::handleFlickAnimationStopped); @@ -701,7 +700,7 @@ void QQuickGeoMapGestureArea::handleWheelEvent(QWheelEvent *event) QPointF mapCenterPoint(m_map->width() / 2.0 + dx, m_map->height() / 2.0 + dy); QGeoCoordinate mapCenterCoordinate = m_map->itemPositionToCoordinate(QDoubleVector2D(mapCenterPoint), false); - m_map->mapController()->setCenter(mapCenterCoordinate); + m_declarativeMap->setCenter(mapCenterCoordinate); } event->accept(); } @@ -1152,7 +1151,7 @@ void QQuickGeoMapGestureArea::updatePan() mapCenterPoint.setY(m_map->height() / 2.0 - dy); mapCenterPoint.setX(m_map->width() / 2.0 - dx); QGeoCoordinate animationStartCoordinate = m_map->itemPositionToCoordinate(QDoubleVector2D(mapCenterPoint), false); - m_map->mapController()->setCenter(animationStartCoordinate); + m_declarativeMap->setCenter(animationStartCoordinate); } /*! @@ -1207,14 +1206,14 @@ void QQuickGeoMapGestureArea::startFlick(int dx, int dy, int timeMs) if (timeMs < 0) return; - QGeoCoordinate animationStartCoordinate = m_map->mapController()->center(); + QGeoCoordinate animationStartCoordinate = m_declarativeMap->center(); if (m_flick.m_animation->isRunning()) m_flick.m_animation->stop(); - QGeoCoordinate animationEndCoordinate = m_map->mapController()->center(); + QGeoCoordinate animationEndCoordinate = m_declarativeMap->center(); m_flick.m_animation->setDuration(timeMs); - double zoom = pow(2.0, m_map->mapController()->zoom()); + double zoom = pow(2.0, m_declarativeMap->zoomLevel()); double longitude = animationStartCoordinate.longitude() - (dx / zoom); double latitude = animationStartCoordinate.latitude() + (dy / zoom); diff --git a/src/location/maps/maps.pri b/src/location/maps/maps.pri index 69e6f62b..c8e28bab 100644 --- a/src/location/maps/maps.pri +++ b/src/location/maps/maps.pri @@ -25,7 +25,6 @@ PRIVATE_HEADERS += \ maps/qgeocodingmanagerengine_p.h \ maps/qgeocodingmanager_p.h \ maps/qgeomaneuver_p.h \ - maps/qgeomapcontroller_p.h \ maps/qgeotiledmapscene_p.h \ maps/qgeotilerequestmanager_p.h \ maps/qgeomap_p.h \ @@ -65,7 +64,6 @@ SOURCES += \ maps/qgeocodingmanager.cpp \ maps/qgeocodingmanagerengine.cpp \ maps/qgeomaneuver.cpp \ - maps/qgeomapcontroller.cpp \ maps/qgeotilerequestmanager.cpp \ maps/qgeomap.cpp \ maps/qgeomappingmanager.cpp \ diff --git a/src/location/maps/qgeocameradata.cpp b/src/location/maps/qgeocameradata.cpp index a45d855a..23586082 100644 --- a/src/location/maps/qgeocameradata.cpp +++ b/src/location/maps/qgeocameradata.cpp @@ -59,11 +59,11 @@ public: QGeoCameraDataPrivate::QGeoCameraDataPrivate() : QSharedData(), - m_center(-27.5, 153), + m_center(0, 0), m_bearing(0.0), m_tilt(0.0), m_roll(0.0), - m_zoomLevel(9.0) {} + m_zoomLevel(0.0) {} QGeoCameraDataPrivate::QGeoCameraDataPrivate(const QGeoCameraDataPrivate &rhs) : QSharedData(rhs), diff --git a/src/location/maps/qgeomap.cpp b/src/location/maps/qgeomap.cpp index 4cc2bbfe..7817553c 100644 --- a/src/location/maps/qgeomap.cpp +++ b/src/location/maps/qgeomap.cpp @@ -37,8 +37,8 @@ #include "qgeomap_p.h" #include "qgeomap_p_p.h" #include "qgeocameracapabilities_p.h" -#include "qgeomapcontroller_p.h" #include "qgeomappingmanagerengine_p.h" +#include <QDebug> QT_BEGIN_NAMESPACE @@ -51,14 +51,6 @@ QGeoMap::~QGeoMap() { } -QGeoMapController *QGeoMap::mapController() -{ - Q_D(QGeoMap); - if (!d->m_controller) - d->m_controller = new QGeoMapController(this); - return d->m_controller; -} - void QGeoMap::resize(int width, int height) { Q_D(QGeoMap); @@ -119,11 +111,6 @@ const QGeoMapType QGeoMap::activeMapType() const return d->m_activeMapType; } -double QGeoMap::minimumZoom() const -{ - Q_D(const QGeoMap); - return d->m_minimumZoom; -} QGeoCameraCapabilities QGeoMap::cameraCapabilities() const { @@ -149,9 +136,7 @@ QGeoMapPrivate::QGeoMapPrivate(QGeoMappingManagerEngine *engine) m_width(0), m_height(0), m_aspectRatio(0.0), - m_minimumZoom(0.0), m_engine(engine), - m_controller(0), m_activeMapType(QGeoMapType()) { } @@ -169,31 +154,6 @@ void QGeoMapPrivate::setCameraData(const QGeoCameraData &cameraData) QGeoCameraData oldCameraData = m_cameraData; m_cameraData = cameraData; - if (!m_engine.isNull()) { - QGeoCameraCapabilities capabilities = m_engine->cameraCapabilities(); - if (m_cameraData.zoomLevel() < capabilities.minimumZoomLevel()) - m_cameraData.setZoomLevel(capabilities.minimumZoomLevel()); - - if (m_cameraData.zoomLevel() > capabilities.maximumZoomLevel()) - m_cameraData.setZoomLevel(capabilities.maximumZoomLevel()); - - if (!capabilities.supportsBearing()) - m_cameraData.setBearing(0.0); - - if (capabilities.supportsTilting()) { - if (m_cameraData.tilt() < capabilities.minimumTilt()) - m_cameraData.setTilt(capabilities.minimumTilt()); - - if (m_cameraData.tilt() > capabilities.maximumTilt()) - m_cameraData.setTilt(capabilities.maximumTilt()); - } else { - m_cameraData.setTilt(0.0); - } - - if (!capabilities.supportsRolling()) - m_cameraData.setRoll(0.0); - } - // Do not call this expensive function if the width is 0, since it will get called // anyway when it is resized to a width > 0. // this is mainly an optimization to the initialization of the geomap, which would otherwise diff --git a/src/location/maps/qgeomap_p.h b/src/location/maps/qgeomap_p.h index 7747347f..e2af2eda 100644 --- a/src/location/maps/qgeomap_p.h +++ b/src/location/maps/qgeomap_p.h @@ -70,23 +70,22 @@ class Q_LOCATION_EXPORT QGeoMap : public QObject public: virtual ~QGeoMap(); - QGeoMapController *mapController(); - void resize(int width, int height); int width() const; int height() const; QGeoCameraData cameraData() const; + QGeoCameraCapabilities cameraCapabilities() const; void setActiveMapType(const QGeoMapType mapType); const QGeoMapType activeMapType() const; virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0; virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0; - double minimumZoom() const; + virtual double minimumZoomForMapSize(int width, int height) const = 0; + virtual double maximumLatitudeForZoom(double zoomLevel) const = 0; virtual void prefetchData(); virtual void clearData(); - QGeoCameraCapabilities cameraCapabilities() const; protected: QGeoMap(QGeoMapPrivate &dd, QObject *parent = 0); diff --git a/src/location/maps/qgeomap_p_p.h b/src/location/maps/qgeomap_p_p.h index 1d1c9a13..3b996ecc 100644 --- a/src/location/maps/qgeomap_p_p.h +++ b/src/location/maps/qgeomap_p_p.h @@ -77,7 +77,6 @@ protected: int m_width; int m_height; double m_aspectRatio; - double m_minimumZoom; QPointer<QGeoMappingManagerEngine> m_engine; QGeoMapController *m_controller; QGeoCameraData m_cameraData; diff --git a/src/location/maps/qgeomapcontroller.cpp b/src/location/maps/qgeomapcontroller.cpp deleted file mode 100644 index 661839fe..00000000 --- a/src/location/maps/qgeomapcontroller.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtLocation module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgeomapcontroller_p.h" - -#include "qgeomap_p.h" -#include <QtPositioning/private/qgeoprojection_p.h> - -#include <QPointF> - -QT_BEGIN_NAMESPACE - -QGeoMapController::QGeoMapController(QGeoMap *map) - : QObject(map), - map_(map) -{ - oldCameraData_ = map_->cameraData(); - - connect(map_, - SIGNAL(cameraDataChanged(QGeoCameraData)), - this, - SLOT(cameraDataChanged(QGeoCameraData))); -} - -QGeoMapController::~QGeoMapController() {} - -void QGeoMapController::cameraDataChanged(const QGeoCameraData &cameraData) -{ - if (oldCameraData_.center() != cameraData.center()) - emit centerChanged(cameraData.center()); - - if (oldCameraData_.bearing() != cameraData.bearing()) - emit bearingChanged(cameraData.bearing()); - - if (oldCameraData_.tilt() != cameraData.tilt()) - emit tiltChanged(cameraData.tilt()); - - if (oldCameraData_.roll() != cameraData.roll()) - emit rollChanged(cameraData.roll()); - - if (oldCameraData_.zoomLevel() != cameraData.zoomLevel()) - emit zoomChanged(cameraData.zoomLevel()); - - oldCameraData_ = cameraData; -} - -QGeoCoordinate QGeoMapController::center() const -{ - return map_->cameraData().center(); -} - -void QGeoMapController::setCenter(const QGeoCoordinate ¢er) -{ - QGeoCameraData cd = map_->cameraData(); - - if (center == cd.center()) - return; - - cd.setCenter(center); - map_->setCameraData(cd); -} - -void QGeoMapController::setLatitude(qreal latitude) -{ - QGeoCameraData cd = map_->cameraData(); - - if (latitude == cd.center().latitude()) - return; - - QGeoCoordinate coord(latitude, cd.center().longitude(), cd.center().altitude()); - cd.setCenter(coord); - map_->setCameraData(cd); -} - -void QGeoMapController::setLongitude(qreal longitude) -{ - QGeoCameraData cd = map_->cameraData(); - - if (longitude == cd.center().longitude()) - return; - - QGeoCoordinate coord(cd.center().latitude(), longitude, cd.center().altitude()); - cd.setCenter(coord); - map_->setCameraData(cd); -} - - -void QGeoMapController::setAltitude(qreal altitude) -{ - QGeoCameraData cd = map_->cameraData(); - - if (altitude == cd.center().altitude()) - return; - - QGeoCoordinate coord(cd.center().latitude(), cd.center().longitude(), altitude); - cd.setCenter(coord); - map_->setCameraData(cd); -} - -qreal QGeoMapController::bearing() const -{ - return map_->cameraData().bearing(); -} - -void QGeoMapController::setBearing(qreal bearing) -{ - QGeoCameraData cd = map_->cameraData(); - - if (bearing == cd.bearing()) - return; - - cd.setBearing(bearing); - map_->setCameraData(cd); -} - -qreal QGeoMapController::tilt() const -{ - return map_->cameraData().tilt(); -} - -void QGeoMapController::setTilt(qreal tilt) -{ - QGeoCameraData cd = map_->cameraData(); - - if (tilt == cd.tilt()) - return; - - cd.setTilt(tilt); - map_->setCameraData(cd); -} - -qreal QGeoMapController::roll() const -{ - return map_->cameraData().roll(); -} - -void QGeoMapController::setRoll(qreal roll) -{ - QGeoCameraData cd = map_->cameraData(); - - if (roll == cd.roll()) - return; - - cd.setRoll(roll); - map_->setCameraData(cd); -} - -qreal QGeoMapController::zoom() const -{ - return map_->cameraData().zoomLevel(); -} - -void QGeoMapController::setZoom(qreal zoom) -{ - QGeoCameraData cd = map_->cameraData(); - - if (zoom == cd.zoomLevel()) - return; - - cd.setZoomLevel(zoom); - map_->setCameraData(cd); -} - -void QGeoMapController::pan(qreal dx, qreal dy) -{ - if (dx == 0 && dy == 0) - return; - QGeoCameraData cd = map_->cameraData(); - QGeoCoordinate coord = map_->itemPositionToCoordinate( - QDoubleVector2D(map_->width() / 2 + dx, - map_->height() / 2 + dy)); - - - // keep altitude as it was - coord.setAltitude(cd.center().altitude()); - if (coord.isValid()) { - cd.setCenter(coord); - map_->setCameraData(cd); - } -} - -QT_END_NAMESPACE diff --git a/src/location/maps/qgeomapcontroller_p.h b/src/location/maps/qgeomapcontroller_p.h deleted file mode 100644 index 06f2b926..00000000 --- a/src/location/maps/qgeomapcontroller_p.h +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtLocation module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef QGEOMAPCONTROLLER_P_H -#define QGEOMAPCONTROLLER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QObject> - -#include "qgeocoordinate.h" -#include "qgeocameradata_p.h" - -QT_BEGIN_NAMESPACE - -class QGeoMap; - - -class Q_LOCATION_EXPORT QGeoMapController : public QObject -{ - Q_OBJECT - - Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) - Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged) - Q_PROPERTY(qreal tilt READ tilt WRITE setTilt NOTIFY tiltChanged) - Q_PROPERTY(qreal roll READ roll WRITE setRoll NOTIFY rollChanged) - Q_PROPERTY(qreal zoom READ zoom WRITE setZoom NOTIFY zoomChanged) - -public: - QGeoMapController(QGeoMap *map); - ~QGeoMapController(); - - QGeoCoordinate center() const; - void setCenter(const QGeoCoordinate ¢er); - - void setLatitude(qreal latitude); - void setLongitude(qreal longitude); - void setAltitude(qreal altitude); - - qreal bearing() const; - void setBearing(qreal bearing); - - qreal tilt() const; - void setTilt(qreal tilt); - - qreal roll() const; - void setRoll(qreal roll); - - qreal zoom() const; - void setZoom(qreal zoom); - - void pan(qreal dx, qreal dy); - -private Q_SLOTS: - void cameraDataChanged(const QGeoCameraData &cameraData); - -Q_SIGNALS: - void centerChanged(const QGeoCoordinate ¢er); - void bearingChanged(qreal bearing); - void tiltChanged(qreal tilt); - void rollChanged(qreal roll); - void zoomChanged(qreal zoom); - -private: - QGeoMap *map_; - QGeoCameraData oldCameraData_; -}; - -QT_END_NAMESPACE - -#endif // QGEOMAPCONTROLLER_P_H diff --git a/src/location/maps/qgeotiledmap.cpp b/src/location/maps/qgeotiledmap.cpp index 3705bfca..13d01fc6 100644 --- a/src/location/maps/qgeotiledmap.cpp +++ b/src/location/maps/qgeotiledmap.cpp @@ -103,19 +103,6 @@ QSGNode *QGeoTiledMap::updateSceneGraph(QSGNode *oldNode, QQuickWindow *window) return d->updateSceneGraph(oldNode, window); } -// This method returns the minimum zoom level that this specific qgeomap type allows -// at a given canvas size (width,height) and for a given tile size (usually 256). -double QGeoTiledMap::minimumZoomLevel(int width, int height, int tileSize) const -{ - double maxSize = qMax(width,height); - double numTiles = maxSize / tileSize; - double minZoom = std::log(numTiles) / std::log(2.0); - const QGeoCameraCapabilities capa = cameraCapabilities(); - if (capa.isValid()) - minZoom = qMax(minZoom, capa.minimumZoomLevel()); - return minZoom; -} - void QGeoTiledMap::prefetchData() { Q_D(QGeoTiledMap); @@ -175,6 +162,38 @@ QDoubleVector2D QGeoTiledMap::coordinateToItemPosition(const QGeoCoordinate &coo return pos; } +// This method returns the minimum zoom level that this specific qgeomap type allows +// at a given canvas size (width,height) and for a given tile size (usually 256). +double QGeoTiledMap::minimumZoomForMapSize(int width, int height) const +{ + Q_D(const QGeoTiledMap); + double maxSize = qMax(width,height); + double numTiles = maxSize / d->m_visibleTiles->tileSize(); + return std::log(numTiles) / std::log(2.0); +} + +// This method recalculates the "no-trespassing" limits for the map center. +// This has to be done when: +// 1) the map is resized, because the meters per pixel remain the same, but +// the amount of pixels between the center and the borders changes +// 2) when the zoom level changes, because the amount of pixels between the center +// and the borders stays the same, but the meters per pixel change +double QGeoTiledMap::maximumLatitudeForZoom(double zoomLevel) const +{ + Q_D(const QGeoTiledMap); + double mapEdgeSize = std::pow(2.0,zoomLevel); + mapEdgeSize *= d->m_visibleTiles->tileSize(); + + // At init time weird things happen + int clampedWindowHeight = (d->m_height > mapEdgeSize) ? mapEdgeSize : d->m_height; + + // Use the window height divided by 2 as the topmost allowed center, with respect to the map size in pixels + double mercatorTopmost = (clampedWindowHeight * 0.5) / mapEdgeSize ; + QGeoCoordinate topMost = QGeoProjection::mercatorToCoord(QDoubleVector2D(0.0,mercatorTopmost)); + + return topMost.latitude(); +} + QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine) : QGeoMapPrivate(engine), m_cache(engine->tileCache()), @@ -184,8 +203,7 @@ QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine) m_tileRequests(0), m_maxZoomLevel(static_cast<int>(std::ceil(engine->cameraCapabilities().maximumZoomLevel()))), m_minZoomLevel(static_cast<int>(std::ceil(engine->cameraCapabilities().minimumZoomLevel()))), - m_prefetchStyle(QGeoTiledMap::PrefetchTwoNeighbourLayers), - m_centerLatitudinalBound(0.0) + m_prefetchStyle(QGeoTiledMap::PrefetchTwoNeighbourLayers) { int tileSize = engine->tileSize().width(); QString pluginString(engine->managerName() + QLatin1Char('_') + QString::number(engine->managerVersion())); @@ -208,7 +226,6 @@ QGeoTiledMapPrivate::~QGeoTiledMapPrivate() // However: how to ensure this is done in rendering thread? } - void QGeoTiledMapPrivate::prefetchTiles() { if (m_tileRequests) { @@ -264,6 +281,8 @@ void QGeoTiledMapPrivate::prefetchTiles() void QGeoTiledMapPrivate::changeCameraData(const QGeoCameraData &oldCameraData) { + Q_UNUSED(oldCameraData) // TODO: taking care in following commit + // For zoomlevel, "snap" 0.01 either side of a whole number. // This is so that when we turn off bilinear scaling, we're // snapped to the exact pixel size of the tiles @@ -277,24 +296,6 @@ void QGeoTiledMapPrivate::changeCameraData(const QGeoCameraData &oldCameraData) m_cameraData.setZoomLevel(izl); } - double oldZoomLevel = oldCameraData.zoomLevel(); - if (m_cameraData.zoomLevel() != oldZoomLevel) { - // Zoom level changed: recompute latitudinal border for the center - updateCenterLatitudinalBound(m_visibleTiles->tileSize(),m_cameraData.zoomLevel()); - } - - QGeoCoordinate coord = m_cameraData.center(); - if (coord.isValid()) { - double lat = coord.latitude(); - if (m_mapScene->verticalLock()) - lat = oldCameraData.center().latitude(); - - // Clamp center latitude to prevent gray borders - lat = qBound(-m_centerLatitudinalBound, lat, m_centerLatitudinalBound); - coord.setLatitude(lat); - } - m_cameraData.setCenter(coord); - m_visibleTiles->setCameraData(m_cameraData); m_mapScene->setCameraData(m_cameraData); @@ -324,27 +325,6 @@ void QGeoTiledMapPrivate::updateScene() q->update(); } -// This method recalculates the "no-trespassing" limits for the map center. -// This has to be done when: -// 1) the map is resized, because the meters per pixel remain the same, but -// the amount of pixels between the center and the borders changes -// 2) when the zoom level changes, because the amount of pixels between the center -// and the borders stays the same, but the meters per pixel change -void QGeoTiledMapPrivate::updateCenterLatitudinalBound(int tileSize, double zoomLevel) -{ - double mapEdgeSize = std::pow(2.0,zoomLevel); - mapEdgeSize *= tileSize; - - // At init time weird things happen - int clampedWindowHeight = (m_height > mapEdgeSize) ? mapEdgeSize : m_height; - - // Use the window height divided by 2 as the topmost allowed center, with respect to the map size in pixels - double mercatorTopmost = (clampedWindowHeight * 0.5) / mapEdgeSize ; - QGeoCoordinate topMost = QGeoProjection::mercatorToCoord(QDoubleVector2D(0.0,mercatorTopmost)); - - m_centerLatitudinalBound = topMost.latitude(); -} - void QGeoTiledMapPrivate::changeActiveMapType(const QGeoMapType mapType) { m_visibleTiles->setMapType(mapType); @@ -365,21 +345,6 @@ void QGeoTiledMapPrivate::mapResized(int width, int height) m_mapScene->setScreenSize(QSize(width, height)); m_visibleTiles->setScreenSize(QSize(width, height)); m_prefetchTiles->setScreenSize(QSize(width, height)); - // Keep the following step order: - // 1) Update the minimum zoom level - m_minimumZoom = q->minimumZoomLevel(width, height, m_visibleTiles->tileSize()); - - // 2) clamp the current zoom level in the camera data, which will have to be - // propagated in the QDeclarativeGeoMap - QGeoCameraData camData = q->cameraData(); - double zoomLevel = camData.zoomLevel(); - zoomLevel = qMax(m_minimumZoom,zoomLevel); // The correct zoom level. Will be set later - - // 3) Since the map size changed, recompute latitudinal bound for the center. - // This is re-done, despite being already in changeCameraData, because - // changeCameraData triggers it only on zoomLevel changed, which might not - // be the case. - updateCenterLatitudinalBound(m_visibleTiles->tileSize(), zoomLevel); if (width > 0 && height > 0 && m_cache) { // absolute minimum size: one tile each side of display, 32-bit colour @@ -394,6 +359,7 @@ void QGeoTiledMapPrivate::mapResized(int width, int height) int newSize = qMax(m_cache->minTextureUsage(), texCacheSize); m_cache->setMinTextureUsage(newSize); } + q->evaluateCopyrights(m_visibleTiles->createTiles()); } diff --git a/src/location/maps/qgeotiledmap_p.h b/src/location/maps/qgeotiledmap_p.h index 051264ff..6c735e86 100644 --- a/src/location/maps/qgeotiledmap_p.h +++ b/src/location/maps/qgeotiledmap_p.h @@ -86,13 +86,14 @@ public: QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const Q_DECL_OVERRIDE; QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const Q_DECL_OVERRIDE; + double minimumZoomForMapSize(int width, int height) const Q_DECL_OVERRIDE; + double maximumLatitudeForZoom(double zoomLevel) const Q_DECL_OVERRIDE; void prefetchData() Q_DECL_OVERRIDE; void clearData() Q_DECL_OVERRIDE; protected: QSGNode *updateSceneGraph(QSGNode *, QQuickWindow *window) Q_DECL_OVERRIDE; virtual void evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles); - double minimumZoomLevel(int width, int height, int tileSize) const; private Q_SLOTS: void handleTileVersionChanged(); diff --git a/src/location/maps/qgeotiledmap_p_p.h b/src/location/maps/qgeotiledmap_p_p.h index 6a7ceec9..d0c7b9d6 100644 --- a/src/location/maps/qgeotiledmap_p_p.h +++ b/src/location/maps/qgeotiledmap_p_p.h @@ -90,7 +90,6 @@ protected: private: void updateScene(); - void updateCenterLatitudinalBound(int tileSize, double zoomLevel); private: QAbstractGeoTileCache *m_cache; @@ -101,7 +100,7 @@ private: int m_maxZoomLevel; int m_minZoomLevel; QGeoTiledMap::PrefetchStyle m_prefetchStyle; - double m_centerLatitudinalBound; + bool m_geomoteryUpdated; Q_DISABLE_COPY(QGeoTiledMapPrivate) }; diff --git a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp index 98777d09..d83ad0f9 100644 --- a/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp +++ b/src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp @@ -36,7 +36,6 @@ #include "qgeotiledmap_nokia.h" #include "qgeotiledmappingmanagerengine_nokia.h" -#include "qgeomapcontroller_p.h" #include <QDebug> #include <QObject> @@ -71,7 +70,7 @@ void QGeoTiledMapNokia::evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTile if (m_engine.isNull()) return; - const QString copyrightsString = m_engine->evaluateCopyrightsText(activeMapType(), mapController()->zoom(), visibleTiles); + const QString copyrightsString = m_engine->evaluateCopyrightsText(activeMapType(), cameraData().zoomLevel(), visibleTiles); if (width() > 0 && height() > 0 && ((copyrightsString.isNull() && m_copyrightsSlab.isNull()) || copyrightsString != m_lastCopyrightsString)) { QFont font("Sans Serif"); diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 81013b2c..e3236deb 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -53,7 +53,6 @@ qtHaveModule(location) { qgeotiledmap \ qgeotilespec \ qgeoroutexmlparser \ - qgeomapcontroller \ maptype \ nokia_services \ qgeocameratiles diff --git a/tests/auto/declarative_ui/tst_map.qml b/tests/auto/declarative_ui/tst_map.qml index c6620635..5f02962d 100644 --- a/tests/auto/declarative_ui/tst_map.qml +++ b/tests/auto/declarative_ui/tst_map.qml @@ -128,6 +128,41 @@ Item { compare(map.center.latitude, 12) } + function test_map_clamp() + { + //valid + map.center = QtPositioning.coordinate(10.0, 20.5, 30.8) + map.zoomLevel = 2.0 + + compare(map.center.latitude, 10) + compare(map.center.longitude, 20.5) + compare(map.center.altitude, 30.8) + + //negative values + map.center = QtPositioning.coordinate(-50, -20, 100) + map.zoomLevel = 1.0 + + compare(map.center.latitude, -50) + compare(map.center.longitude, -20) + compare(map.center.altitude, 100) + + //clamped center negative + map.center = QtPositioning.coordinate(-89, -45, 0) + map.zoomLevel = 1.0 + + fuzzyCompare(map.center.latitude, -80.8728, 0.001) + compare(map.center.longitude, -45) + compare(map.center.altitude, 0) + + //clamped center positive + map.center = QtPositioning.coordinate(86, 38, 0) + map.zoomLevel = 1.0 + + fuzzyCompare(map.center.latitude, 80.8728, 0.001) + compare(map.center.longitude, 38) + compare(map.center.altitude, 0) + } + function test_zoom_limits() { map.center.latitude = 30 diff --git a/tests/auto/qgeomapcontroller/qgeomapcontroller.pro b/tests/auto/qgeomapcontroller/qgeomapcontroller.pro deleted file mode 100644 index 545d41f5..00000000 --- a/tests/auto/qgeomapcontroller/qgeomapcontroller.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -CONFIG += testcase -TARGET = tst_qgeomapcontroller - -SOURCES += tst_qgeomapcontroller.cpp - -QT += location-private positioning-private testlib diff --git a/tests/auto/qgeomapcontroller/tst_qgeomapcontroller.cpp b/tests/auto/qgeomapcontroller/tst_qgeomapcontroller.cpp deleted file mode 100644 index a5650e42..00000000 --- a/tests/auto/qgeomapcontroller/tst_qgeomapcontroller.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/QString> -#include <QtTest/QtTest> -#include <QtTest/QSignalSpy> -#include <QtLocation/QGeoServiceProvider> -#include <QtLocation/private/qgeotiledmap_p.h> -#include <QtLocation/private/qgeomappingmanager_p.h> -#include <QtLocation/private/qgeomapcontroller_p.h> -#include <QtLocation/private/qgeocameracapabilities_p.h> -#include <cmath> /* for std::abs(double) */ - -QT_USE_NAMESPACE - -class QGeoTiledMapTest: public QGeoTiledMap -{ - Q_OBJECT -public: - QGeoTiledMapTest(QGeoTiledMappingManagerEngine *engine, QObject *parent = 0) - : QGeoTiledMap(engine, parent) {} -public: - using QGeoTiledMap::setCameraData; -}; - -class tst_QGeoMapController : public QObject -{ - Q_OBJECT - -public: - tst_QGeoMapController(); - ~tst_QGeoMapController(); - -private: - void clearSignalSpies(); - -private Q_SLOTS: - void initTestCase(); - void signalsConstructedTest(); - void constructorTest_data(); - void constructorTest(); - void centerTest(); - void bearingTest(); - void tiltTest(); - void rollTest(); - void panTest(); - void zoomTest(); - -private: - QScopedPointer<QGeoTiledMapTest> m_map; - QScopedPointer<QSignalSpy> m_signalCenterChanged; - QScopedPointer<QSignalSpy> m_signalBearingChanged; - QScopedPointer<QSignalSpy> m_signalTiltChanged; - QScopedPointer<QSignalSpy> m_signalRollChanged; - QScopedPointer<QSignalSpy> m_signalZoomChanged; -}; - -tst_QGeoMapController::tst_QGeoMapController() -{ -} - -tst_QGeoMapController::~tst_QGeoMapController() -{ -} - -void tst_QGeoMapController::initTestCase() -{ - // Set custom path since CI doesn't install test plugins -#ifdef Q_OS_WIN - QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + - QStringLiteral("/../../../../plugins")); -#else - QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + - QStringLiteral("/../../../plugins")); -#endif - QGeoServiceProvider *provider = new QGeoServiceProvider("qmlgeo.test.plugin"); - provider->setAllowExperimental(true); - QGeoMappingManager *mappingManager = provider->mappingManager(); - QVERIFY2(provider->error() == QGeoServiceProvider::NoError, "Could not load plugin: " + provider->errorString().toLatin1()); - - m_map.reset(static_cast<QGeoTiledMapTest*>(mappingManager->createMap(this))); - QVERIFY(m_map); - m_map->resize(100, 100); - - m_signalCenterChanged.reset(new QSignalSpy(m_map->mapController(), &QGeoMapController::centerChanged)); - m_signalBearingChanged.reset(new QSignalSpy(m_map->mapController(), &QGeoMapController::bearingChanged)); - m_signalTiltChanged.reset(new QSignalSpy(m_map->mapController(), &QGeoMapController::tiltChanged)); - m_signalRollChanged.reset(new QSignalSpy(m_map->mapController(), &QGeoMapController::rollChanged)); - m_signalZoomChanged.reset(new QSignalSpy(m_map->mapController(), &QGeoMapController::zoomChanged)); -} - -void tst_QGeoMapController::clearSignalSpies() -{ - m_signalCenterChanged->clear(); - m_signalBearingChanged->clear(); - m_signalTiltChanged->clear(); - m_signalRollChanged->clear(); - m_signalZoomChanged->clear(); -} - -void tst_QGeoMapController::signalsConstructedTest() -{ - QVERIFY(m_signalCenterChanged->isValid()); - QVERIFY(m_signalBearingChanged->isValid()); - QVERIFY(m_signalTiltChanged->isValid()); - QVERIFY(m_signalRollChanged->isValid()); - QVERIFY(m_signalZoomChanged->isValid()); -} - -void tst_QGeoMapController::constructorTest_data() -{ - QTest::addColumn<QGeoCoordinate>("center"); - QTest::addColumn<QGeoCoordinate>("expectedCenter"); - QTest::addColumn<double>("bearing"); - QTest::addColumn<double>("tilt"); - QTest::addColumn<double>("roll"); - QTest::addColumn<double>("zoom"); - QTest::newRow("zeros") << QGeoCoordinate() << QGeoCoordinate() << 0.0 << 0.0 << 0.0 << 0.0; - QTest::newRow("valid") << QGeoCoordinate(10.0, 20.5, 30.8) << QGeoCoordinate(10.0, 20.5, 30.8) << 0.1 << 0.2 << 0.3 << 2.0; - QTest::newRow("negative values") << QGeoCoordinate(-50, -20, 100) << QGeoCoordinate(-50, -20, 100) << -0.1 << -0.2 << -0.3 << 1.0; - QTest::newRow("clamped center negative") << QGeoCoordinate(-89, -45, 0) << QGeoCoordinate(-80.8728, -45, 0) << -0.1 << -0.2 << -0.3 << 1.0; - QTest::newRow("clamped center positive") << QGeoCoordinate(86, 38, 0) << QGeoCoordinate(80.8728, 38, 0) << -0.1 << -0.2 << -0.3 << 1.0; -} - -bool almostEqual(float x, float y) // qFuzzyCompare is too strict for this test -{ - const float epsilon = 1e-5; - return std::abs(x - y) <= epsilon * std::abs(x); - // see Knuth section 4.2.2 pages 217-218 -} - -void tst_QGeoMapController::constructorTest() -{ - QFETCH(QGeoCoordinate, center); - QFETCH(QGeoCoordinate, expectedCenter); - QFETCH(double, bearing); - QFETCH(double, tilt); - QFETCH(double, roll); - QFETCH(double, zoom); - - // test whether the map controller picks up the camera data - // from the map during construction - QGeoCameraData cameraData; - cameraData.setCenter(center); - cameraData.setBearing(bearing); - cameraData.setTilt(tilt); - cameraData.setRoll(roll); - cameraData.setZoomLevel(zoom); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - - - // make sure the values come out the same - // also make sure the values match what they were actually set to - if (qIsNaN(cameraData.center().longitude())) { - QVERIFY(qIsNaN(mapController.center().longitude())); - } else { - QCOMPARE(mapController.center().longitude(), expectedCenter.longitude()); - } - if (qIsNaN(cameraData.center().altitude())) { - QVERIFY(qIsNaN(mapController.center().altitude())); - } else { - QCOMPARE(mapController.center().altitude(), expectedCenter.altitude()); - } - - // Verify that the latitude is either what was set or that it has been clamped correctly - if (qIsNaN(cameraData.center().latitude())) { - QVERIFY(qIsNaN(mapController.center().latitude())); - } else { - QVERIFY(almostEqual(mapController.center().latitude(), expectedCenter.latitude())); - } - - QCOMPARE(mapController.zoom(), cameraData.zoomLevel()); - QCOMPARE(mapController.zoom(), zoom); - - if (m_map->cameraCapabilities().supportsBearing()){ - QCOMPARE(mapController.bearing(), cameraData.bearing()); - QCOMPARE(mapController.bearing(), bearing); - } - if (m_map->cameraCapabilities().supportsTilting()){ - QCOMPARE(mapController.tilt(), cameraData.tilt()); - QCOMPARE(mapController.tilt(), tilt); - } - if (m_map->cameraCapabilities().supportsRolling()){ - QCOMPARE(mapController.roll(), cameraData.roll()); - QCOMPARE(mapController.roll(), roll); - } -} - -void tst_QGeoMapController::centerTest() -{ - QGeoCameraData cameraData; - cameraData.setCenter(QGeoCoordinate(10.0,-20.4,30.8)); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - QCOMPARE(mapController.center(),QGeoCoordinate(10.0,-20.4,30.8)); - - QGeoCoordinate coord(10.0,20.4,30.8); - clearSignalSpies(); - mapController.setCenter(coord); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),1); - QCOMPARE(m_signalBearingChanged->count(),0); - QCOMPARE(m_signalTiltChanged->count(),0); - QCOMPARE(m_signalRollChanged->count(),0); - QCOMPARE(m_signalZoomChanged->count(),0); - - QCOMPARE(mapController.center(),QGeoCoordinate(10.0,20.4,30.8)); - - mapController.setCenter(QGeoCoordinate(10.0,20.4,30.9)); - QCOMPARE(mapController.center(),QGeoCoordinate(10.0,20.4,30.9)); -} - -void tst_QGeoMapController::bearingTest() -{ - if (m_map->cameraCapabilities().supportsBearing()){ - qreal bearing = 1.4; - - QGeoCameraData cameraData; - cameraData.setBearing(bearing); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - QCOMPARE(mapController.bearing(),bearing); - - clearSignalSpies(); - mapController.setBearing(-1.5); - QCOMPARE(mapController.bearing(),-1.5); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),0); - QCOMPARE(m_signalBearingChanged->count(),1); - QCOMPARE(m_signalTiltChanged->count(),0); - QCOMPARE(m_signalRollChanged->count(),0); - QCOMPARE(m_signalZoomChanged->count(),0); - } -} - -void tst_QGeoMapController::tiltTest() -{ - if (m_map->cameraCapabilities().supportsTilting()){ - qreal tilt = m_map->cameraCapabilities().maximumTilt(); - - QGeoCameraData cameraData; - cameraData.setTilt(tilt); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - QCOMPARE(mapController.tilt(),tilt); - - tilt = m_map->cameraCapabilities().minimumTilt(); - clearSignalSpies(); - mapController.setTilt(tilt); - QCOMPARE(mapController.tilt(),tilt); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),0); - QCOMPARE(m_signalBearingChanged->count(),0); - QCOMPARE(m_signalTiltChanged->count(),1); - QCOMPARE(m_signalRollChanged->count(),0); - QCOMPARE(m_signalZoomChanged->count(),0); - } -} - -void tst_QGeoMapController::rollTest() -{ - if (m_map->cameraCapabilities().supportsRolling()){ - qreal roll = 1.4; - - QGeoCameraData cameraData; - cameraData.setRoll(roll); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - QCOMPARE(mapController.roll(),roll); - - clearSignalSpies(); - mapController.setRoll(-1.5); - QCOMPARE(mapController.roll(),-1.5); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),0); - QCOMPARE(m_signalBearingChanged->count(),0); - QCOMPARE(m_signalTiltChanged->count(),0); - QCOMPARE(m_signalRollChanged->count(),1); - QCOMPARE(m_signalZoomChanged->count(),0); - } -} - -void tst_QGeoMapController::panTest() -{ - QGeoMapController mapController(m_map.data()); - - mapController.setCenter(QGeoCoordinate(-1.0,-2.4,3.8)); - - // check that pan of zero leaves the camera centre unaltered - mapController.pan(0, 0); - QCOMPARE(mapController.center().altitude(), 3.8); - QCOMPARE(mapController.center().latitude(), -1.0); - QCOMPARE(mapController.center().longitude(), -2.4); - - qreal dx = 13.1; - qreal dy = -9.3; - clearSignalSpies(); - mapController.pan(dx, dy); - - // rather than verify the exact new position, we check that the position has changed and the altitude - // is unaffected - QCOMPARE(mapController.center().altitude(), 3.8); - QVERIFY(qFuzzyCompare(mapController.center().latitude(), -1.0) == false); - QVERIFY(qFuzzyCompare(mapController.center().longitude(), -2.4) == false); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),1); - QCOMPARE(m_signalBearingChanged->count(),0); - QCOMPARE(m_signalTiltChanged->count(),0); - QCOMPARE(m_signalRollChanged->count(),0); - QCOMPARE(m_signalZoomChanged->count(),0); -} - -void tst_QGeoMapController::zoomTest() -{ - QGeoCameraData cameraData; - cameraData.setZoomLevel(1.4); - m_map->setCameraData(cameraData); - QGeoMapController mapController(m_map.data()); - - QCOMPARE(mapController.zoom(),1.4); - mapController.setZoom(1.4); - QCOMPARE(mapController.zoom(),1.4); - clearSignalSpies(); - mapController.setZoom(1.5); - QCOMPARE(mapController.zoom(),1.5); - - // check correct signal is triggered - QCOMPARE(m_signalCenterChanged->count(),0); - QCOMPARE(m_signalBearingChanged->count(),0); - QCOMPARE(m_signalTiltChanged->count(),0); - QCOMPARE(m_signalRollChanged->count(),0); - QCOMPARE(m_signalZoomChanged->count(),1); -} - - -QTEST_MAIN(tst_QGeoMapController) - -#include "tst_qgeomapcontroller.moc" diff --git a/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp b/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp index a8f053e9..7a75e52a 100644 --- a/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp +++ b/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp @@ -40,7 +40,6 @@ #include <QtLocation/QGeoServiceProvider> #include <QtLocation/private/qgeotiledmap_p.h> #include <QtLocation/private/qgeomappingmanager_p.h> -#include <QtLocation/private/qgeomapcontroller_p.h> #include <QtLocation/private/qgeocameracapabilities_p.h> QT_USE_NAMESPACE |