Dive site: add proximity field to dive site list

Merging dive sites is currently only possible if dive sites are at
the exact same position.

Introduce a field where the user can enter a distance up to which all
dive sites should be listed. These can then be merged.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-03-25 22:18:32 +01:00 committed by Dirk Hohndel
parent 22fe0c14e8
commit 8287d86d2b
5 changed files with 63 additions and 5 deletions

View file

@ -11,6 +11,7 @@
#include "core/subsurface-qt/DiveListNotifier.h"
#include "command.h"
#include "core/taxonomy.h"
#include "core/settings/qPrefUnit.h"
#include <QDebug>
#include <QShowEvent>
@ -20,7 +21,7 @@
#include <QDesktopWidget>
#include <QScrollBar>
LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), diveSite(nullptr)
LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), diveSite(nullptr), closeDistance(0)
{
ui.setupUi(this);
ui.diveSiteMessage->setCloseButtonVisible(false);
@ -35,6 +36,8 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo
ui.diveSiteCoordinates->installEventFilter(this);
connect(&diveListNotifier, &DiveListNotifier::diveSiteChanged, this, &LocationInformationWidget::diveSiteChanged);
connect(qPrefUnits::instance(), &qPrefUnits::unit_systemChanged, this, &LocationInformationWidget::unitsChanged);
unitsChanged();
ui.diveSiteListView->setModel(&filter_model);
ui.diveSiteListView->setModelColumn(LocationInformationModel::NAME);
@ -112,6 +115,17 @@ void LocationInformationWidget::updateLabels()
ui.locationTags->setText(constructLocationTags(&diveSite->taxonomy, false));
}
void LocationInformationWidget::unitsChanged()
{
if (prefs.units.length == units::METERS) {
ui.diveSiteDistanceUnits->setText("m");
ui.diveSiteDistance->setText(QString::number(lrint(closeDistance / 1000.0)));
} else {
ui.diveSiteDistanceUnits->setText("ft");
ui.diveSiteDistance->setText(QString::number(lrint(mm_to_feet(closeDistance))));
}
}
void LocationInformationWidget::diveSiteChanged(struct dive_site *ds, int field)
{
if (diveSite != ds)
@ -222,6 +236,16 @@ void LocationInformationWidget::on_diveSiteNotes_editingFinished()
Command::editDiveSiteNotes(diveSite, ui.diveSiteNotes->toPlainText());
}
void LocationInformationWidget::on_diveSiteDistance_textChanged(const QString &s)
{
bool ok;
uint64_t d = s.toLongLong(&ok);
if (!ok)
d = 0;
closeDistance = prefs.units.length == units::METERS ? d * 1000 : feet_to_mm(d);
filter_model.setDistance(closeDistance);
}
void LocationInformationWidget::reverseGeocode()
{
location_t location = parseGpsText(ui.diveSiteCoordinates->text());