diff --git a/src/lib/marble/declarative/MarbleQuickItem.cpp b/src/lib/marble/declarative/MarbleQuickItem.cpp index 66fc007d8c33f5b5579be28b9ea5158658b0f1b8..64f5d9bb4fdff8d0db6d041d7e27e4e3e828fd52 100644 --- a/src/lib/marble/declarative/MarbleQuickItem.cpp +++ b/src/lib/marble/declarative/MarbleQuickItem.cpp @@ -32,6 +32,7 @@ #include #include #include +#include namespace Marble { @@ -72,7 +73,7 @@ namespace Marble void handleMouseButtonPressAndHold(const QPoint &position) { - /** @TODO: Implement */ + m_marbleQuick->reverseGeocoding(position); } private Q_SLOTS: @@ -150,7 +151,8 @@ namespace Marble m_inputHandler(&m_presenter, marble), m_placemarkDelegate(nullptr), m_placemarkItem(nullptr), - m_placemark(nullptr) + m_placemark(nullptr), + m_reverseGeocoding(&m_model) { m_currentPosition.setName(QObject::tr("Current Location")); } @@ -168,6 +170,7 @@ namespace Marble QQmlComponent* m_placemarkDelegate; QQuickItem* m_placemarkItem; Placemark* m_placemark; + ReverseGeocodingRunnerManager m_reverseGeocoding; }; MarbleQuickItem::MarbleQuickItem(QQuickItem *parent) : QQuickPaintedItem(parent) @@ -189,6 +192,8 @@ namespace Marble connect(&d->m_map, SIGNAL(visibleLatLonAltBoxChanged(GeoDataLatLonAltBox)), this, SLOT(updatePositionVisibility())); connect(&d->m_map, SIGNAL(visibleLatLonAltBoxChanged(GeoDataLatLonAltBox)), this, SIGNAL(visibleLatLonAltBoxChanged())); connect(&d->m_map, SIGNAL(radiusChanged(int)), this, SIGNAL(zoomChanged())); + connect(&d->m_reverseGeocoding, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)), + this, SLOT(handleReverseGeocoding(GeoDataCoordinates,GeoDataPlacemark))); setAcceptedMouseButtons(Qt::AllButtons); installEventFilter(&d->m_inputHandler); @@ -272,6 +277,14 @@ namespace Marble } } + void MarbleQuickItem::handleReverseGeocoding(const GeoDataCoordinates &coordinates, const GeoDataPlacemark &placemark) + { + if (d->m_placemark && d->m_placemark->coordinate()->coordinates() == coordinates) { + d->m_placemark->setGeoDataPlacemark(placemark); + updatePlacemarks(); + } + } + void MarbleQuickItem::paint(QPainter *painter) { //TODO - much to be done here still, i.e paint !enabled version QPaintDevice *paintDevice = painter->device(); @@ -413,6 +426,19 @@ namespace Marble return d->m_placemarkDelegate; } + void MarbleQuickItem::reverseGeocoding(const QPoint &point) + { + qreal lon, lat; + d->m_map.viewport()->geoCoordinates(point.x(), point.y(), lon, lat); + auto const coordinates = GeoDataCoordinates(lon, lat, 0.0, GeoDataCoordinates::Degree); + delete d->m_placemarkItem; + d->m_placemarkItem = nullptr; + delete d->m_placemark; + d->m_placemark = new Placemark; + d->m_placemark->coordinate()->setCoordinates(coordinates); + d->m_reverseGeocoding.reverseGeocoding(coordinates); + } + qreal MarbleQuickItem::speed() const { return d->m_model.positionTracking()->speed(); diff --git a/src/lib/marble/declarative/MarbleQuickItem.h b/src/lib/marble/declarative/MarbleQuickItem.h index 43682b0396d38ede7eaf7dfc62f37aa4ba2b960b..dd8c0219ab9b4f9cea6419b9b0165351208d2650 100644 --- a/src/lib/marble/declarative/MarbleQuickItem.h +++ b/src/lib/marble/declarative/MarbleQuickItem.h @@ -169,6 +169,7 @@ namespace Marble bool inertialGlobeRotation() const; QQmlComponent* placemarkDelegate() const; + void reverseGeocoding(const QPoint &point); Q_SIGNALS: void mapWidthChanged(int mapWidth); @@ -209,6 +210,7 @@ namespace Marble void updatePositionVisibility(); void updateCurrentPosition(const GeoDataCoordinates & coordinates); void updatePlacemarks(); + void handleReverseGeocoding(const GeoDataCoordinates &coordinates, const GeoDataPlacemark &placemark); private: typedef QSharedPointer MarbleQuickItemPrivatePtr;