Dive locations: factor out common code of models

For increased maintainability, use the same columns, roles and
the same accessor function for both dive-site models.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-10-09 12:26:58 +02:00 committed by Dirk Hohndel
parent 19d651a36b
commit d6010b5155
4 changed files with 28 additions and 45 deletions

View file

@ -351,7 +351,7 @@ bool DiveLocationFilterProxyModel::filterAcceptsRow(int source_row, const QModel
if (source_row == 0)
return true;
QString sourceString = sourceModel()->index(source_row, DiveLocationModel::NAME).data(Qt::DisplayRole).toString();
QString sourceString = sourceModel()->index(source_row, LocationInformationModel::NAME).data(Qt::DisplayRole).toString();
return sourceString.toLower().contains(location_line_edit->text().toLower());
}
@ -377,7 +377,7 @@ QVariant DiveLocationModel::data(const QModelIndex &index, int role) const
static const QIcon geoCode(":geotag-icon");
if (index.row() <= 1) { // two special cases.
if (index.column() == UUID) {
if (index.column() == LocationInformationModel::UUID) {
return RECENTLY_ADDED_DIVESITE;
}
switch (role) {
@ -394,35 +394,12 @@ QVariant DiveLocationModel::data(const QModelIndex &index, int role) const
// The dive sites are -2 because of the first two items.
struct dive_site *ds = get_dive_site(index.row() - 2);
switch (role) {
case Qt::EditRole:
case Qt::DisplayRole:
switch (index.column()) {
case UUID:
return ds->uuid;
case NAME:
return ds->name;
case LATITUDE:
return ds->latitude.udeg;
case LONGITUDE:
return ds->longitude.udeg;
case DESCRIPTION:
return ds->description;
case NOTES:
return ds->name;
}
break;
case Qt::DecorationRole: {
if (dive_site_has_gps_location(ds))
return geoCode;
}
}
return QVariant();
return LocationInformationModel::getDiveSiteData(ds, index.column(), role);
}
int DiveLocationModel::columnCount(const QModelIndex&) const
{
return COLUMNS;
return LocationInformationModel::COLUMNS;
}
int DiveLocationModel::rowCount(const QModelIndex&) const
@ -453,10 +430,10 @@ DiveLocationLineEdit::DiveLocationLineEdit(QWidget *parent) : QLineEdit(parent),
location_line_edit = this;
proxy->setSourceModel(model);
proxy->setFilterKeyColumn(DiveLocationModel::NAME);
proxy->setFilterKeyColumn(LocationInformationModel::NAME);
view->setModel(proxy);
view->setModelColumn(DiveLocationModel::NAME);
view->setModelColumn(LocationInformationModel::NAME);
view->setItemDelegate(new LocationFilterDelegate());
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@ -525,10 +502,10 @@ void DiveLocationLineEdit::focusOutEvent(QFocusEvent *ev)
void DiveLocationLineEdit::itemActivated(const QModelIndex &index)
{
QModelIndex idx = index;
if (index.column() == DiveLocationModel::UUID)
idx = index.model()->index(index.row(), DiveLocationModel::NAME);
if (index.column() == LocationInformationModel::UUID)
idx = index.model()->index(index.row(), LocationInformationModel::NAME);
QModelIndex uuidIndex = index.model()->index(index.row(), DiveLocationModel::UUID);
QModelIndex uuidIndex = index.model()->index(index.row(), LocationInformationModel::UUID);
uint32_t uuid = uuidIndex.data().toInt();
currType = uuid == 1 ? NEW_DIVE_SITE : EXISTING_DIVE_SITE;
currUuid = uuid;
@ -566,8 +543,8 @@ void DiveLocationLineEdit::setTemporaryDiveSiteName(const QString&)
// a dive site to be generated. The first entry is simply the entered
// text. The second entry is the first known dive site name starting
// with the entered text.
QModelIndex i0 = model->index(0, DiveLocationModel::NAME);
QModelIndex i1 = model->index(1, DiveLocationModel::NAME);
QModelIndex i0 = model->index(0, LocationInformationModel::NAME);
QModelIndex i1 = model->index(1, LocationInformationModel::NAME);
model->setData(i0, text());
// Note: if i1_name stays empty, the line will automatically

View file

@ -63,7 +63,6 @@ public:
class DiveLocationModel : public QAbstractTableModel {
Q_OBJECT
public:
enum columns{UUID, NAME, LATITUDE, LONGITUDE, DESCRIPTION, NOTES, COLUMNS};
DiveLocationModel(QObject *o = 0);
void resetModel();
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;

View file

@ -32,20 +32,15 @@ int LocationInformationModel::rowCount(const QModelIndex&) const
return dive_site_table.nr;
}
QVariant LocationInformationModel::data(const QModelIndex &index, int role) const
QVariant LocationInformationModel::getDiveSiteData(const struct dive_site *ds, int column, int role)
{
if (!index.isValid())
return QVariant();
struct dive_site *ds = get_dive_site(index.row());
if (!ds)
return QVariant();
switch(role) {
case Qt::EditRole:
case Qt::DisplayRole :
switch(index.column()) {
switch(column) {
case UUID: return ds->uuid;
case NAME: return ds->name;
case LATITUDE: return ds->latitude.udeg;
@ -70,6 +65,15 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons
return QVariant();
}
QVariant LocationInformationModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
struct dive_site *ds = get_dive_site(index.row());
return getDiveSiteData(ds, index.column(), role);
}
void LocationInformationModel::update()
{
beginResetModel();

View file

@ -8,18 +8,21 @@
#include "core/units.h"
#include "ssrfsortfilterproxymodel.h"
class QLineEdit;
#define RECENTLY_ADDED_DIVESITE 1
bool filter_same_gps_cb (QAbstractItemModel *m, int sourceRow, const QModelIndex& parent);
class LocationInformationModel : public QAbstractTableModel {
Q_OBJECT
public:
LocationInformationModel(QObject *obj = 0);
// Common columns, roles and accessor function for all dive-site models.
// Thus, different views can connect to different models.
enum Columns { UUID, NAME, LATITUDE, LONGITUDE, COORDS, DESCRIPTION, NOTES, TAXONOMY_1, TAXONOMY_2, TAXONOMY_3, COLUMNS};
enum Roles { UUID_ROLE = Qt::UserRole + 1 };
static QVariant getDiveSiteData(const struct dive_site *ds, int column, int role);
LocationInformationModel(QObject *obj = 0);
static LocationInformationModel *instance();
int columnCount(const QModelIndex &parent) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;