diff options
author | Alex Wilson <alex.wilson@nokia.com> | 2012-02-27 14:05:18 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-28 05:32:34 +0100 |
commit | 54678e128f4515eadac8c598696425c8c2f02bfd (patch) | |
tree | ca2037c2390170806755ea6d50175fee039b339d /src/imports/location/qdeclarativecirclemapitem.cpp | |
parent | 50b5acb9c654406e995b1c4faa648ba1726eb66f (diff) | |
download | qtlocation-54678e128f4515eadac8c598696425c8c2f02bfd.tar.gz |
Camera data change detection in MapItemBase, handle tilt/rotate better
Moves change detection for the map's QGeoCameraData into MapItemBase
(previously each map item did it individually). Adds proper detection
of tilt/rotate/roll capabilities and regenerates geometry at each frame
for these cases.
Change-Id: Iaadd594613931c2b352e245efefe3e07e4c43229
Reviewed-by: David Laing <david.laing@nokia.com>
Diffstat (limited to 'src/imports/location/qdeclarativecirclemapitem.cpp')
-rw-r--r-- | src/imports/location/qdeclarativecirclemapitem.cpp | 24 |
1 files changed, 16 insertions, 8 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(); } |