From 28cb75b73d3d0fa4cd8dcf3aa5884e93cb13a5d2 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Fri, 30 Aug 2019 12:38:25 +0200 Subject: Map: explicitly reload selected map on click When clicking on a flag 1) The QML would call MapLocationModel::setSelected() with fromClick = true 2) MapLocationModel::setSelected() would emit a signal selectedLocationChanged() 3) MapWidgetHelper would catch that signal and do the actual processing. Other functions would call MapLocationModel::setSelected() with fromClick = false, which would not emit the selectedLocationChanged() signal. Detangle this a bit by calling the selectedLocationChanged() function directly from QML and remove the fromClick parameter. Signed-off-by: Berthold Stoeger --- map-widget/qml/MapWidget.qml | 6 ++++-- map-widget/qmlmapwidgethelper.cpp | 15 ++++++++++----- map-widget/qmlmapwidgethelper.h | 2 +- qt-models/maplocationmodel.cpp | 9 +++------ qt-models/maplocationmodel.h | 3 +-- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/map-widget/qml/MapWidget.qml b/map-widget/qml/MapWidget.qml index 602b7c338..42fc0ab88 100644 --- a/map-widget/qml/MapWidget.qml +++ b/map-widget/qml/MapWidget.qml @@ -69,8 +69,10 @@ Item { drag.target: (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) ? mapItem : undefined anchors.fill: parent onClicked: { - if (!mapHelper.editMode && model.divesite) - mapHelper.model.setSelected(model.divesite, true) + if (!mapHelper.editMode && model.divesite) { + mapHelper.model.setSelected(model.divesite) + mapHelper.selectedLocationChanged(model.divesite) + } } onDoubleClicked: map.doubleClickHandler(mapItem.coordinate) onReleased: { diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp index b49ec248d..a40fa1d9f 100644 --- a/map-widget/qmlmapwidgethelper.cpp +++ b/map-widget/qmlmapwidgethelper.cpp @@ -21,8 +21,6 @@ MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent) m_smallCircleRadius = SMALL_CIRCLE_RADIUS_PX; m_map = nullptr; m_editMode = false; - connect(m_mapLocationModel, SIGNAL(selectedLocationChanged(MapLocation *)), - this, SLOT(selectedLocationChanged(MapLocation *))); connect(&diveListNotifier, &DiveListNotifier::diveSiteChanged, this, &MapWidgetHelper::diveSiteChanged); } @@ -37,11 +35,11 @@ void MapWidgetHelper::centerOnDiveSite(struct dive_site *ds) { if (!dive_site_has_gps_location(ds)) { // dive site with no GPS - m_mapLocationModel->setSelected(ds, false); + m_mapLocationModel->setSelected(ds); QMetaObject::invokeMethod(m_map, "deselectMapLocation"); } else { // dive site with GPS - m_mapLocationModel->setSelected(ds, false); + m_mapLocationModel->setSelected(ds); QGeoCoordinate dsCoord (ds->location.lat.udeg * 0.000001, ds->location.lon.udeg * 0.000001); QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord))); } @@ -114,12 +112,19 @@ void MapWidgetHelper::reloadMapLocations() m_mapLocationModel->reload(m_map); } -void MapWidgetHelper::selectedLocationChanged(MapLocation *location) +void MapWidgetHelper::selectedLocationChanged(struct dive_site *ds_in) { int idx; struct dive *dive; QList selectedDiveIds; + + if (!ds_in) + return; + MapLocation *location = m_mapLocationModel->getMapLocation(ds_in); + if (!location) + return; QGeoCoordinate locationCoord = location->coordinate(); + for_each_dive (idx, dive) { struct dive_site *ds = get_dive_site_for_dive(dive); if (!dive_site_has_gps_location(ds)) diff --git a/map-widget/qmlmapwidgethelper.h b/map-widget/qmlmapwidgethelper.h index 4079b6aa0..3560a51d1 100644 --- a/map-widget/qmlmapwidgethelper.h +++ b/map-widget/qmlmapwidgethelper.h @@ -35,6 +35,7 @@ public: Q_INVOKABLE void calculateSmallCircleRadius(QGeoCoordinate coord); Q_INVOKABLE void updateCurrentDiveSiteCoordinatesFromMap(struct dive_site *ds, QGeoCoordinate coord); Q_INVOKABLE void selectVisibleLocations(); + Q_INVOKABLE void selectedLocationChanged(struct dive_site *ds); QString pluginObject(); private: @@ -45,7 +46,6 @@ private: bool m_editMode; private slots: - void selectedLocationChanged(MapLocation *); void diveSiteChanged(struct dive_site *ds, int field); signals: diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp index da0ec7337..452c49b8d 100644 --- a/qt-models/maplocationmodel.cpp +++ b/qt-models/maplocationmodel.cpp @@ -193,14 +193,11 @@ void MapLocationModel::reload(QObject *map) endResetModel(); } -void MapLocationModel::setSelected(struct dive_site *ds, bool fromClick) +void MapLocationModel::setSelected(struct dive_site *ds) { m_selectedDs.clear(); - if (!ds) - return; - m_selectedDs.append(ds); - if (fromClick) - emit selectedLocationChanged(getMapLocation(ds)); + if (ds) + m_selectedDs.append(ds); } bool MapLocationModel::isSelected(const QVariant &dsVariant) const diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h index b33d2d65d..3fb6f1da8 100644 --- a/qt-models/maplocationmodel.h +++ b/qt-models/maplocationmodel.h @@ -65,7 +65,7 @@ public: void reload(QObject *map); MapLocation *getMapLocation(const struct dive_site *ds); const QVector &selectedDs() const; - Q_INVOKABLE void setSelected(struct dive_site *ds, bool fromClick = true); + Q_INVOKABLE void setSelected(struct dive_site *ds); // The dive site is passed as a QVariant, because a null-QVariant is not automatically // transformed into a null pointer and warning messages are spewed onto the console. Q_INVOKABLE bool isSelected(const QVariant &ds) const; @@ -83,7 +83,6 @@ private: signals: void countChanged(int c); - void selectedLocationChanged(MapLocation *); }; #endif -- cgit v1.2.3-70-g09d2