mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
8815f77ea0
commit
a823974b70
1 changed files with 33 additions and 26 deletions
|
@ -120,7 +120,6 @@ void LocationInformationWidget::updateLabels()
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.locationTags->setText(constructLocationTags(&taxonomy, false));
|
ui.locationTags->setText(constructLocationTags(&taxonomy, false));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocationInformationWidget::clearLabels()
|
void LocationInformationWidget::clearLabels()
|
||||||
|
@ -138,12 +137,25 @@ void LocationInformationWidget::updateGpsCoordinates(degrees_t latitude, degrees
|
||||||
QString oldText = ui.diveSiteCoordinates->text();
|
QString oldText = ui.diveSiteCoordinates->text();
|
||||||
const char *coords = printGPSCoords(latitude.udeg, longitude.udeg);
|
const char *coords = printGPSCoords(latitude.udeg, longitude.udeg);
|
||||||
ui.diveSiteCoordinates->setText(coords);
|
ui.diveSiteCoordinates->setText(coords);
|
||||||
enableLocationButtons(dive_site_has_gps_location(&displayed_dive_site));
|
enableLocationButtons(latitude.udeg || longitude.udeg);
|
||||||
free((void *)coords);
|
free((void *)coords);
|
||||||
if (oldText != ui.diveSiteCoordinates->text())
|
if (oldText != ui.diveSiteCoordinates->text())
|
||||||
markChangedWidget(ui.diveSiteCoordinates);
|
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()
|
void LocationInformationWidget::acceptChanges()
|
||||||
{
|
{
|
||||||
char *uiString;
|
char *uiString;
|
||||||
|
@ -156,8 +168,6 @@ void LocationInformationWidget::acceptChanges()
|
||||||
currentDs = get_dive_site_by_uuid(create_dive_site_from_current_dive(uiString));
|
currentDs = get_dive_site_by_uuid(create_dive_site_from_current_dive(uiString));
|
||||||
displayed_dive.dive_site_uuid = currentDs->uuid;
|
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)) {
|
if (!same_string(uiString, currentDs->name)) {
|
||||||
emit nameChanged(QString(currentDs->name), ui.diveSiteName->text());
|
emit nameChanged(QString(currentDs->name), ui.diveSiteName->text());
|
||||||
free(currentDs->name);
|
free(currentDs->name);
|
||||||
|
@ -191,13 +201,8 @@ void LocationInformationWidget::acceptChanges()
|
||||||
free(uiString);
|
free(uiString);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ui.diveSiteCoordinates->text().isEmpty()) {
|
if (!ui.diveSiteCoordinates->text().isEmpty())
|
||||||
double lat, lon;
|
parseGpsText(ui.diveSiteCoordinates->text(), currentDs->latitude, currentDs->longitude);
|
||||||
if (parseGpsText(ui.diveSiteCoordinates->text(), &lat, &lon)) {
|
|
||||||
currentDs->latitude.udeg = lrint(lat * 1000000.0);
|
|
||||||
currentDs->longitude.udeg = lrint(lon * 1000000.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dive_site_is_empty(currentDs)) {
|
if (dive_site_is_empty(currentDs)) {
|
||||||
LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
|
LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
|
||||||
displayed_dive.dive_site_uuid = 0;
|
displayed_dive.dive_site_uuid = 0;
|
||||||
|
@ -266,21 +271,18 @@ void LocationInformationWidget::enableEdition()
|
||||||
|
|
||||||
void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString &text)
|
void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString &text)
|
||||||
{
|
{
|
||||||
uint lat = displayed_dive_site.latitude.udeg;
|
degrees_t latitude, longitude;
|
||||||
uint lon = displayed_dive_site.longitude.udeg;
|
bool ok_old = displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg;
|
||||||
const char *coords = printGPSCoords(lat, lon);
|
bool ok = parseGpsText(text, latitude, longitude);
|
||||||
if (!same_string(qPrintable(text), coords)) {
|
if (ok != ok_old || latitude.udeg != displayed_dive_site.latitude.udeg || longitude.udeg != displayed_dive_site.longitude.udeg) {
|
||||||
double latitude, longitude;
|
if (ok) {
|
||||||
if (parseGpsText(text, &latitude, &longitude)) {
|
|
||||||
displayed_dive_site.latitude.udeg = lrint(latitude * 1000000);
|
|
||||||
displayed_dive_site.longitude.udeg = lrint(longitude * 1000000);
|
|
||||||
markChangedWidget(ui.diveSiteCoordinates);
|
markChangedWidget(ui.diveSiteCoordinates);
|
||||||
enableLocationButtons(latitude != 0 && longitude != 0);
|
enableLocationButtons(true);
|
||||||
|
filter_model.setCoordinates(latitude, longitude);
|
||||||
} else {
|
} else {
|
||||||
enableLocationButtons(false);
|
enableLocationButtons(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free((void *)coords);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocationInformationWidget::on_diveSiteCountry_textChanged(const QString& text)
|
void LocationInformationWidget::on_diveSiteCountry_textChanged(const QString& text)
|
||||||
|
@ -319,17 +321,22 @@ void LocationInformationWidget::resetPallete()
|
||||||
|
|
||||||
void LocationInformationWidget::reverseGeocode()
|
void LocationInformationWidget::reverseGeocode()
|
||||||
{
|
{
|
||||||
reverseGeoLookup(displayed_dive_site.latitude, displayed_dive_site.longitude, &taxonomy);
|
degrees_t latitude, longitude;
|
||||||
updateLabels();
|
if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
|
||||||
|
return;
|
||||||
|
reverseGeoLookup(latitude, longitude, &taxonomy);
|
||||||
|
ui.locationTags->setText(constructLocationTags(&taxonomy, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocationInformationWidget::updateLocationOnMap()
|
void LocationInformationWidget::updateLocationOnMap()
|
||||||
{
|
{
|
||||||
if (!displayed_dive_site.uuid)
|
if (!displayed_dive_site.uuid)
|
||||||
return;
|
return;
|
||||||
MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, displayed_dive_site.latitude,
|
degrees_t latitude, longitude;
|
||||||
displayed_dive_site.longitude);
|
if (!parseGpsText(ui.diveSiteCoordinates->text(), latitude, longitude))
|
||||||
filter_model.setCoordinates(displayed_dive_site.latitude, displayed_dive_site.longitude);
|
return;
|
||||||
|
MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, latitude, longitude);
|
||||||
|
filter_model.setCoordinates(latitude, longitude);
|
||||||
}
|
}
|
||||||
|
|
||||||
DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject*)
|
DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject*)
|
||||||
|
|
Loading…
Add table
Reference in a new issue