mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
When presenting the list of dive sites on the dive-info tab, sort the dive sites by distance to the current dive. The idea is that when the user wants to select a dive site, close dive sites should be prioritized. The location of the dive is determined with the dive_get_gps_location() function introduced in the previous commit. This actual GPS data get precedence over the currently set dive site for that dive. On change of dive, the current location is updated in the DiveLocationFilterProxyModel so that a potentially expensive search for GPS data is not repeated for every comparison. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
115 lines
3.4 KiB
C++
115 lines
3.4 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef LOCATIONINFORMATION_H
|
|
#define LOCATIONINFORMATION_H
|
|
|
|
#include "core/units.h"
|
|
#include "core/divesite.h"
|
|
#include "ui_locationinformation.h"
|
|
#include "qt-models/divelocationmodel.h"
|
|
#include <stdint.h>
|
|
#include <QAbstractListModel>
|
|
#include <QSortFilterProxyModel>
|
|
|
|
class LocationInformationWidget : public QGroupBox {
|
|
Q_OBJECT
|
|
public:
|
|
LocationInformationWidget(QWidget *parent = 0);
|
|
bool eventFilter(QObject*, QEvent*) override;
|
|
void initFields(dive_site *ds);
|
|
|
|
protected:
|
|
void enableLocationButtons(bool enable);
|
|
|
|
public slots:
|
|
void acceptChanges();
|
|
void on_diveSiteCountry_editingFinished();
|
|
void on_diveSiteCoordinates_editingFinished();
|
|
void on_diveSiteDescription_editingFinished();
|
|
void on_diveSiteName_editingFinished();
|
|
void on_diveSiteNotes_editingFinished();
|
|
void on_diveSiteDistance_textChanged(const QString &s);
|
|
void reverseGeocode();
|
|
void mergeSelectedDiveSites();
|
|
private slots:
|
|
void updateLabels();
|
|
void diveSiteChanged(struct dive_site *ds, int field);
|
|
void unitsChanged();
|
|
private:
|
|
void keyPressEvent(QKeyEvent *e) override;
|
|
void clearLabels();
|
|
Ui::LocationInformation ui;
|
|
GPSLocationInformationModel filter_model;
|
|
dive_site *diveSite;
|
|
int64_t closeDistance; // Distance of "close" dive sites in mm
|
|
};
|
|
|
|
class DiveLocationFilterProxyModel : public QSortFilterProxyModel {
|
|
Q_OBJECT
|
|
QString filter;
|
|
public:
|
|
DiveLocationFilterProxyModel(QObject *parent = 0);
|
|
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;
|
|
bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override;
|
|
void setFilter(const QString &filter);
|
|
void setCurrentLocation(location_t loc);
|
|
private:
|
|
location_t currentLocation; // Sort by distance to that location
|
|
};
|
|
|
|
class DiveLocationModel : public QAbstractTableModel {
|
|
Q_OBJECT
|
|
public:
|
|
DiveLocationModel(QObject *o = 0);
|
|
void resetModel();
|
|
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
|
|
int rowCount(const QModelIndex& parent = QModelIndex()) const;
|
|
int columnCount(const QModelIndex& parent = QModelIndex()) const;
|
|
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
|
|
private:
|
|
QString new_ds_value[2];
|
|
};
|
|
|
|
class DiveLocationListView : public QListView {
|
|
Q_OBJECT
|
|
public:
|
|
DiveLocationListView(QWidget *parent = 0);
|
|
protected:
|
|
void currentChanged(const QModelIndex& current, const QModelIndex& previous) override;
|
|
signals:
|
|
void currentIndexChanged(const QModelIndex& current);
|
|
};
|
|
|
|
class DiveLocationLineEdit : public QLineEdit {
|
|
Q_OBJECT
|
|
public:
|
|
enum DiveSiteType { NO_DIVE_SITE, NEW_DIVE_SITE, EXISTING_DIVE_SITE };
|
|
DiveLocationLineEdit(QWidget *parent =0 );
|
|
void refreshDiveSiteCache();
|
|
void setTemporaryDiveSiteName(const QString& s);
|
|
bool eventFilter(QObject*, QEvent*);
|
|
void itemActivated(const QModelIndex& index);
|
|
DiveSiteType currDiveSiteType() const;
|
|
struct dive_site *currDiveSite() const;
|
|
void fixPopupPosition();
|
|
void setCurrentDiveSite(struct dive *d);
|
|
|
|
signals:
|
|
void diveSiteSelected();
|
|
void entered(const QModelIndex& index);
|
|
void currentChanged(const QModelIndex& index);
|
|
|
|
protected:
|
|
void keyPressEvent(QKeyEvent *ev);
|
|
void focusOutEvent(QFocusEvent *ev);
|
|
void showPopup();
|
|
|
|
private:
|
|
using QLineEdit::setText;
|
|
DiveLocationFilterProxyModel *proxy;
|
|
DiveLocationModel *model;
|
|
DiveLocationListView *view;
|
|
DiveSiteType currType;
|
|
struct dive_site *currDs;
|
|
};
|
|
|
|
#endif
|