summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-10-13 12:30:32 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-10-13 21:41:41 -0400
commita823974b70433c6a99b9fad57689693d1299def7 (patch)
treefc3d366c5d1e6293581267f6f29fb70907dbfb13
parent8815f77ea086ba474df051144098b80739a0f3ae (diff)
downloadsubsurface-a823974b70433c6a99b9fad57689693d1299def7.tar.gz
Dive site: don't use displayed_dive_site to store GPS coordinates
The displayed_dive_site object is used in the dive-site-edit widget to store the old (before-edit) data. But it was also used to store the GPS data when changed on the map or the input box. Very confusing. Instead, use the text field as only authoritative source of the GPS data. This introduces a small behavioral change: when changing the text of the GPS text field, update the list of dive sites at the same position. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--desktop-widgets/locationinformation.cpp59
1 files changed, 33 insertions, 26 deletions
diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp
index e76a45091..553115688 100644
--- a/desktop-widgets/locationinformation.cpp
+++ b/desktop-widgets/locationinformation.cpp
@@ -120,7 +120,6 @@ void LocationInformationWidget::updateLabels()
}
ui.locationTags->setText(constructLocationTags(&taxonomy, false));
-
}
void LocationInformationWidget::clearLabels()
@@ -138,12 +137,25 @@ void LocationInformationWidget::updateGpsCoordinates(degrees_t latitude, degrees
QString oldText = ui.diveSiteCoordinates->text();
const char *coords = printGPSCoords(latitude.udeg, longitude.udeg);
ui.diveSiteCoordinates->setText(coords);
- enableLocationButtons(dive_site_has_gps_location(&displayed_dive_site));
+ enableLocationButtons(latitude.udeg || longitude.udeg);
free((void *)coords);
if (oldText != ui.diveSiteCoordinates->text())
markChangedWidget(ui.diveSiteCoordinates);
}
+// Parse GPS text into latitude and longitude.
+// On error, false is returned and the output parameters are left unmodified.
+bool parseGpsText(const QString &text, degrees_t &latitude, degrees_t &longitude)
+{
+ double lat, lon;
+ if (parseGpsText(text, &lat, &lon)) {
+ latitude.udeg = lrint(lat * 1000000.0);
+ longitude.udeg = lrint(lon * 1000000.0);
+ return true;
+ }
+ return false;
+}
+
void LocationInformationWidget::acceptChanges()
{
char *uiString;
@@ -156,8 +168,6 @@ void LocationInformationWidget::acceptChanges()
currentDs = get_dive_site_by_uuid(create_dive_site_from_current_dive(uiString));
displayed_dive.dive_site_uuid = currentDs->uuid;
}
- currentDs->latitude = displayed_dive_site.latitude;
- currentDs->longitude = displayed_dive_site.longitude;
if (!same_string(uiString, currentDs->name)) {
emit nameChanged(QString(currentDs->name), ui.diveSiteName->text());
free(currentDs->name);
@@ -191,13 +201,8 @@ void LocationInformationWidget::acceptChanges()
free(uiString);
}
- if (!ui.diveSiteCoordinates->text().isEmpty()) {
- double lat, lon;
- if (parseGpsText(ui.diveSiteCoordinates->text(), &lat, &lon)) {
- currentDs->latitude.udeg = lrint(lat * 1000000.0);
- currentDs->longitude.udeg = lrint(lon * 1000000.0);
- }
- }
+ if (!ui.diveSiteCoordinates->text().isEmpty())
+ parseGpsText(ui.diveSiteCoordinates->text(), currentDs->latitude, currentDs->longitude);
if (dive_site_is_empty(currentDs)) {
LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
displayed_dive.dive_site_uuid = 0;
@@ -266,21 +271,18 @@ void LocationInformationWidget::enableEdition()
void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString &text)
{
- uint lat = displayed_dive_site.latitude.udeg;
- uint lon = displayed_dive_site.longitude.udeg;
- const char *coords = printGPSCoords(lat, lon);
- if (!same_string(qPrintable(text), coords)) {
- double latitude, longitude;
- if (parseGpsText(text, &latitude, &longitude)) {
- displayed_dive_site.latitude.udeg = lrint(latitude * 1000000);
- displayed_dive_site.longitude.udeg = lrint(longitude * 1000000);
+ degrees_t latitude, longitude;
+ bool ok_old = displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg;
+ bool ok = parseGpsText(text, latitude, longitude);
+ if (ok != ok_old || latitude.udeg != displayed_dive_site.latitude.udeg || longitude.udeg != displayed_dive_site.longitude.udeg) {
+ if (ok) {
markChangedWidget(ui.diveSiteCoordinates);
- enableLocationButtons(latitude != 0 && longitude != 0);
+ enableLocationButtons(true);
+ filter_model.setCoordinates(latitude, longitude);
} else {
enableLocationButtons(false);
}
}
- free((void *)coords);
}
void LocationInformationWidget::on_diveSiteCountry_textChanged(const QString& text)
@@ -319,17 +321,22 @@ void LocationInformationWidget::resetPallete()
void LocationInformationWidget::reverseGeocode()
{
- reverseGeoLookup(displayed_dive_site.latitude, displayed_dive_site.longitude, &taxonomy);
- updateLabels();
+ degrees_t latitude, longitude;
+ if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
+ return;
+ reverseGeoLookup(latitude, longitude, &taxonomy);
+ ui.locationTags->setText(constructLocationTags(&taxonomy, false));
}
void LocationInformationWidget::updateLocationOnMap()
{
if (!displayed_dive_site.uuid)
return;
- MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, displayed_dive_site.latitude,
- displayed_dive_site.longitude);
- filter_model.setCoordinates(displayed_dive_site.latitude, displayed_dive_site.longitude);
+ degrees_t latitude, longitude;
+ if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
+ return;
+ MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, latitude, longitude);
+ filter_model.setCoordinates(latitude, longitude);
}
DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject*)