diff options
Diffstat (limited to 'desktop-widgets/locationinformation.cpp')
-rw-r--r-- | desktop-widgets/locationinformation.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp index 825f440ba..a57c6fb30 100644 --- a/desktop-widgets/locationinformation.cpp +++ b/desktop-widgets/locationinformation.cpp @@ -252,7 +252,7 @@ void LocationInformationWidget::reverseGeocode() Command::editDiveSiteTaxonomy(diveSite, taxonomy); } -DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject *) +DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject *) : currentLocation({0, 0}) { } @@ -263,6 +263,12 @@ void DiveLocationFilterProxyModel::setFilter(const QString &filterIn) sort(LocationInformationModel::NAME); } +void DiveLocationFilterProxyModel::setCurrentLocation(location_t loc) +{ + currentLocation = loc; + sort(LocationInformationModel::NAME); +} + bool DiveLocationFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex&) const { // We don't want to show the first two entries (add dive site with that name) @@ -282,6 +288,14 @@ bool DiveLocationFilterProxyModel::lessThan(const QModelIndex &source_left, cons // The first two entries are special - we never want to change their order if (source_left.row() <= 1 || source_right.row() <= 1) return source_left.row() < source_right.row(); + + // If there is a current location, sort by that - otherwise use the provided column + if (has_location(¤tLocation)) { + // The dive sites are -2 because of the first two items. + struct dive_site *ds1 = get_dive_site(source_left.row() - 2, &dive_site_table); + struct dive_site *ds2 = get_dive_site(source_right.row() - 2, &dive_site_table); + return get_distance(&ds1->location, ¤tLocation) < get_distance(&ds2->location, ¤tLocation); + } return source_left.data().toString().compare(source_right.data().toString(), Qt::CaseInsensitive) < 0; } @@ -543,8 +557,9 @@ void DiveLocationLineEdit::fixPopupPosition() } } -void DiveLocationLineEdit::setCurrentDiveSite(struct dive_site *ds) +void DiveLocationLineEdit::setCurrentDiveSite(struct dive *d) { + struct dive_site *ds = get_dive_site_for_dive(d); currDs = ds; if (!currDs) { currType = NO_DIVE_SITE; @@ -552,6 +567,9 @@ void DiveLocationLineEdit::setCurrentDiveSite(struct dive_site *ds) } else { setText(ds->name); } + + location_t currentLocation = d ? dive_get_gps_location(d) : location_t{0, 0}; + proxy->setCurrentLocation(currentLocation); } void DiveLocationLineEdit::showPopup() |