mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-17 19:36:15 +00:00
The location information shows a list of dive sites at the same location as the edited dive site. This was done by passing a function to an "SsrfSortFilterProxyModel". Unfortunately, the latter does only support function pointers without state and therefore had to access the global "displayed_dive_site" object. Replace the SsrfSortFilterProxyModel by a proper subclass of QSortFilterProxyModel that contains information on the position and id of the currently edited dive site. Update the filter model if the location of the dive site changes. This introduces a behavioral change: editing the GPS location will lead to an updated list. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
119 lines
3.4 KiB
C++
119 lines
3.4 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef LOCATIONINFORMATION_H
|
|
#define LOCATIONINFORMATION_H
|
|
|
|
#include "core/units.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;
|
|
|
|
protected:
|
|
void showEvent(QShowEvent *);
|
|
void enableLocationButtons(bool enable);
|
|
|
|
public slots:
|
|
void acceptChanges();
|
|
void rejectChanges();
|
|
void updateGpsCoordinates(degrees_t latitude, degrees_t longitude);
|
|
void markChangedWidget(QWidget *w);
|
|
void enableEdition();
|
|
void resetState();
|
|
void resetPallete();
|
|
void on_diveSiteCountry_textChanged(const QString& text);
|
|
void on_diveSiteCoordinates_textChanged(const QString& text);
|
|
void on_diveSiteDescription_textChanged(const QString& text);
|
|
void on_diveSiteName_textChanged(const QString& text);
|
|
void on_diveSiteNotes_textChanged();
|
|
void reverseGeocode();
|
|
void mergeSelectedDiveSites();
|
|
private slots:
|
|
void updateLabels();
|
|
void updateLocationOnMap();
|
|
signals:
|
|
void startEditDiveSite(uint32_t uuid);
|
|
void endEditDiveSite();
|
|
void startFilterDiveSite(uint32_t uuid);
|
|
void stopFilterDiveSite();
|
|
void nameChanged(const QString &oldName, const QString &newName);
|
|
|
|
private:
|
|
void clearLabels();
|
|
Ui::LocationInformation ui;
|
|
bool modified;
|
|
QAction *acceptAction, *rejectAction;
|
|
GPSLocationInformationModel filter_model;
|
|
};
|
|
|
|
class DiveLocationFilterProxyModel : public QSortFilterProxyModel {
|
|
Q_OBJECT
|
|
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;
|
|
};
|
|
|
|
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;
|
|
uint32_t currDiveSiteUuid() const;
|
|
void fixPopupPosition();
|
|
void setCurrentDiveSiteUuid(uint32_t uuid);
|
|
|
|
signals:
|
|
void diveSiteSelected(uint32_t uuid);
|
|
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;
|
|
uint32_t currUuid;
|
|
};
|
|
|
|
#endif
|