summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/location/mapviewer/content/map/Marker.qml1
-rw-r--r--src/imports/location/qdeclarativegeomap.cpp4
-rw-r--r--src/imports/location/qdeclarativegeomapgesturearea.cpp4
-rw-r--r--src/imports/location/qdeclarativegeomapitembase.cpp1
-rw-r--r--src/imports/location/qdeclarativepolygonmapitem.cpp28
-rw-r--r--tests/auto/declarative_ui/tst_map.qml10
-rw-r--r--tests/auto/declarative_ui/tst_map_item.qml80
-rw-r--r--tests/auto/declarative_ui/tst_map_item_details.qml19
-rw-r--r--tests/auto/declarative_ui/tst_map_mouse.qml2
9 files changed, 105 insertions, 44 deletions
diff --git a/examples/location/mapviewer/content/map/Marker.qml b/examples/location/mapviewer/content/map/Marker.qml
index ece34819..0e9f1537 100644
--- a/examples/location/mapviewer/content/map/Marker.qml
+++ b/examples/location/mapviewer/content/map/Marker.qml
@@ -67,6 +67,7 @@ MapQuickItem {
anchors.fill: parent
hoverEnabled : false
drag.target: marker
+ preventStealing: true
onPressed : {
map.pressX = mouse.x
diff --git a/src/imports/location/qdeclarativegeomap.cpp b/src/imports/location/qdeclarativegeomap.cpp
index 14003c0f..a59b30e7 100644
--- a/src/imports/location/qdeclarativegeomap.cpp
+++ b/src/imports/location/qdeclarativegeomap.cpp
@@ -752,7 +752,7 @@ qreal QDeclarativeGeoMap::zoomLevel() const
*/
void QDeclarativeGeoMap::setCenter(const QGeoCoordinate &center)
{
- if (center == center_)
+ if (!mappingManagerInitialized_ && center == center_)
return;
center_ = center;
@@ -925,6 +925,8 @@ bool QDeclarativeGeoMap::childMouseEventFilter(QQuickItem *item, QEvent *event)
return gestureArea_->filterMapChildMouseEvent(static_cast<QMouseEvent *>(event));
else
return false;
+ case QEvent::UngrabMouse:
+ return gestureArea_->filterMapChildMouseEvent(static_cast<QMouseEvent *>(event));
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
diff --git a/src/imports/location/qdeclarativegeomapgesturearea.cpp b/src/imports/location/qdeclarativegeomapgesturearea.cpp
index dcc86bac..88925524 100644
--- a/src/imports/location/qdeclarativegeomapgesturearea.cpp
+++ b/src/imports/location/qdeclarativegeomapgesturearea.cpp
@@ -679,6 +679,10 @@ bool QDeclarativeGeoMapGestureArea::filterMapChildMouseEvent(QMouseEvent *event)
case QEvent::MouseMove:
used = mouseMoveEvent(event);
break;
+ case QEvent::UngrabMouse:
+ touchPoints_.clear();
+ update();
+ break;
default:
used = false;
break;
diff --git a/src/imports/location/qdeclarativegeomapitembase.cpp b/src/imports/location/qdeclarativegeomapitembase.cpp
index 087d9c6a..d53da881 100644
--- a/src/imports/location/qdeclarativegeomapitembase.cpp
+++ b/src/imports/location/qdeclarativegeomapitembase.cpp
@@ -207,6 +207,7 @@ bool QDeclarativeGeoMapItemBase::childMouseEventFilter(QQuickItem *item, QEvent
if (contains(static_cast<QMouseEvent*>(event)->pos())) {
return false;
} else {
+ event->setAccepted(false);
return true;
}
default:
diff --git a/src/imports/location/qdeclarativepolygonmapitem.cpp b/src/imports/location/qdeclarativepolygonmapitem.cpp
index 9ba9c4e7..55261ed1 100644
--- a/src/imports/location/qdeclarativepolygonmapitem.cpp
+++ b/src/imports/location/qdeclarativepolygonmapitem.cpp
@@ -351,7 +351,7 @@ QDeclarativePolygonMapItem::~QDeclarativePolygonMapItem()
\qmlproperty color MapPolygon::border.color
This property is part of the border property group. The border property
- group holds the width and color used to draw the border of the circle.
+ group holds the width and color used to draw the border of the polygon.
The width is in pixels and is independent of the zoom level of the map.
@@ -546,23 +546,21 @@ void QDeclarativePolygonMapItem::updateMapItem()
geometry_.updateSourcePoints(*map(), path_);
geometry_.updateScreenPoints(*map());
- if (border_.color() != Qt::transparent && border_.width() > 0) {
- QList<QGeoCoordinate> closedPath = path_;
- closedPath << closedPath.first();
- borderGeometry_.updateSourcePoints(*map(), closedPath);
+ QList<QGeoCoordinate> closedPath = path_;
+ closedPath << closedPath.first();
+ borderGeometry_.clear();
+ borderGeometry_.updateSourcePoints(*map(), closedPath);
+
+ if (border_.color() != Qt::transparent && border_.width() > 0)
borderGeometry_.updateScreenPoints(*map(), border_.width());
- QList<QGeoMapItemGeometry *> geoms;
- geoms << &geometry_ << &borderGeometry_;
- QRectF combined = QGeoMapItemGeometry::translateToCommonOrigin(geoms);
+ QList<QGeoMapItemGeometry *> geoms;
+ geoms << &geometry_ << &borderGeometry_;
+ QRectF combined = QGeoMapItemGeometry::translateToCommonOrigin(geoms);
+
+ setWidth(combined.width());
+ setHeight(combined.height());
- setWidth(combined.width());
- setHeight(combined.height());
- } else {
- borderGeometry_.clear();
- setWidth(geometry_.sourceBoundingBox().width());
- setHeight(geometry_.sourceBoundingBox().height());
- }
setPositionOnMap(path_.at(0), -1 * geometry_.sourceBoundingBox().topLeft());
update();
}
diff --git a/tests/auto/declarative_ui/tst_map.qml b/tests/auto/declarative_ui/tst_map.qml
index 584b5a48..bf17a19f 100644
--- a/tests/auto/declarative_ui/tst_map.qml
+++ b/tests/auto/declarative_ui/tst_map.qml
@@ -67,6 +67,7 @@ Item {
property variant coordinate2: QtPositioning.coordinate(12, 13)
property variant coordinate3: QtPositioning.coordinate(50, 50, 0)
property variant coordinate4: QtPositioning.coordinate(80, 80, 0)
+ property variant coordinate5: QtPositioning.coordinate(20, 180)
property variant invalidCoordinate: QtPositioning.coordinate()
property variant altitudelessCoordinate: QtPositioning.coordinate(50, 50)
@@ -102,6 +103,15 @@ Item {
map.center = coordinate2
compare(mapCenterSpy.count, 1)
+ // change center to dateline
+ mapCenterSpy.clear()
+ compare(mapCenterSpy.count, 0)
+ map.center = coordinate5
+ compare(mapCenterSpy.count, 1)
+ compare(map.center, coordinate5)
+
+ map.center = coordinate2
+
verify(isNaN(map.center.altitude));
compare(map.center.longitude, 13)
compare(map.center.latitude, 12)
diff --git a/tests/auto/declarative_ui/tst_map_item.qml b/tests/auto/declarative_ui/tst_map_item.qml
index 3afae572..80d5d132 100644
--- a/tests/auto/declarative_ui/tst_map_item.qml
+++ b/tests/auto/declarative_ui/tst_map_item.qml
@@ -99,7 +99,6 @@ Item {
radius: 600000
MouseArea {
anchors.fill: parent
- onClicked: console.log('ext circle clicked')
SignalSpy { id: extMapCircleClicked; target: parent; signalName: "clicked" }
}
}
@@ -144,6 +143,7 @@ Item {
id: preMapRectMa
anchors.fill: parent
drag.target: parent
+ preventStealing: true
SignalSpy { id: preMapRectClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapRectActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
@@ -159,11 +159,12 @@ Item {
latitude: 10
longitude: 30
}
- radius: 400000
+ radius: 10000
MouseArea {
id: preMapCircleMa
anchors.fill: parent
drag.target: parent
+ preventStealing: true
SignalSpy { id: preMapCircleClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapCircleActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
@@ -176,8 +177,10 @@ Item {
MapQuickItem {
id: preMapQuickItem
MouseArea {
+ id: preMapQuickItemMa
anchors.fill: parent
drag.target: parent
+ preventStealing: true
SignalSpy { id: preMapQuickItemClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapQuickItemActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
@@ -258,30 +261,39 @@ Item {
// precondition
compare(preMapRectClicked.count, 0)
compare(preMapCircleClicked.count, 0)
+
// click rect
+ map.center = preMapRect.topLeft
var point = map.toScreenPosition(preMapRect.topLeft)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapRectClicked.count, 1)
mouseClick(map, 1, 1) // no item hit
compare(preMapRectClicked.count, 1)
compare(preMapCircleClicked.count, 0)
+
// click circle, overlaps and is above rect
- visualInspectionPoint() // marks good visual inspection point
+ map.center = preMapCircle.center
point = map.toScreenPosition(preMapCircle.center)
mouseClick(map, point.x - 5, point.y - 5)
compare(preMapRectClicked.count, 1)
compare(preMapCircleClicked.count, 1)
+
// click within circle bounding rect but not inside the circle geometry
+ map.center = preMapCircle.center.atDistanceAndAzimuth(preMapCircle.radius, -45)
mouseClick(map, preMapCircle.x + 4, preMapCircle.y + 4)
compare(preMapRectClicked.count, 2)
compare(preMapCircleClicked.count, 1)
+
// click quick item
compare(preMapQuickItemClicked.count, 0)
+ map.center = preMapQuickItem.coordinate
point = map.toScreenPosition(preMapQuickItem.coordinate)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapQuickItemClicked.count, 1)
+
// click polygon
compare (preMapPolygonClicked.count, 0)
+ map.center = preMapPolygon.path[1]
point = map.toScreenPosition(preMapPolygon.path[1])
mouseClick(map, point.x - 5, point.y)
compare(preMapPolygonClicked.count, 1)
@@ -290,26 +302,31 @@ Item {
map.clearMapItems()
clear_data()
compare (map.mapItems.length, 0)
+ map.center = preMapRect.topLeft
point = map.toScreenPosition(preMapRect.topLeft)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapRectClicked.count, 0)
visualInspectionPoint()
+ map.center = preMapCircle.center
point = map.toScreenPosition(preMapCircle.center)
mouseClick(map, point.x - 5, point.y - 5)
compare(preMapRectClicked.count, 0)
compare(preMapCircleClicked.count, 0)
+ map.center = preMapCircle.center.atDistanceAndAzimuth(preMapCircle.radius, -45)
mouseClick(map, preMapCircle.x + 4, preMapCircle.y + 4)
compare(preMapRectClicked.count, 0)
compare(preMapCircleClicked.count, 0)
compare(preMapQuickItemClicked.count, 0)
+ map.center = preMapQuickItem.coordinate
point = map.toScreenPosition(preMapQuickItem.coordinate)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapQuickItemClicked.count, 0)
+ map.center = preMapPolygon.path[1]
point = map.toScreenPosition(preMapPolygon.path[1])
mouseClick(map, point.x - 5, point.y)
compare(preMapPolygonClicked.count, 0)
- // re-add items and verify they are back (without needing to pan map etc.)
+ // re-add items and verify they are back
// note: addition order is significant
map.addMapItem(preMapRect)
map.addMapItem(preMapCircle)
@@ -319,20 +336,25 @@ Item {
map.addMapItem(preMapRoute)
compare (map.mapItems.length, 6)
visualInspectionPoint()
+ map.center = preMapRect.topLeft
point = map.toScreenPosition(preMapRect.topLeft)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapRectClicked.count, 1)
+ map.center = preMapCircle.center
point = map.toScreenPosition(preMapCircle.center)
mouseClick(map, point.x - 5, point.y - 5)
compare(preMapRectClicked.count, 1)
compare(preMapCircleClicked.count, 1)
+ map.center = preMapCircle.center.atDistanceAndAzimuth(preMapCircle.radius, -45)
mouseClick(map, preMapCircle.x + 4, preMapCircle.y + 4)
compare(preMapRectClicked.count, 2)
compare(preMapCircleClicked.count, 1)
compare(preMapQuickItemClicked.count, 0)
+ map.center = preMapQuickItem.coordinate
point = map.toScreenPosition(preMapQuickItem.coordinate)
mouseClick(map, point.x + 5, point.y + 5)
compare(preMapQuickItemClicked.count, 1)
+ map.center = preMapPolygon.path[1]
point = map.toScreenPosition(preMapPolygon.path[1])
mouseClick(map, point.x - 5, point.y)
compare(preMapPolygonClicked.count, 1)
@@ -340,41 +362,45 @@ Item {
// item clips to map. not sure if this is sensible test
map.addMapItem(extMapCircle)
+ map.center = extMapCircle.center
visualInspectionPoint();
point = map.toScreenPosition(extMapCircle.center)
mouseClick(map, point.x, point.y)
compare(extMapCircleClicked.count, 1)
mouseClick(map, point.x, -5)
compare(extMapCircleClicked.count, 1)
+ map.removeMapItem(extMapCircle)
map.addMapItem(extMapQuickItem)
+ map.center = extMapQuickItem.coordinate
visualInspectionPoint();
point = map.toScreenPosition(extMapQuickItem.coordinate)
mouseClick(map, point.x + 5, point.y + 5)
compare(extMapQuickItemClicked.count, 1)
mouseClick(map, map.width + 5, point.y + 5)
compare(extMapQuickItemClicked.count, 1)
+ map.removeMapItem(extMapQuickItem)
}
function test_ab_drag() {
clear_data()
// basic drags, drag rectangle
compare (preMapRectActiveChanged.count, 0)
- var i = 0
+ map.center = preMapRect.topLeft
+ var i
var point = map.toScreenPosition(preMapRect.topLeft)
+ var targetCoordinate = map.toCoordinate(51, 51)
mousePress(map, point.x + 5, point.y + 5)
- for (i=0; i < 50; i += 5) {
+ for (i = 0; i < 50; i += 1) {
wait(1)
mouseMove(map, point.x + 5 - i, point.y + 5 - i)
}
mouseRelease(map, point.x + 5 - i, point.y + 5 - i)
- visualInspectionPoint()
compare (preMapRectActiveChanged.count, 2)
- // coordinates update only (once) after drag has finished
- compare (preMapRectTopLeftChanged.count, 1)
- compare (preMapRectBottomRightChanged.count, 1)
- verify(fuzzy_compare(preMapRect.topLeft.latitude, 27.2, 0.1))
- verify(fuzzy_compare(preMapRect.topLeft.longitude, 12.1, 0.1))
+ verify(preMapRectTopLeftChanged.count > 1)
+ verify(preMapRectBottomRightChanged.count === preMapRectTopLeftChanged.count)
+ verify(fuzzy_compare(preMapRect.topLeft.latitude, targetCoordinate.latitude, 0.2))
+ verify(fuzzy_compare(preMapRect.topLeft.longitude, targetCoordinate.longitude, 0.2))
var latH = preMapRect.bottomRight.latitude - preMapRect.topLeft.latitude
var lonW = preMapRect.bottomRight.longitude - preMapRect.topLeft.longitude
verify(fuzzy_compare(preMapRect.bottomRight.latitude, preMapRect.topLeft.latitude + latH, 0.1))
@@ -382,34 +408,38 @@ Item {
// drag circle
compare (preMapCircleActiveChanged.count, 0)
+ map.center = preMapCircle.center
point = map.toScreenPosition(preMapCircle.center)
+ targetCoordinate = map.toCoordinate(51, 51)
mousePress(map, point.x, point.y)
- for (i=0; i < 50; i += 5) {
+ for (i = 0; i < 50; i += 1) {
wait(1)
mouseMove(map, point.x - i, point.y - i)
}
mouseRelease(map, point.x - i, point.y - i)
visualInspectionPoint()
- compare (preMapRectActiveChanged.count, 2)
- compare (preMapCircleCenterChanged.count, 1)
- verify(fuzzy_compare(preMapCircle.center.latitude, 17.7, 0.1))
- verify(fuzzy_compare(preMapCircle.center.longitude, 22.1, 0.1))
+ compare(preMapRectActiveChanged.count, 2)
+ compare(preMapCircleActiveChanged.count, 2)
+ verify(preMapCircleCenterChanged.count > 1)
+ verify(fuzzy_compare(preMapCircle.center.latitude, targetCoordinate.latitude, 0.2))
+ verify(fuzzy_compare(preMapCircle.center.longitude, targetCoordinate.longitude, 0.2))
// drag quick item
compare (preMapQuickItemActiveChanged.count, 0)
- i = 0
+ map.center = preMapQuickItem.coordinate
point = map.toScreenPosition(preMapQuickItem.coordinate)
+ targetCoordinate = map.toCoordinate(51, 51)
mousePress(map, point.x + 5, point.y + 5)
- for (i=0; i < 50; i += 5) {
+ for (i = 0; i < 50; i += 1) {
wait(1)
- mouseMove(map, point.x + i, point.y + i)
+ mouseMove(map, point.x - i, point.y - i)
}
- mouseRelease(map, point.x + i, point.y + i)
+ mouseRelease(map, point.x - i, point.y - i)
visualInspectionPoint()
- compare (preMapQuickItemActiveChanged.count, 2)
- compare (preMapQuickItemCoordinateChanged.count, 1)
- verify(fuzzy_compare(preMapQuickItem.coordinate.latitude, 29, 0.1))
- verify(fuzzy_compare(preMapQuickItem.coordinate.longitude, 10, 0.1))
+ compare(preMapQuickItemActiveChanged.count, 2)
+ verify(preMapQuickItemCoordinateChanged.count > 1)
+ verify(fuzzy_compare(preMapQuickItem.coordinate.latitude, targetCoordinate.latitude, 0.2))
+ verify(fuzzy_compare(preMapQuickItem.coordinate.longitude, targetCoordinate.longitude, 0.2))
}
function test_ac_basic_properties() {
diff --git a/tests/auto/declarative_ui/tst_map_item_details.qml b/tests/auto/declarative_ui/tst_map_item_details.qml
index a15fc353..ca7ca8c2 100644
--- a/tests/auto/declarative_ui/tst_map_item_details.qml
+++ b/tests/auto/declarative_ui/tst_map_item_details.qml
@@ -112,6 +112,7 @@ Item {
MouseArea {
anchors.fill: parent
drag.target: parent
+ preventStealing: true
}
}
@@ -126,6 +127,7 @@ Item {
MouseArea {
anchors.fill: parent
drag.target: parent
+ preventStealing: true
}
}
@@ -134,6 +136,7 @@ Item {
MouseArea {
anchors.fill: parent
drag.target: parent
+ preventStealing: true
}
coordinate {
latitude: 20
@@ -158,6 +161,7 @@ Item {
MouseArea {
anchors.fill: parent
drag.target: parent
+ preventStealing: true
}
}
@@ -322,6 +326,7 @@ Item {
clear_data()
compare (extMapPolygon.border.width, 1.0)
compare (extMapPolygonClicked.count, 0)
+ map.center = extMapPolygon.path[1]
var point = map.toScreenPosition(extMapPolygon.path[1])
map.addMapItem(extMapPolygon)
verify(extMapPolygon.path.length == 2)
@@ -429,6 +434,7 @@ Item {
extMapRectDateline.bottomRight.longitude = datelineCoordinateRight.longitude
point = map.toScreenPosition(extMapRectDateline.bottomRight)
verify(point.x > map.width / 2.0)
+ // move item edge onto dateline
extMapRectDateline.topLeft.longitude = datelineCoordinate.longitude
point = map.toScreenPosition(extMapRectDateline.topLeft)
verify(point.x == map.width / 2.0)
@@ -448,8 +454,9 @@ Item {
// circle
map.addMapItem(extMapCircleDateline)
- verify(extMapCircleDateline.center.longitude == 180)
- var point = map.toScreenPosition(extMapCircleDateline.center)
+ verify(extMapCircleDateline.center.longitude === 180)
+ map.center = datelineCoordinate
+ point = map.toScreenPosition(extMapCircleDateline.center)
verify(point.x == map.width / 2.0)
extMapCircleDateline.center.longitude = datelineCoordinateRight.longitude
point = map.toScreenPosition(extMapCircleDateline.center)
@@ -466,7 +473,8 @@ Item {
// quickitem
map.addMapItem(extMapQuickItemDateline)
- verify(extMapQuickItemDateline.coordinate.longitude == 175)
+ map.center = datelineCoordinate
+ verify(extMapQuickItemDateline.coordinate.longitude === 175)
point = map.toScreenPosition(extMapQuickItemDateline.coordinate)
verify(point.x < map.width / 2.0)
extMapQuickItemDateline.coordinate.longitude = datelineCoordinateRight.longitude
@@ -484,6 +492,7 @@ Item {
// polygon
map.addMapItem(extMapPolygonDateline)
+ map.center = datelineCoordinate
verify(extMapPolygonDateline.path[0].longitude == 175)
verify(extMapPolygonDateline.path[1].longitude == -175)
verify(extMapPolygonDateline.path[2].longitude == -175)
@@ -530,6 +539,7 @@ Item {
// polyline
map.addMapItem(extMapPolylineDateline)
+ map.center = datelineCoordinate
verify(extMapPolylineDateline.path[0].longitude == 175)
verify(extMapPolylineDateline.path[1].longitude == -175)
point = map.toScreenPosition(extMapPolylineDateline.path[0])
@@ -626,6 +636,7 @@ Item {
// circle
map.addMapItem(extMapCircleEdge)
+ map.center = datelineCoordinate
verify(extMapCircleEdge.center.longitude == -15)
var point = map.toScreenPosition(extMapCircleEdge.center)
verify(point.x < map.width)
@@ -647,6 +658,7 @@ Item {
// quickitem
map.addMapItem(extMapQuickItemEdge)
+ map.center = datelineCoordinate
verify(extMapQuickItemEdge.coordinate.longitude == -15)
point = map.toScreenPosition(extMapQuickItemEdge.coordinate)
verify(point.x < map.width)
@@ -666,6 +678,7 @@ Item {
map.removeMapItem(extMapQuickItemEdge)
// polygon
+ map.center = datelineCoordinate
map.addMapItem(extMapPolygonEdge)
verify(extMapPolygonEdge.path[0].longitude == -15)
verify(extMapPolygonEdge.path[1].longitude == -5)
diff --git a/tests/auto/declarative_ui/tst_map_mouse.qml b/tests/auto/declarative_ui/tst_map_mouse.qml
index 189b7c7b..a8bff2e8 100644
--- a/tests/auto/declarative_ui/tst_map_mouse.qml
+++ b/tests/auto/declarative_ui/tst_map_mouse.qml
@@ -126,6 +126,8 @@ Item {
property bool lastIsClick: false
property bool lastAccepted: false;
+ preventStealing: true
+
// The following signal handlers use arguments[0] instead of mouse due to QTBUG-36560
onClicked: page.setMouseData(mouseUpper, arguments[0])
onDoubleClicked: page.setMouseData(mouseUpper, arguments[0])