summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/imports/location/qdeclarativecirclemapitem.cpp24
-rw-r--r--src/imports/location/qdeclarativecirclemapitem_p.h6
-rw-r--r--src/imports/location/qdeclarativegeomapitembase.cpp57
-rw-r--r--src/imports/location/qdeclarativegeomapitembase_p.h24
-rw-r--r--src/imports/location/qdeclarativegeomapquickitem.cpp5
-rw-r--r--src/imports/location/qdeclarativegeomapquickitem_p.h1
-rw-r--r--src/imports/location/qdeclarativepolygonmapitem.cpp24
-rw-r--r--src/imports/location/qdeclarativepolygonmapitem_p.h4
-rw-r--r--src/imports/location/qdeclarativepolylinemapitem.cpp23
-rw-r--r--src/imports/location/qdeclarativepolylinemapitem_p.h7
-rw-r--r--src/imports/location/qdeclarativerectanglemapitem.cpp24
-rw-r--r--src/imports/location/qdeclarativerectanglemapitem_p.h7
-rw-r--r--src/imports/location/qdeclarativeroutemapitem.cpp25
-rw-r--r--src/imports/location/qdeclarativeroutemapitem_p.h7
14 files changed, 171 insertions, 67 deletions
diff --git a/src/imports/location/qdeclarativecirclemapitem.cpp b/src/imports/location/qdeclarativecirclemapitem.cpp
index 645b09bf..0cd79074 100644
--- a/src/imports/location/qdeclarativecirclemapitem.cpp
+++ b/src/imports/location/qdeclarativecirclemapitem.cpp
@@ -42,6 +42,7 @@
#include "qdeclarativecirclemapitem_p.h"
#include "qdeclarativegeomapquickitem_p.h"
#include "qdeclarativepolygonmapitem_p.h"
+#include "qgeocameracapabilities_p.h"
#include "qgeoprojection_p.h"
#include <cmath>
#include <QPen>
@@ -184,7 +185,6 @@ QDeclarativeCircleMapItem::QDeclarativeCircleMapItem(QQuickItem *parent):
center_(0),
color_(Qt::transparent),
radius_(0),
- zoomLevel_(0.0),
dirtyMaterial_(true)
{
setFlag(ItemHasContents, true);
@@ -224,7 +224,6 @@ void QDeclarativeCircleMapItem::setMap(QDeclarativeGeoMap* quickMap, QGeoMap *ma
{
QDeclarativeGeoMapItemBase::setMap(quickMap,map);
if (map) {
- QObject::connect(map, SIGNAL(cameraDataChanged(QGeoCameraData)), this, SLOT(handleCameraDataChanged(QGeoCameraData)));
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
updateMapItem();
@@ -364,17 +363,26 @@ void QDeclarativeCircleMapItem::updateMapItem()
update();
}
-void QDeclarativeCircleMapItem::handleCameraDataChanged(const QGeoCameraData& cameraData)
+void QDeclarativeCircleMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
{
- if (cameraData.zoomLevel() != zoomLevel_) {
- zoomLevel_ = cameraData.zoomLevel();
+ // if the scene is tilted, we must regenerate our geometry every frame
+ if (map()->cameraCapabilities().supportsTilting()
+ && (event.cameraData.tilt() > 0.1
+ || event.cameraData.tilt() < -0.1)) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
- QSizeF sz = QSizeF(quickMap()->width(), quickMap()->height());
- if (sz != mapSize_) {
- mapSize_ = sz;
+ // if the scene is rolled, we must regen too
+ if (map()->cameraCapabilities().supportsRolling()
+ && (event.cameraData.roll() > 0.1
+ || event.cameraData.roll() < -0.1)) {
+ geometry_.markSourceDirty();
+ borderGeometry_.markSourceDirty();
+ }
+
+ // otherwise, only regen on rotate, resize and zoom
+ if (event.bearingChanged || event.mapSizeChanged || event.zoomLevelChanged) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
diff --git a/src/imports/location/qdeclarativecirclemapitem_p.h b/src/imports/location/qdeclarativecirclemapitem_p.h
index a6c18b18..aabd34f1 100644
--- a/src/imports/location/qdeclarativecirclemapitem_p.h
+++ b/src/imports/location/qdeclarativecirclemapitem_p.h
@@ -90,9 +90,7 @@ Q_SIGNALS:
protected Q_SLOTS:
virtual void updateMapItem();
void updateMapItemAssumeDirty();
-
-private Q_SLOTS:
- void handleCameraDataChanged(const QGeoCameraData& cameraData);
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private:
//TODO: pimpl
@@ -102,8 +100,6 @@ private:
QDeclarativeMapLineProperties border_;
QColor color_;
qreal radius_;
- qreal zoomLevel_;
- QSizeF mapSize_;
QList<QGeoCoordinate> circlePath_;
bool dirtyMaterial_;
QGeoMapPolygonGeometry geometry_;
diff --git a/src/imports/location/qdeclarativegeomapitembase.cpp b/src/imports/location/qdeclarativegeomapitembase.cpp
index 6d036c3a..8b1cc615 100644
--- a/src/imports/location/qdeclarativegeomapitembase.cpp
+++ b/src/imports/location/qdeclarativegeomapitembase.cpp
@@ -41,10 +41,33 @@
#include "qdeclarativegeomapitembase_p.h"
#include "qdeclarativegeomapmousearea_p.h"
+#include "qgeocameradata_p.h"
#include <QDeclarativeInfo>
QT_BEGIN_NAMESPACE
+QGeoMapViewportChangeEvent::QGeoMapViewportChangeEvent()
+ : zoomLevelChanged(false),
+ centerChanged(false),
+ mapSizeChanged(false),
+ tiltChanged(false),
+ bearingChanged(false),
+ rollChanged(false)
+{
+}
+
+QGeoMapViewportChangeEvent::QGeoMapViewportChangeEvent(const QGeoMapViewportChangeEvent &other)
+ : cameraData(other.cameraData),
+ mapSize(other.mapSize),
+ zoomLevelChanged(other.zoomLevelChanged),
+ centerChanged(other.centerChanged),
+ mapSizeChanged(other.mapSizeChanged),
+ tiltChanged(other.tiltChanged),
+ bearingChanged(other.bearingChanged),
+ rollChanged(other.rollChanged)
+{
+}
+
QDeclarativeGeoMapItemBase::QDeclarativeGeoMapItemBase(QQuickItem *parent)
: QQuickItem(parent),
map_(0),
@@ -104,8 +127,42 @@ void QDeclarativeGeoMapItemBase::setMap(QDeclarativeGeoMap *quickMap, QGeoMap *m
quickMap_->disconnect(this);
if (map_)
map_->disconnect(this);
+
quickMap_ = quickMap;
map_ = map;
+
+ if (map_ && quickMap_) {
+ connect(map_, SIGNAL(cameraDataChanged(QGeoCameraData)),
+ this, SLOT(baseCameraDataChanged(QGeoCameraData)));
+ lastSize_ = QSizeF(quickMap_->width(), quickMap_->height());
+ lastCameraData_ = map_->cameraData();
+ }
+}
+
+void QDeclarativeGeoMapItemBase::baseCameraDataChanged(const QGeoCameraData &cameraData)
+{
+ QGeoMapViewportChangeEvent evt;
+ evt.cameraData = cameraData;
+ evt.mapSize = QSizeF(quickMap_->width(), quickMap_->height());
+
+ if (evt.mapSize != lastSize_)
+ evt.mapSizeChanged = true;
+
+ if (cameraData.bearing() != lastCameraData_.bearing())
+ evt.bearingChanged = true;
+ if (cameraData.center() != lastCameraData_.center())
+ evt.centerChanged = true;
+ if (cameraData.roll() != lastCameraData_.roll())
+ evt.rollChanged = true;
+ if (cameraData.tilt() != lastCameraData_.tilt())
+ evt.tiltChanged = true;
+ if (cameraData.zoomLevel() != lastCameraData_.zoomLevel())
+ evt.zoomLevelChanged = true;
+
+ lastSize_ = evt.mapSize;
+ lastCameraData_ = cameraData;
+
+ afterViewportChanged(evt);
}
void QDeclarativeGeoMapItemBase::setPositionOnMap(const QGeoCoordinate& coordinate, const QPointF& offset)
diff --git a/src/imports/location/qdeclarativegeomapitembase_p.h b/src/imports/location/qdeclarativegeomapitembase_p.h
index 0ca15a8b..3d2fed6e 100644
--- a/src/imports/location/qdeclarativegeomapitembase_p.h
+++ b/src/imports/location/qdeclarativegeomapitembase_p.h
@@ -49,6 +49,23 @@
QT_BEGIN_NAMESPACE
+class QGeoMapViewportChangeEvent
+{
+public:
+ QGeoMapViewportChangeEvent();
+ QGeoMapViewportChangeEvent(const QGeoMapViewportChangeEvent &other);
+
+ QGeoCameraData cameraData;
+ QSizeF mapSize;
+
+ bool zoomLevelChanged;
+ bool centerChanged;
+ bool mapSizeChanged;
+ bool tiltChanged;
+ bool bearingChanged;
+ bool rollChanged;
+};
+
class QDeclarativeGeoMapItemBase : public QQuickItem
{
Q_OBJECT
@@ -68,10 +85,17 @@ public:
protected Q_SLOTS:
virtual void updateMapItem() = 0;
virtual void afterChildrenChanged();
+ virtual void afterViewportChanged(const QGeoMapViewportChangeEvent &event) = 0;
+
+private Q_SLOTS:
+ void baseCameraDataChanged(const QGeoCameraData &camera);
private:
QGeoMap* map_;
QDeclarativeGeoMap* quickMap_;
+
+ QSizeF lastSize_;
+ QGeoCameraData lastCameraData_;
};
QT_END_NAMESPACE
diff --git a/src/imports/location/qdeclarativegeomapquickitem.cpp b/src/imports/location/qdeclarativegeomapquickitem.cpp
index cc6e6416..1f1f80e9 100644
--- a/src/imports/location/qdeclarativegeomapquickitem.cpp
+++ b/src/imports/location/qdeclarativegeomapquickitem.cpp
@@ -357,6 +357,11 @@ void QDeclarativeGeoMapQuickItem::updateMapItem()
update();
}
+void QDeclarativeGeoMapQuickItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
+{
+ // do nothing
+}
+
qreal QDeclarativeGeoMapQuickItem::scaleFactor()
{
qreal scale = 1.0;
diff --git a/src/imports/location/qdeclarativegeomapquickitem_p.h b/src/imports/location/qdeclarativegeomapquickitem_p.h
index 6627301d..60b0b6b1 100644
--- a/src/imports/location/qdeclarativegeomapquickitem_p.h
+++ b/src/imports/location/qdeclarativegeomapquickitem_p.h
@@ -87,6 +87,7 @@ Q_SIGNALS:
protected Q_SLOTS:
virtual void updateMapItem();
virtual void afterChildrenChanged();
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private:
qreal scaleFactor();
diff --git a/src/imports/location/qdeclarativepolygonmapitem.cpp b/src/imports/location/qdeclarativepolygonmapitem.cpp
index c88e4c69..5404c407 100644
--- a/src/imports/location/qdeclarativepolygonmapitem.cpp
+++ b/src/imports/location/qdeclarativepolygonmapitem.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qdeclarativepolygonmapitem_p.h"
+#include "qgeocameracapabilities_p.h"
#include <QtGui/private/qtriangulator_p.h>
#include <QDeclarativeInfo>
#include <QPainter>
@@ -207,7 +208,6 @@ void QGeoMapPolygonGeometry::updateScreenPoints(const QGeoMap &map)
QDeclarativePolygonMapItem::QDeclarativePolygonMapItem(QQuickItem *parent) :
QDeclarativeGeoMapItemBase(parent),
color_(Qt::transparent),
- zoomLevel_(0.0),
dirtyMaterial_(true)
{
setFlag(ItemHasContents, true);
@@ -260,7 +260,6 @@ void QDeclarativePolygonMapItem::setMap(QDeclarativeGeoMap* quickMap, QGeoMap *m
{
QDeclarativeGeoMapItemBase::setMap(quickMap,map);
if (map) {
- QObject::connect(map, SIGNAL(cameraDataChanged(QGeoCameraData)), this, SLOT(handleCameraDataChanged(QGeoCameraData)));
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
updateMapItem();
@@ -454,17 +453,26 @@ void QDeclarativePolygonMapItem::updateMapItem()
update();
}
-void QDeclarativePolygonMapItem::handleCameraDataChanged(const QGeoCameraData& cameraData)
+void QDeclarativePolygonMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
{
- if (cameraData.zoomLevel() != zoomLevel_) {
- zoomLevel_ = cameraData.zoomLevel();
+ // if the scene is tilted, we must regenerate our geometry every frame
+ if (map()->cameraCapabilities().supportsTilting()
+ && (event.cameraData.tilt() > 0.1
+ || event.cameraData.tilt() < -0.1)) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
- QSizeF sz = QSizeF(quickMap()->width(), quickMap()->height());
- if (sz != mapSize_) {
- mapSize_ = sz;
+ // if the scene is rolled, we must regen too
+ if (map()->cameraCapabilities().supportsRolling()
+ && (event.cameraData.roll() > 0.1
+ || event.cameraData.roll() < -0.1)) {
+ geometry_.markSourceDirty();
+ borderGeometry_.markSourceDirty();
+ }
+
+ // otherwise, only regen on rotate, resize and zoom
+ if (event.bearingChanged || event.mapSizeChanged || event.zoomLevelChanged) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
diff --git a/src/imports/location/qdeclarativepolygonmapitem_p.h b/src/imports/location/qdeclarativepolygonmapitem_p.h
index c9cd7f45..85ce333b 100644
--- a/src/imports/location/qdeclarativepolygonmapitem_p.h
+++ b/src/imports/location/qdeclarativepolygonmapitem_p.h
@@ -103,10 +103,10 @@ Q_SIGNALS:
protected Q_SLOTS:
virtual void updateMapItem();
void handleBorderUpdated();
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private Q_SLOTS:
// map size changed
- void handleCameraDataChanged(const QGeoCameraData& cameraData);
void updateAfterCoordinateChanged();
private:
@@ -121,8 +121,6 @@ private:
QList<QDeclarativeCoordinate*> coordPath_;
QList<QGeoCoordinate> path_;
QColor color_;
- qreal zoomLevel_;
- QSizeF mapSize_;
bool dirtyMaterial_;
QGeoMapPolygonGeometry geometry_;
QGeoMapPolylineGeometry borderGeometry_;
diff --git a/src/imports/location/qdeclarativepolylinemapitem.cpp b/src/imports/location/qdeclarativepolylinemapitem.cpp
index 67a78127..5a5fa32a 100644
--- a/src/imports/location/qdeclarativepolylinemapitem.cpp
+++ b/src/imports/location/qdeclarativepolylinemapitem.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qdeclarativepolylinemapitem_p.h"
+#include "qgeocameracapabilities_p.h"
#include <QDeclarativeInfo>
#include <QPainter>
#include <QPainterPath>
@@ -390,7 +391,6 @@ void QGeoMapPolylineGeometry::updateScreenPoints(const QGeoMap &map,
QDeclarativePolylineMapItem::QDeclarativePolylineMapItem(QQuickItem *parent) :
QDeclarativeGeoMapItemBase(parent),
- zoomLevel_(0.0),
dirtyMaterial_(true)
{
setFlag(ItemHasContents, true);
@@ -427,7 +427,6 @@ void QDeclarativePolylineMapItem::setMap(QDeclarativeGeoMap* quickMap, QGeoMap *
{
QDeclarativeGeoMapItemBase::setMap(quickMap,map);
if (map){
- QObject::connect(map, SIGNAL(cameraDataChanged(QGeoCameraData)), this, SLOT(handleCameraDataChanged(QGeoCameraData)));
geometry_.markSourceDirty();
updateMapItem();
}
@@ -557,16 +556,24 @@ QDeclarativeMapLineProperties *QDeclarativePolylineMapItem::line()
return &line_;
}
-void QDeclarativePolylineMapItem::handleCameraDataChanged(const QGeoCameraData& cameraData)
+void QDeclarativePolylineMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
{
- if (cameraData.zoomLevel() != zoomLevel_) {
- zoomLevel_ = cameraData.zoomLevel();
+ // if the scene is tilted, we must regenerate our geometry every frame
+ if (map()->cameraCapabilities().supportsTilting()
+ && (event.cameraData.tilt() > 0.1
+ || event.cameraData.tilt() < -0.1)) {
geometry_.markSourceDirty();
}
- QSizeF sz = QSizeF(quickMap()->width(), quickMap()->height());
- if (sz != mapSize_) {
- mapSize_ = sz;
+ // if the scene is rolled, we must regen too
+ if (map()->cameraCapabilities().supportsRolling()
+ && (event.cameraData.roll() > 0.1
+ || event.cameraData.roll() < -0.1)) {
+ geometry_.markSourceDirty();
+ }
+
+ // otherwise, only regen on rotate, resize and zoom
+ if (event.bearingChanged || event.mapSizeChanged || event.zoomLevelChanged) {
geometry_.markSourceDirty();
}
diff --git a/src/imports/location/qdeclarativepolylinemapitem_p.h b/src/imports/location/qdeclarativepolylinemapitem_p.h
index 16359d59..7a80ee7b 100644
--- a/src/imports/location/qdeclarativepolylinemapitem_p.h
+++ b/src/imports/location/qdeclarativepolylinemapitem_p.h
@@ -127,10 +127,7 @@ protected Q_SLOTS:
virtual void updateMapItem();
void updateAfterLinePropertiesChanged();
void updateAfterCoordinateChanged();
-
-private Q_SLOTS:
- // map size changed
- void handleCameraDataChanged(const QGeoCameraData& cameraData);
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private:
static void path_append(QDeclarativeListProperty<QDeclarativeCoordinate> *prop, QDeclarativeCoordinate *coordinate);
@@ -144,9 +141,7 @@ private:
QList<QDeclarativeCoordinate*> coordPath_;
QList<QGeoCoordinate> path_;
QColor color_;
- qreal zoomLevel_;
bool dirtyMaterial_;
- QSizeF mapSize_;
QGeoMapPolylineGeometry geometry_;
};
diff --git a/src/imports/location/qdeclarativerectanglemapitem.cpp b/src/imports/location/qdeclarativerectanglemapitem.cpp
index 6ea7637c..8bac282f 100644
--- a/src/imports/location/qdeclarativerectanglemapitem.cpp
+++ b/src/imports/location/qdeclarativerectanglemapitem.cpp
@@ -41,6 +41,7 @@
#include "qdeclarativerectanglemapitem_p.h"
#include "qdeclarativepolygonmapitem_p.h"
+#include "qgeocameracapabilities_p.h"
#include <QPainterPath>
#include <qnumeric.h>
#include <QRectF>
@@ -153,7 +154,6 @@ QDeclarativeRectangleMapItem::QDeclarativeRectangleMapItem(QQuickItem *parent):
topLeft_(0),
bottomRight_(0),
color_(Qt::transparent),
- zoomLevel_(0.0),
dirtyMaterial_(true)
{
setFlag(ItemHasContents, true);
@@ -171,7 +171,6 @@ void QDeclarativeRectangleMapItem::setMap(QDeclarativeGeoMap* quickMap, QGeoMap
{
QDeclarativeGeoMapItemBase::setMap(quickMap,map);
if (map) {
- QObject::connect(map, SIGNAL(cameraDataChanged(QGeoCameraData)),this, SLOT(handleCameraDataChanged(QGeoCameraData)));
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
updateMapItem();
@@ -338,17 +337,26 @@ void QDeclarativeRectangleMapItem::updateMapItem()
update();
}
-void QDeclarativeRectangleMapItem::handleCameraDataChanged(const QGeoCameraData& cameraData)
+void QDeclarativeRectangleMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
{
- if (cameraData.zoomLevel() != zoomLevel_) {
- zoomLevel_ = cameraData.zoomLevel();
+ // if the scene is tilted, we must regenerate our geometry every frame
+ if (map()->cameraCapabilities().supportsTilting()
+ && (event.cameraData.tilt() > 0.1
+ || event.cameraData.tilt() < -0.1)) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
- QSizeF sz = QSizeF(quickMap()->width(), quickMap()->height());
- if (sz != mapSize_) {
- mapSize_ = sz;
+ // if the scene is rolled, we must regen too
+ if (map()->cameraCapabilities().supportsRolling()
+ && (event.cameraData.roll() > 0.1
+ || event.cameraData.roll() < -0.1)) {
+ geometry_.markSourceDirty();
+ borderGeometry_.markSourceDirty();
+ }
+
+ // otherwise, only regen on rotate, resize and zoom
+ if (event.bearingChanged || event.mapSizeChanged || event.zoomLevelChanged) {
geometry_.markSourceDirty();
borderGeometry_.markSourceDirty();
}
diff --git a/src/imports/location/qdeclarativerectanglemapitem_p.h b/src/imports/location/qdeclarativerectanglemapitem_p.h
index f8b36805..71ddd32c 100644
--- a/src/imports/location/qdeclarativerectanglemapitem_p.h
+++ b/src/imports/location/qdeclarativerectanglemapitem_p.h
@@ -103,10 +103,7 @@ Q_SIGNALS:
protected Q_SLOTS:
virtual void updateMapItem();
void updateMapItemAssumeDirty();
-
-private Q_SLOTS:
- // map size changed
- void handleCameraDataChanged(const QGeoCameraData& cameraData);
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private:
QDeclarativeCoordinate* topLeft_;
@@ -115,9 +112,7 @@ private:
QDeclarativeCoordinate internalBottomRight_;
QDeclarativeMapLineProperties border_;
QColor color_;
- qreal zoomLevel_;
bool dirtyMaterial_;
- QSizeF mapSize_;
QGeoMapRectangleGeometry geometry_;
QGeoMapPolylineGeometry borderGeometry_;
};
diff --git a/src/imports/location/qdeclarativeroutemapitem.cpp b/src/imports/location/qdeclarativeroutemapitem.cpp
index 4525edab..c03a612d 100644
--- a/src/imports/location/qdeclarativeroutemapitem.cpp
+++ b/src/imports/location/qdeclarativeroutemapitem.cpp
@@ -42,6 +42,7 @@
#include "qdeclarativeroutemapitem_p.h"
#include "qdeclarativepolylinemapitem_p.h"
+#include "qgeocameracapabilities_p.h"
#include "qdeclarativegeoroute_p.h"
#include <QtDeclarative/QDeclarativeInfo>
#include <QtGui/QPainter>
@@ -74,8 +75,7 @@
QDeclarativeRouteMapItem::QDeclarativeRouteMapItem(QQuickItem *parent):
QDeclarativeGeoMapItemBase(parent),
- route_(0),
- zoomLevel_(0.0)
+ route_(0)
{
setFlag(ItemHasContents, true);
line_.setWidth(3.0);
@@ -100,7 +100,6 @@ void QDeclarativeRouteMapItem::setMap(QDeclarativeGeoMap* quickMap, QGeoMap *map
{
QDeclarativeGeoMapItemBase::setMap(quickMap,map);
if (map) {
- QObject::connect(map, SIGNAL(cameraDataChanged(QGeoCameraData)), this, SLOT(handleCameraDataChanged(QGeoCameraData)));
geometry_.markSourceDirty();
updateMapItem();
}
@@ -185,16 +184,24 @@ void QDeclarativeRouteMapItem::updateMapItem()
update();
}
-void QDeclarativeRouteMapItem::handleCameraDataChanged(const QGeoCameraData& cameraData)
+void QDeclarativeRouteMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event)
{
- if (cameraData.zoomLevel() != zoomLevel_) {
- zoomLevel_ = cameraData.zoomLevel();
+ // if the scene is tilted, we must regenerate our geometry every frame
+ if (map()->cameraCapabilities().supportsTilting()
+ && (event.cameraData.tilt() > 0.1
+ || event.cameraData.tilt() < -0.1)) {
geometry_.markSourceDirty();
}
- QSizeF sz = QSizeF(quickMap()->width(), quickMap()->height());
- if (sz != mapSize_) {
- mapSize_ = sz;
+ // if the scene is rolled, we must regen too
+ if (map()->cameraCapabilities().supportsRolling()
+ && (event.cameraData.roll() > 0.1
+ || event.cameraData.roll() < -0.1)) {
+ geometry_.markSourceDirty();
+ }
+
+ // otherwise, only regen on rotate, resize and zoom
+ if (event.bearingChanged || event.mapSizeChanged || event.zoomLevelChanged) {
geometry_.markSourceDirty();
}
diff --git a/src/imports/location/qdeclarativeroutemapitem_p.h b/src/imports/location/qdeclarativeroutemapitem_p.h
index c730bbd5..841274f2 100644
--- a/src/imports/location/qdeclarativeroutemapitem_p.h
+++ b/src/imports/location/qdeclarativeroutemapitem_p.h
@@ -81,19 +81,14 @@ Q_SIGNALS:
protected Q_SLOTS:
virtual void updateMapItem();
void updateAfterLinePropertiesChanged();
-
-private Q_SLOTS:
- // map size changed
- void handleCameraDataChanged(const QGeoCameraData& cameraData);
+ void afterViewportChanged(const QGeoMapViewportChangeEvent &event);
private:
QDeclarativeMapLineProperties line_;
QDeclarativeGeoRoute* route_;
- qreal zoomLevel_;
QList<QGeoCoordinate> path_;
bool dirtyMaterial_;
bool dragActive_;
- QSizeF mapSize_;
QGeoMapPolylineGeometry geometry_;
};