diff options
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/divelocationmodel.cpp | 64 | ||||
-rw-r--r-- | qt-models/divelocationmodel.h | 11 |
2 files changed, 59 insertions, 16 deletions
diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp index 0a0eacaaf..383de43ca 100644 --- a/qt-models/divelocationmodel.cpp +++ b/qt-models/divelocationmodel.cpp @@ -11,11 +11,6 @@ #include <QIcon> #include <core/gettextfromc.h> -static bool dive_site_less_than(dive_site *a, dive_site *b) -{ - return QString(a->name) < QString(b->name); -} - LocationInformationModel *LocationInformationModel::instance() { static LocationInformationModel *self = new LocationInformationModel(); @@ -133,18 +128,9 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons void LocationInformationModel::update() { beginResetModel(); - std::sort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than); - locationNames.clear(); - for (int i = 0; i < dive_site_table.nr; i++) - locationNames << QString(dive_site_table.dive_sites[i]->name); endResetModel(); } -QStringList LocationInformationModel::allSiteNames() const -{ - return locationNames; -} - bool LocationInformationModel::removeRows(int row, int, const QModelIndex&) { if(row >= rowCount()) @@ -183,6 +169,56 @@ void LocationInformationModel::diveSiteDeleted(struct dive_site *, int idx) endRemoveRows(); } +bool DiveSiteSortedModel::filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const +{ + // TODO: filtering + return true; +} + +bool DiveSiteSortedModel::lessThan(const QModelIndex &i1, const QModelIndex &i2) const +{ + // The source indices correspond to indices in the global dive site table. + // Let's access them directly without going via the source model. + // Kind of dirty, but less effort. + struct dive_site *ds1 = get_dive_site(i1.row(), &dive_site_table); + struct dive_site *ds2 = get_dive_site(i2.row(), &dive_site_table); + if (!ds1 || !ds2) // Invalid dive sites compare as different + return false; + switch (i1.column()) { + case LocationInformationModel::NAME: + default: + return QString::localeAwareCompare(QString(ds1->name), QString(ds2->name)) < 0; // TODO: avoid copy + case LocationInformationModel::DESCRIPTION: { + int cmp = QString::localeAwareCompare(QString(ds1->description), QString(ds2->description)); // TODO: avoid copy + return cmp != 0 ? cmp < 0 : + QString::localeAwareCompare(QString(ds1->name), QString(ds2->name)) < 0; // TODO: avoid copy + } + case LocationInformationModel::NUM_DIVES: { + int cmp = ds1->dives.nr - ds2->dives.nr; + // Since by default nr dives is descending, invert sort direction of names, such that + // the names are listed as ascending. + return cmp != 0 ? cmp < 0 : + QString::localeAwareCompare(QString(ds1->name), QString(ds2->name)) < 0; // TODO: avoid copy + } + } +} + +DiveSiteSortedModel::DiveSiteSortedModel() +{ + setSourceModel(LocationInformationModel::instance()); +} + +QStringList DiveSiteSortedModel::allSiteNames() const +{ + QStringList locationNames; + int num = rowCount(); + for (int i = 0; i < num; i++) { + int idx = mapToSource(index(i, 0)).row(); + locationNames << QString(dive_site_table.dive_sites[idx]->name); + } + return locationNames; +} + GeoReferencingOptionsModel *GeoReferencingOptionsModel::instance() { static GeoReferencingOptionsModel *self = new GeoReferencingOptionsModel(); diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h index 65fabca96..f2bcc7cf7 100644 --- a/qt-models/divelocationmodel.h +++ b/qt-models/divelocationmodel.h @@ -32,12 +32,19 @@ public: public slots: void update(); - QStringList allSiteNames() const; void diveSiteDiveCountChanged(struct dive_site *ds); void diveSiteAdded(struct dive_site *ds, int idx); void diveSiteDeleted(struct dive_site *ds, int idx); +}; + +class DiveSiteSortedModel : public QSortFilterProxyModel { + Q_OBJECT private: - QStringList locationNames; + bool filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const override; + bool lessThan(const QModelIndex &i1, const QModelIndex &i2) const override; +public: + DiveSiteSortedModel(); + QStringList allSiteNames() const; }; // To access only divesites at the given GPS coordinates with the exception of a given dive site |