summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Chen <ian.1.chen@nokia.com>2012-07-20 14:07:28 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-30 08:14:14 +0200
commit36ea3e0ac9537a84576c285d445108867508fba3 (patch)
treea3931d8f7590c65a84d920a6f324b11d2a983130
parent3ffb9737a56cf81dd42e6ffa5489fe12cf8d2971 (diff)
downloadqtlocation-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>
-rw-r--r--src/imports/location/qdeclarativecoordinate.cpp5
-rw-r--r--src/imports/location/qdeclarativecoordinate_p.h1
-rw-r--r--src/imports/location/qdeclarativepolygonmapitem.cpp19
-rw-r--r--src/imports/location/qdeclarativepolygonmapitem_p.h1
-rw-r--r--src/imports/location/qdeclarativepolylinemapitem.cpp22
-rw-r--r--src/imports/location/qdeclarativepolylinemapitem_p.h1
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: