summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2017-11-09 18:43:21 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-11-09 12:40:25 -0800
commit746874a78e2abb53655e422abe66aa4f61fe47d1 (patch)
tree35a8db73631e334089f9ba41f8af9c7c5e63a5fb
parent89ccdc31784f37a4f29befd2f45a33f50a121dc0 (diff)
downloadsubsurface-746874a78e2abb53655e422abe66aa4f61fe47d1.tar.gz
map-widget: allow real-time updates of edited markers
This patch allows updating the location of map markers while editing a dive site and updating the text in the LocationInformationWidget in real-time. Currently it is only possible to see the marker changes by clicking 'Apply'. The modification required the following changes: - add the MapWidget::updateCurrentDiveSiteCoordinatesToMap() slot and call it each time the GPS text updates - separate the updateCurrentDiveSiteCoordinates(FromMap/ToMap) logic by having the FromMap/ToMap suffix to method names - make MapWidgetHelper::updateCurrentDiveSiteCoordinatesToMap() call a new MapLocationModel::updateMapLocationCoordinates() method, which updates selected location coordinates and the model - add MapLocation::setCoordinateNoEmit() that does not emit a signal when updating a coordinate Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
-rw-r--r--desktop-widgets/locationinformation.cpp2
-rw-r--r--desktop-widgets/mapwidget.cpp6
-rw-r--r--desktop-widgets/mapwidget.h1
-rw-r--r--map-widget/qml/MapWidget.qml2
-rw-r--r--map-widget/qmlmapwidgethelper.cpp10
-rw-r--r--map-widget/qmlmapwidgethelper.h3
-rw-r--r--qt-models/maplocationmodel.cpp22
-rw-r--r--qt-models/maplocationmodel.h2
8 files changed, 45 insertions, 3 deletions
diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp
index 78126b172..a74f08fa1 100644
--- a/desktop-widgets/locationinformation.cpp
+++ b/desktop-widgets/locationinformation.cpp
@@ -52,6 +52,8 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo
this, &LocationInformationWidget::updateGpsCoordinates);
connect(this, &LocationInformationWidget::endEditDiveSite,
MapWidget::instance(), &MapWidget::repopulateLabels);
+ connect(this, &LocationInformationWidget::coordinatesChanged,
+ MapWidget::instance(), &MapWidget::updateCurrentDiveSiteCoordinatesToMap);
}
bool LocationInformationWidget::eventFilter(QObject *, QEvent *ev)
diff --git a/desktop-widgets/mapwidget.cpp b/desktop-widgets/mapwidget.cpp
index aefda2a32..4e02ddf41 100644
--- a/desktop-widgets/mapwidget.cpp
+++ b/desktop-widgets/mapwidget.cpp
@@ -118,6 +118,12 @@ void MapWidget::coordinatesChangedLocal()
emit coordinatesChanged();
}
+void MapWidget::updateCurrentDiveSiteCoordinatesToMap()
+{
+ CHECK_IS_READY_RETURN_VOID();
+ m_mapHelper->updateCurrentDiveSiteCoordinatesToMap();
+}
+
MapWidget::~MapWidget()
{
m_instance = NULL;
diff --git a/desktop-widgets/mapwidget.h b/desktop-widgets/mapwidget.h
index bb861d301..801913594 100644
--- a/desktop-widgets/mapwidget.h
+++ b/desktop-widgets/mapwidget.h
@@ -35,6 +35,7 @@ public slots:
void selectedDivesChanged(QList<int>);
void coordinatesChangedLocal();
void doneLoading(QQuickWidget::Status status);
+ void updateCurrentDiveSiteCoordinatesToMap();
private:
void setEditMode(bool editMode);
diff --git a/map-widget/qml/MapWidget.qml b/map-widget/qml/MapWidget.qml
index 2a3283482..c7904fc5f 100644
--- a/map-widget/qml/MapWidget.qml
+++ b/map-widget/qml/MapWidget.qml
@@ -72,7 +72,7 @@ Item {
onDoubleClicked: map.doubleClickHandler(mapItem.coordinate)
onReleased: {
if (mapHelper.editMode && mapHelper.model.selectedUuid === model.uuid) {
- mapHelper.updateCurrentDiveSiteCoordinates(mapHelper.model.selectedUuid, mapItem.coordinate)
+ mapHelper.updateCurrentDiveSiteCoordinatesFromMap(mapHelper.model.selectedUuid, mapItem.coordinate)
}
}
}
diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp
index 1c0469c4a..16f57c317 100644
--- a/map-widget/qmlmapwidgethelper.cpp
+++ b/map-widget/qmlmapwidgethelper.cpp
@@ -210,7 +210,7 @@ void MapWidgetHelper::copyToClipboardCoordinates(QGeoCoordinate coord, bool form
prefs.coordinates_traditional = savep;
}
-void MapWidgetHelper::updateCurrentDiveSiteCoordinates(quint32 uuid, QGeoCoordinate coord)
+void MapWidgetHelper::updateCurrentDiveSiteCoordinatesFromMap(quint32 uuid, QGeoCoordinate coord)
{
MapLocation *loc = m_mapLocationModel->getMapLocationForUuid(uuid);
if (loc)
@@ -220,6 +220,14 @@ void MapWidgetHelper::updateCurrentDiveSiteCoordinates(quint32 uuid, QGeoCoordin
emit coordinatesChanged();
}
+void MapWidgetHelper::updateCurrentDiveSiteCoordinatesToMap()
+{
+ const qreal latitude = displayed_dive_site.latitude.udeg * 0.000001;
+ const qreal longitude = displayed_dive_site.longitude.udeg * 0.000001;
+ QGeoCoordinate coord(latitude, longitude);
+ m_mapLocationModel->updateMapLocationCoordinates(displayed_dive_site.uuid, coord);
+}
+
bool MapWidgetHelper::editMode()
{
return m_editMode;
diff --git a/map-widget/qmlmapwidgethelper.h b/map-widget/qmlmapwidgethelper.h
index 36d25d178..22388e237 100644
--- a/map-widget/qmlmapwidgethelper.h
+++ b/map-widget/qmlmapwidgethelper.h
@@ -24,8 +24,9 @@ public:
void reloadMapLocations();
Q_INVOKABLE void copyToClipboardCoordinates(QGeoCoordinate coord, bool formatTraditional);
Q_INVOKABLE void calculateSmallCircleRadius(QGeoCoordinate coord);
- Q_INVOKABLE void updateCurrentDiveSiteCoordinates(quint32 uuid, QGeoCoordinate coord);
+ Q_INVOKABLE void updateCurrentDiveSiteCoordinatesFromMap(quint32 uuid, QGeoCoordinate coord);
Q_INVOKABLE void selectVisibleLocations();
+ void updateCurrentDiveSiteCoordinatesToMap();
bool editMode();
void setEditMode(bool editMode);
QString pluginObject();
diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp
index 9666ca009..d8070862e 100644
--- a/qt-models/maplocationmodel.cpp
+++ b/qt-models/maplocationmodel.cpp
@@ -1,4 +1,5 @@
// SPDX-License-Identifier: GPL-2.0
+#include <QDebug>
#include "maplocationmodel.h"
const char *MapLocation::PROPERTY_NAME_COORDINATE = "coordinate";
@@ -39,6 +40,11 @@ void MapLocation::setCoordinate(QGeoCoordinate coord)
emit coordinateChanged();
}
+void MapLocation::setCoordinateNoEmit(QGeoCoordinate coord)
+{
+ m_coordinate = coord;
+}
+
quint32 MapLocation::uuid()
{
return m_uuid;
@@ -136,3 +142,19 @@ MapLocation *MapLocationModel::getMapLocationForUuid(quint32 uuid)
}
return NULL;
}
+
+void MapLocationModel::updateMapLocationCoordinates(quint32 uuid, QGeoCoordinate coord)
+{
+ MapLocation *location;
+ int row = 0;
+ foreach(location, m_mapLocations) {
+ if (uuid == location->uuid()) {
+ location->setCoordinateNoEmit(coord);
+ emit dataChanged(createIndex(0, row), createIndex(0, row));
+ return;
+ }
+ row++;
+ }
+ // should not happen, as this should be called only when editing an existing marker
+ qWarning() << "MapLocationModel::updateMapLocationCoordinates(): cannot find MapLocation for uuid:" << uuid;
+}
diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h
index 114de4c92..e198773a5 100644
--- a/qt-models/maplocationmodel.h
+++ b/qt-models/maplocationmodel.h
@@ -27,6 +27,7 @@ public:
QVariant getRole(int role) const;
QGeoCoordinate coordinate();
void setCoordinate(QGeoCoordinate coord);
+ void setCoordinateNoEmit(QGeoCoordinate coord);
quint32 uuid();
enum Roles {
@@ -62,6 +63,7 @@ public:
void addList(QVector<MapLocation *>);
void clear();
MapLocation *getMapLocationForUuid(quint32 uuid);
+ void updateMapLocationCoordinates(quint32 uuid, QGeoCoordinate coord);
Q_INVOKABLE void setSelectedUuid(QVariant uuid, QVariant fromClick = true);
quint32 selectedUuid();