summaryrefslogtreecommitdiff
path: root/src/location/maps
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2017-02-10 19:05:56 +0100
committerPaolo Angelelli <paolo.angelelli@qt.io>2017-02-28 11:09:56 +0000
commitba2a82b7db86d96fc1f110b4bbc88408f47a5774 (patch)
tree66bb4e03d6cff164cac4161b4363e3444a78ad23 /src/location/maps
parent11e6a62957433843816b41ad11fada7ca8eab85c (diff)
downloadqtlocation-ba2a82b7db86d96fc1f110b4bbc88408f47a5774.tar.gz
Make QGeoCameraCapabilities independent of the engine
This patch makes it possible to change QGeoCameraCapabilites at runtime, when the map type changes, to accommodate for those plugins that offer different maps having different capabilities. This is then used to properly push the min/max zoom levels for each map type in our OSM plugin. Autotests are included. Change-Id: I48532da77ffb3eaf2e752561395945c3a2c21985 Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/location/maps')
-rw-r--r--src/location/maps/qgeocameracapabilities.cpp29
-rw-r--r--src/location/maps/qgeocameracapabilities_p.h3
-rw-r--r--src/location/maps/qgeomap.cpp30
-rw-r--r--src/location/maps/qgeomap_p.h2
-rw-r--r--src/location/maps/qgeomap_p_p.h5
-rw-r--r--src/location/maps/qgeomappingmanager.cpp5
-rw-r--r--src/location/maps/qgeomappingmanager_p.h4
-rw-r--r--src/location/maps/qgeomappingmanagerengine.cpp3
-rw-r--r--src/location/maps/qgeomappingmanagerengine_p.h3
-rw-r--r--src/location/maps/qgeotiledmap.cpp31
-rw-r--r--src/location/maps/qgeotiledmap_p_p.h2
11 files changed, 99 insertions, 18 deletions
diff --git a/src/location/maps/qgeocameracapabilities.cpp b/src/location/maps/qgeocameracapabilities.cpp
index 568476fd..6426b058 100644
--- a/src/location/maps/qgeocameracapabilities.cpp
+++ b/src/location/maps/qgeocameracapabilities.cpp
@@ -57,6 +57,8 @@ public:
QGeoCameraCapabilitiesPrivate &operator = (const QGeoCameraCapabilitiesPrivate &other);
+ bool operator == (const QGeoCameraCapabilitiesPrivate &rhs) const;
+
bool supportsBearing_;
bool supportsRolling_;
bool supportsTilting_;
@@ -125,6 +127,21 @@ QGeoCameraCapabilitiesPrivate &QGeoCameraCapabilitiesPrivate::operator = (const
return *this;
}
+bool QGeoCameraCapabilitiesPrivate::operator == (const QGeoCameraCapabilitiesPrivate &rhs) const
+{
+ return ((supportsBearing_ == rhs.supportsBearing_)
+ && (supportsRolling_ == rhs.supportsRolling_)
+ && (supportsTilting_ == rhs.supportsTilting_)
+ && (valid_ == rhs.valid_)
+ && (minZoom_ == rhs.minZoom_)
+ && (maxZoom_ == rhs.maxZoom_)
+ && (minTilt_ == rhs.minTilt_)
+ && (maxTilt_ == rhs.maxTilt_)
+ && (tileSize_ == rhs.tileSize_)
+ && (minimumFieldOfView_ == rhs.minimumFieldOfView_)
+ && (maximumFieldOfView_ == rhs.maximumFieldOfView_));
+}
+
/*!
\class QGeoCameraCapabilities
\inmodule QtLocation
@@ -171,6 +188,16 @@ QGeoCameraCapabilities &QGeoCameraCapabilities::operator = (const QGeoCameraCapa
return *this;
}
+bool QGeoCameraCapabilities::operator == (const QGeoCameraCapabilities &rhs) const
+{
+ return (*(d.constData()) == *(rhs.d.constData()));
+}
+
+bool QGeoCameraCapabilities::operator != (const QGeoCameraCapabilities &other) const
+{
+ return !(operator==(other));
+}
+
void QGeoCameraCapabilities::setTileSize(int tileSize)
{
if (tileSize < 1)
@@ -388,7 +415,7 @@ double QGeoCameraCapabilities::minimumFieldOfView() const
*/
void QGeoCameraCapabilities::setMaximumFieldOfView(double maximumFieldOfView)
{
- d->maximumFieldOfView_ = maximumFieldOfView;
+ d->maximumFieldOfView_ = qBound(1.0, maximumFieldOfView, 179.0);
d->valid_ = true;
}
diff --git a/src/location/maps/qgeocameracapabilities_p.h b/src/location/maps/qgeocameracapabilities_p.h
index c9da53e9..099ad76d 100644
--- a/src/location/maps/qgeocameracapabilities_p.h
+++ b/src/location/maps/qgeocameracapabilities_p.h
@@ -65,6 +65,9 @@ public:
QGeoCameraCapabilities &operator = (const QGeoCameraCapabilities &other);
+ bool operator == (const QGeoCameraCapabilities &other) const;
+ bool operator != (const QGeoCameraCapabilities &other) const;
+
void setTileSize(int tileSize);
int tileSize() const;
diff --git a/src/location/maps/qgeomap.cpp b/src/location/maps/qgeomap.cpp
index 9d3f4efa..2419b79a 100644
--- a/src/location/maps/qgeomap.cpp
+++ b/src/location/maps/qgeomap.cpp
@@ -92,6 +92,12 @@ void QGeoMap::setCameraData(const QGeoCameraData &cameraData)
emit cameraDataChanged(d->m_cameraData);
}
+void QGeoMap::setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities)
+{
+ Q_D(QGeoMap);
+ d->setCameraCapabilities(cameraCapabilities);
+}
+
QGeoCameraData QGeoMap::cameraData() const
{
Q_D(const QGeoMap);
@@ -104,6 +110,7 @@ void QGeoMap::setActiveMapType(const QGeoMapType type)
if (type == d->m_activeMapType)
return;
d->m_activeMapType = type;
+ d->setCameraCapabilities(d->m_engine->cameraCapabilities(type)); // emits
d->changeActiveMapType(type);
emit activeMapTypeChanged();
}
@@ -147,10 +154,7 @@ const QGeoProjection &QGeoMap::geoProjection() const
QGeoCameraCapabilities QGeoMap::cameraCapabilities() const
{
Q_D(const QGeoMap);
- if (!d->m_engine.isNull())
- return d->m_engine->cameraCapabilities();
- else
- return QGeoCameraCapabilities();
+ return d->m_cameraCapabilities;
}
void QGeoMap::prefetchData()
@@ -232,6 +236,9 @@ QGeoMapPrivate::QGeoMapPrivate(QGeoMappingManagerEngine *engine, QGeoProjection
m_engine(engine),
m_activeMapType(QGeoMapType())
{
+ // Setting the default camera caps without emitting anything
+ if (engine)
+ m_cameraCapabilities = m_engine->cameraCapabilities(m_activeMapType);
}
QGeoMapPrivate::~QGeoMapPrivate()
@@ -240,6 +247,21 @@ QGeoMapPrivate::~QGeoMapPrivate()
delete m_geoProjection;
}
+void QGeoMapPrivate::setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities)
+{
+ Q_Q(QGeoMap);
+ if (m_cameraCapabilities == cameraCapabilities)
+ return;
+ QGeoCameraCapabilities oldCaps = m_cameraCapabilities;
+ m_cameraCapabilities = cameraCapabilities;
+ emit q->cameraCapabilitiesChanged(oldCaps);
+}
+
+const QGeoCameraCapabilities &QGeoMapPrivate::cameraCapabilities() const
+{
+ return m_cameraCapabilities;
+}
+
void QGeoMapPrivate::addParameter(QGeoMapParameter *param)
{
Q_UNUSED(param)
diff --git a/src/location/maps/qgeomap_p.h b/src/location/maps/qgeomap_p.h
index 7e2d4bbd..bb7ade55 100644
--- a/src/location/maps/qgeomap_p.h
+++ b/src/location/maps/qgeomap_p.h
@@ -127,12 +127,14 @@ public:
protected:
QGeoMap(QGeoMapPrivate &dd, QObject *parent = 0);
void setCameraData(const QGeoCameraData &cameraData);
+ void setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities);
virtual QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window) = 0;
Q_SIGNALS:
void cameraDataChanged(const QGeoCameraData &cameraData);
void sgNodeChanged();
void activeMapTypeChanged();
+ void cameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities);
void copyrightsChanged(const QImage &copyrightsImage);
void copyrightsChanged(const QString &copyrightsHtml);
void copyrightsStyleSheetChanged(const QString &styleSheet);
diff --git a/src/location/maps/qgeomap_p_p.h b/src/location/maps/qgeomap_p_p.h
index 399fd75b..ec498484 100644
--- a/src/location/maps/qgeomap_p_p.h
+++ b/src/location/maps/qgeomap_p_p.h
@@ -51,6 +51,8 @@
#include <QtLocation/private/qgeocameradata_p.h>
#include <QtLocation/private/qgeomaptype_p.h>
#include <QtLocation/private/qgeoprojection_p.h>
+#include <QtLocation/private/qgeomap_p.h>
+#include <QtLocation/private/qgeocameracapabilities_p.h>
#include <QtCore/private/qobject_p.h>
#include <QtCore/QSize>
#include <QtCore/QList>
@@ -73,6 +75,8 @@ public:
virtual ~QGeoMapPrivate();
const QGeoProjection *geoProjection() const;
+ void setCameraCapabilities(const QGeoCameraCapabilities &cameraCapabilities);
+ const QGeoCameraCapabilities &cameraCapabilities() const;
protected:
/* Hooks into the actual map implementations */
virtual void addParameter(QGeoMapParameter *param);
@@ -94,6 +98,7 @@ protected:
QGeoMapType m_activeMapType;
QList<QGeoMapParameter *> m_mapParameters;
QList<QDeclarativeGeoMapItemBase *> m_mapItems;
+ QGeoCameraCapabilities m_cameraCapabilities;
};
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeomappingmanager.cpp b/src/location/maps/qgeomappingmanager.cpp
index 7d829965..cf040beb 100644
--- a/src/location/maps/qgeomappingmanager.cpp
+++ b/src/location/maps/qgeomappingmanager.cpp
@@ -128,11 +128,6 @@ int QGeoMappingManager::managerVersion() const
return d_ptr->engine->managerVersion();
}
-QGeoCameraCapabilities QGeoMappingManager::cameraCapabilities() const
-{
- return d_ptr->engine->cameraCapabilities();
-}
-
/*!
Returns a new QGeoMap instance which will be managed by this manager.
*/
diff --git a/src/location/maps/qgeomappingmanager_p.h b/src/location/maps/qgeomappingmanager_p.h
index f536b15b..2f8e5283 100644
--- a/src/location/maps/qgeomappingmanager_p.h
+++ b/src/location/maps/qgeomappingmanager_p.h
@@ -52,7 +52,7 @@
#include <QSize>
#include <QPair>
#include <QtLocation/private/qlocationglobal_p.h>
-#include "qgeomaptype_p.h"
+#include <QtLocation/private/qgeomaptype_p.h>
QT_BEGIN_NAMESPACE
@@ -82,8 +82,6 @@ public:
bool isInitialized() const;
- QGeoCameraCapabilities cameraCapabilities() const;
-
void setLocale(const QLocale &locale);
QLocale locale() const;
diff --git a/src/location/maps/qgeomappingmanagerengine.cpp b/src/location/maps/qgeomappingmanagerengine.cpp
index 5094c1b3..a385f8ce 100644
--- a/src/location/maps/qgeomappingmanagerengine.cpp
+++ b/src/location/maps/qgeomappingmanagerengine.cpp
@@ -150,8 +150,9 @@ void QGeoMappingManagerEngine::setSupportedMapTypes(const QList<QGeoMapType> &su
emit supportedMapTypesChanged();
}
-QGeoCameraCapabilities QGeoMappingManagerEngine::cameraCapabilities() const
+QGeoCameraCapabilities QGeoMappingManagerEngine::cameraCapabilities(const QGeoMapType &mapType) const
{
+ Q_UNUSED(mapType)
Q_D(const QGeoMappingManagerEngine);
return d->capabilities_;
}
diff --git a/src/location/maps/qgeomappingmanagerengine_p.h b/src/location/maps/qgeomappingmanagerengine_p.h
index 13956141..b8ebb1ec 100644
--- a/src/location/maps/qgeomappingmanagerengine_p.h
+++ b/src/location/maps/qgeomappingmanagerengine_p.h
@@ -89,7 +89,8 @@ public:
QList<QGeoMapType> supportedMapTypes() const;
- QGeoCameraCapabilities cameraCapabilities() const;
+ // the class is private, so this can be virtual here for now.
+ virtual QGeoCameraCapabilities cameraCapabilities(const QGeoMapType &mapType) const;
void setLocale(const QLocale &locale);
QLocale locale() const;
diff --git a/src/location/maps/qgeotiledmap.cpp b/src/location/maps/qgeotiledmap.cpp
index fc08fe62..68f150db 100644
--- a/src/location/maps/qgeotiledmap.cpp
+++ b/src/location/maps/qgeotiledmap.cpp
@@ -66,6 +66,10 @@ QGeoTiledMap::QGeoTiledMap(QGeoTiledMappingManagerEngine *engine, QObject *paren
QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
this,&QGeoTiledMap::handleTileVersionChanged);
+ QObject::connect(this, &QGeoMap::cameraCapabilitiesChanged,
+ [d](const QGeoCameraCapabilities &oldCameraCapabilities) {
+ d->onCameraCapabilitiesChanged(oldCameraCapabilities);
+ });
}
QGeoTiledMap::QGeoTiledMap(QGeoTiledMapPrivate &dd, QGeoTiledMappingManagerEngine *engine, QObject *parent)
@@ -77,6 +81,10 @@ QGeoTiledMap::QGeoTiledMap(QGeoTiledMapPrivate &dd, QGeoTiledMappingManagerEngin
QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
this,&QGeoTiledMap::handleTileVersionChanged);
+ QObject::connect(this, &QGeoMap::cameraCapabilitiesChanged,
+ [d](const QGeoCameraCapabilities &oldCameraCapabilities) {
+ d->onCameraCapabilitiesChanged(oldCameraCapabilities);
+ });
}
QGeoTiledMap::~QGeoTiledMap()
@@ -164,11 +172,11 @@ QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine)
m_prefetchTiles(new QGeoCameraTiles()),
m_mapScene(new QGeoTiledMapScene()),
m_tileRequests(0),
- m_maxZoomLevel(static_cast<int>(std::ceil(engine->cameraCapabilities().maximumZoomLevel()))),
- m_minZoomLevel(static_cast<int>(std::ceil(engine->cameraCapabilities().minimumZoomLevel()))),
+ m_maxZoomLevel(static_cast<int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()))),
+ m_minZoomLevel(static_cast<int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()))),
m_prefetchStyle(QGeoTiledMap::PrefetchTwoNeighbourLayers)
{
- int tileSize = engine->tileSize().width();
+ int tileSize = m_cameraCapabilities.tileSize();
QString pluginString(engine->managerName() + QLatin1Char('_') + QString::number(engine->managerVersion()));
m_visibleTiles->setTileSize(tileSize);
m_prefetchTiles->setTileSize(tileSize);
@@ -247,6 +255,23 @@ QGeoMapType QGeoTiledMapPrivate::activeMapType()
return m_visibleTiles->activeMapType();
}
+// Called before changeCameraData
+void QGeoTiledMapPrivate::onCameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities)
+{
+ // Handle varying min/maxZoomLevel
+ if (oldCameraCapabilities.minimumZoomLevel() != m_cameraCapabilities.minimumZoomLevel())
+ m_minZoomLevel = static_cast<int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()));
+ if (oldCameraCapabilities.maximumZoomLevel() != m_cameraCapabilities.maximumZoomLevel())
+ m_maxZoomLevel = static_cast<int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()));
+
+ // Handle varying tile size
+ if (oldCameraCapabilities.tileSize() != m_cameraCapabilities.tileSize()) {
+ m_visibleTiles->setTileSize(oldCameraCapabilities.tileSize());
+ m_prefetchTiles->setTileSize(oldCameraCapabilities.tileSize());
+ m_mapScene->setTileSize(oldCameraCapabilities.tileSize());
+ }
+}
+
void QGeoTiledMapPrivate::changeCameraData(const QGeoCameraData &cameraData)
{
Q_Q(QGeoTiledMap);
diff --git a/src/location/maps/qgeotiledmap_p_p.h b/src/location/maps/qgeotiledmap_p_p.h
index 7106adf3..3dc589ae 100644
--- a/src/location/maps/qgeotiledmap_p_p.h
+++ b/src/location/maps/qgeotiledmap_p_p.h
@@ -66,6 +66,7 @@ class QGeoTileRequestManager;
class QGeoTileSpec;
class QSGNode;
class QQuickWindow;
+class QGeoCameraCapabilities;
class Q_LOCATION_PRIVATE_EXPORT QGeoTiledMapPrivate : public QGeoMapPrivate
{
@@ -79,6 +80,7 @@ public:
void updateTile(const QGeoTileSpec &spec);
void prefetchTiles();
QGeoMapType activeMapType();
+ void onCameraCapabilitiesChanged(const QGeoCameraCapabilities &oldCameraCapabilities);
protected:
void changeViewportSize(const QSize& size) Q_DECL_OVERRIDE;