diff options
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_; }; |