diff options
author | Ian Chen <ian.1.chen@nokia.com> | 2012-07-20 14:07:28 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-30 08:14:14 +0200 |
commit | 36ea3e0ac9537a84576c285d445108867508fba3 (patch) | |
tree | a3931d8f7590c65a84d920a6f324b11d2a983130 | |
parent | 3ffb9737a56cf81dd42e6ffa5489fe12cf8d2971 (diff) | |
download | qtlocation-36ea3e0ac9537a84576c285d445108867508fba3.tar.gz |
Add workaround for managing map item's coordinates
can be removed once coordinates are passed by value,
see QTBUG-25636
Task-number: QTBUG-26550
Change-Id: Ibd862cb87550bf8f2b31a7a14750e4b676d5c0e6
Reviewed-by: Aaron McCarthy <aaron.mccarthy@nokia.com>
6 files changed, 47 insertions, 2 deletions
diff --git a/src/imports/location/qdeclarativecoordinate.cpp b/src/imports/location/qdeclarativecoordinate.cpp index db432250..12d15ac8 100644 --- a/src/imports/location/qdeclarativecoordinate.cpp +++ b/src/imports/location/qdeclarativecoordinate.cpp @@ -110,7 +110,10 @@ QDeclarativeCoordinate::QDeclarativeCoordinate(const QGeoCoordinate &coordinate, : QObject(parent), m_coordinate(coordinate) {} -QDeclarativeCoordinate::~QDeclarativeCoordinate() {} +QDeclarativeCoordinate::~QDeclarativeCoordinate() +{ + emit destroyed(this); +} /*! \qmlproperty QGeoCoordinate Coordinate::coordinate diff --git a/src/imports/location/qdeclarativecoordinate_p.h b/src/imports/location/qdeclarativecoordinate_p.h index d18bd088..6849fb9d 100644 --- a/src/imports/location/qdeclarativecoordinate_p.h +++ b/src/imports/location/qdeclarativecoordinate_p.h @@ -89,6 +89,7 @@ Q_SIGNALS: void altitudeChanged(double altitude); void validityChanged(bool valid); void coordinateChanged(const QGeoCoordinate &coord); + void destroyed(QDeclarativeCoordinate *coord); private: QGeoCoordinate m_coordinate; diff --git a/src/imports/location/qdeclarativepolygonmapitem.cpp b/src/imports/location/qdeclarativepolygonmapitem.cpp index e0c760f4..684eb469 100644 --- a/src/imports/location/qdeclarativepolygonmapitem.cpp +++ b/src/imports/location/qdeclarativepolygonmapitem.cpp @@ -341,6 +341,21 @@ void QDeclarativePolygonMapItem::updateAfterCoordinateChanged() } } +/*! + \internal +*/ +void QDeclarativePolygonMapItem::coordinateDestroyed(QDeclarativeCoordinate *coord) +{ + // tmp workaround for handling null pointers caused by external deletion of + // the declarative coordinate. This slot and its calls can be safely removed + // once QTBUG-25636 is fixed + if (coord) { + int idx = this->coordPath_.indexOf(coord); + if ( idx >= 0 ) + coordPath_.replace(idx, new QDeclarativeCoordinate(coord->coordinate(), this)); + } +} + QDeclarativePolygonMapItem::~QDeclarativePolygonMapItem() { } @@ -400,6 +415,8 @@ void QDeclarativePolygonMapItem::path_append( QObject::connect(coordinate, SIGNAL(coordinateChanged(QGeoCoordinate)), item, SLOT(updateAfterCoordinateChanged())); + QObject::connect(coordinate, SIGNAL(destroyed(QDeclarativeCoordinate *)), + item, SLOT(coordinateDestroyed(QDeclarativeCoordinate *))); item->geometry_.markSourceDirty(); item->borderGeometry_.markSourceDirty(); item->updateMapItem(); @@ -456,6 +473,8 @@ void QDeclarativePolygonMapItem::addCoordinate(QDeclarativeCoordinate *coordinat QObject::connect(coordinate, SIGNAL(coordinateChanged(QGeoCoordinate)), this, SLOT(updateAfterCoordinateChanged())); + QObject::connect(coordinate, SIGNAL(destroyed(QDeclarativeCoordinate *)), + this, SLOT(coordinateDestroyed(QDeclarativeCoordinate *))); geometry_.markSourceDirty(); borderGeometry_.markSourceDirty(); updateMapItem(); diff --git a/src/imports/location/qdeclarativepolygonmapitem_p.h b/src/imports/location/qdeclarativepolygonmapitem_p.h index 6900620b..a1eff697 100644 --- a/src/imports/location/qdeclarativepolygonmapitem_p.h +++ b/src/imports/location/qdeclarativepolygonmapitem_p.h @@ -113,6 +113,7 @@ protected Q_SLOTS: private Q_SLOTS: // map size changed void updateAfterCoordinateChanged(); + void coordinateDestroyed(QDeclarativeCoordinate *coord); private: static void path_append(QQmlListProperty<QDeclarativeCoordinate> *prop, QDeclarativeCoordinate *coordinate); diff --git a/src/imports/location/qdeclarativepolylinemapitem.cpp b/src/imports/location/qdeclarativepolylinemapitem.cpp index 544bea15..50a35cee 100644 --- a/src/imports/location/qdeclarativepolylinemapitem.cpp +++ b/src/imports/location/qdeclarativepolylinemapitem.cpp @@ -480,6 +480,21 @@ void QDeclarativePolylineMapItem::updateAfterCoordinateChanged() /*! \internal */ +void QDeclarativePolylineMapItem::coordinateDestroyed(QDeclarativeCoordinate *coord) +{ + // tmp workaround for handling null pointers caused by external deletion of + // the declarative coordinate. This slot and its calls can be safely removed + // once QTBUG-25636 is fixed + if (coord) { + int idx = this->coordPath_.indexOf(coord); + if ( idx >= 0 ) + coordPath_.replace(idx, new QDeclarativeCoordinate(coord->coordinate(), this)); + } +} + +/*! + \internal +*/ void QDeclarativePolylineMapItem::setMap(QDeclarativeGeoMap *quickMap, QGeoMap *map) { QDeclarativeGeoMapItemBase::setMap(quickMap,map); @@ -513,7 +528,8 @@ void QDeclarativePolylineMapItem::path_append(QQmlListProperty<QDeclarativeCoord QObject::connect(coordinate, SIGNAL(coordinateChanged(QGeoCoordinate)), item, SLOT(updateAfterCoordinateChanged())); - + QObject::connect(coordinate, SIGNAL(destroyed(QDeclarativeCoordinate *)), + item, SLOT(coordinateDestroyed(QDeclarativeCoordinate *))); item->coordPath_.append(coordinate); item->path_.append(coordinate->coordinate()); item->geometry_.markSourceDirty(); @@ -571,6 +587,9 @@ void QDeclarativePolylineMapItem::addCoordinate(QDeclarativeCoordinate *coordina QObject::connect(coordinate, SIGNAL(coordinateChanged(QGeoCoordinate)), this, SLOT(updateAfterCoordinateChanged())); + QObject::connect(coordinate, SIGNAL(destroyed(QDeclarativeCoordinate *)), + this, SLOT(coordinateDestroyed(QDeclarativeCoordinate *))); + geometry_.markSourceDirty(); updateMapItem(); emit pathChanged(); @@ -741,6 +760,7 @@ void QDeclarativePolylineMapItem::dragEnded() + newCoordinate.longitude() - firstLongitude)); coord.setLatitude(coord.latitude() + newCoordinate.latitude() - firstLatitude - offsetLatitude); + // temporarily disconnect signals to avoid unecessary screen updates for each coordinate QObject::disconnect(coordPath_.at(i), SIGNAL(coordinateChanged(QGeoCoordinate)), this, SLOT(updateAfterCoordinateChanged())); diff --git a/src/imports/location/qdeclarativepolylinemapitem_p.h b/src/imports/location/qdeclarativepolylinemapitem_p.h index d43d9c2c..6c5dc233 100644 --- a/src/imports/location/qdeclarativepolylinemapitem_p.h +++ b/src/imports/location/qdeclarativepolylinemapitem_p.h @@ -131,6 +131,7 @@ protected Q_SLOTS: virtual void updateMapItem(); void updateAfterLinePropertiesChanged(); void updateAfterCoordinateChanged(); + void coordinateDestroyed(QDeclarativeCoordinate *coord); void afterViewportChanged(const QGeoMapViewportChangeEvent &event); private: |