summaryrefslogtreecommitdiff
path: root/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h')
-rw-r--r--src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h b/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
index 449a1a1d..ce0ed18e 100644
--- a/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
+++ b/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
@@ -38,12 +38,18 @@ class QQuickShapePath;
class Q_LOCATION_PRIVATE_EXPORT QGeoMapPolygonGeometry : public QGeoMapItemGeometry
{
public:
+ enum MapBorderBehaviour {
+ DrawOnce,
+ WrapAround
+ };
+
QGeoMapPolygonGeometry();
inline void setAssumeSimple(bool value) { assumeSimple_ = value; }
void updateSourcePoints(const QGeoMap &map,
- const QList<QDoubleVector2D> &path);
+ const QList<QList<QDoubleVector2D>> &path,
+ MapBorderBehaviour wrapping = WrapAround);
QPainterPath srcPath() const { return srcPath_; }
qreal maxCoord() const { return maxCoord_; }
@@ -91,7 +97,6 @@ public:
}
void markSourceDirtyAndUpdate() override
{
- // preserveGeometry is cleared in updateMapItemPaintNode
m_geometry.markSourceDirty();
m_poly.polishAndUpdate();
}
@@ -101,25 +106,29 @@ public:
return;
const QGeoProjectionWebMercator &p = static_cast<const QGeoProjectionWebMercator&>(m_poly.map()->geoProjection());
m_geopathProjected.clear();
- m_geopathProjected.reserve(m_poly.m_geopoly.size());
+ m_geopathProjected << QList<QDoubleVector2D>();
+ QList<QDoubleVector2D> &pP = m_geopathProjected.last();
+ pP.reserve(m_poly.m_geopoly.perimeter().size());
for (const QGeoCoordinate &c : m_poly.m_geopoly.perimeter())
- m_geopathProjected << p.geoToMapProjection(c);
+ pP << p.geoToMapProjection(c);
+ for (int i = 0; i < m_poly.m_geopoly.holesCount(); i++) {
+ m_geopathProjected << QList<QDoubleVector2D>();
+ QList<QDoubleVector2D> &pH = m_geopathProjected.last();
+ pH.reserve(m_poly.m_geopoly.holePath(i).size());
+ for (const QGeoCoordinate &c : m_poly.m_geopoly.holePath(i))
+ pH << p.geoToMapProjection(c);
+ }
}
void updateCache()
{
if (!m_poly.map() || m_poly.map()->geoProjection().projectionType() != QGeoProjection::ProjectionWebMercator)
return;
const QGeoProjectionWebMercator &p = static_cast<const QGeoProjectionWebMercator&>(m_poly.map()->geoProjection());
- m_geopathProjected << p.geoToMapProjection(m_poly.m_geopoly.perimeter().last());
- }
- void preserveGeometry()
- {
- m_geometry.setPreserveGeometry(true, m_poly.m_geopoly.boundingGeoRectangle().topLeft());
+ QList<QDoubleVector2D> &pP = m_geopathProjected.first();
+ pP << p.geoToMapProjection(m_poly.m_geopoly.perimeter().last());
}
void afterViewportChanged() override
{
- // preserveGeometry is cleared in updateMapItemPaintNode
- preserveGeometry();
markSourceDirtyAndUpdate();
}
void onMapSet() override
@@ -130,13 +139,11 @@ public:
void onGeoGeometryChanged() override
{
regenerateCache();
- preserveGeometry();
markSourceDirtyAndUpdate();
}
void onGeoGeometryUpdated() override
{
updateCache();
- preserveGeometry();
markSourceDirtyAndUpdate();
}
void onItemGeometryChanged() override
@@ -147,7 +154,7 @@ public:
QSGNode *updateMapItemPaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override;
bool contains(const QPointF &point) const override;
- QList<QDoubleVector2D> m_geopathProjected;
+ QList<QList<QDoubleVector2D>> m_geopathProjected;
QGeoMapPolygonGeometry m_geometry;
QQuickShape *m_shape = nullptr;
QQuickShapePath *m_shapePath = nullptr;