diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-03-12 17:28:43 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-04-12 18:19:07 +0300 |
commit | e99c4c90592c9dba17d5cbb9a99d0bf458fb53d2 (patch) | |
tree | 07eb474520f6565cf685559eb19e0c97638d7345 /qt-models/divelocationmodel.cpp | |
parent | 59f1191d0cbbb9bf7d049bfd8bd0fe544ecb40f0 (diff) | |
download | subsurface-e99c4c90592c9dba17d5cbb9a99d0bf458fb53d2.tar.gz |
Dive site: introduce proxy model DiveSiteSortedModel
The LocationInformationModel used to sort its entries and was completely
rebuilt after every change. This makes it rather complex to support
incremental changes.
Instead, keep LocationInformationModel sorted by UUID so that indexes
are consistent with indices in the core dive site table.
Implement sorting by other columns than name and enable sorting in the
dive site view.
Finally, don't cache the list of dive site names for the mobile app,
since that would also need some rather convoluted methods of keeping
the list up to date. Calculate it on the fly.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models/divelocationmodel.cpp')
-rw-r--r-- | qt-models/divelocationmodel.cpp | 64 |
1 files changed, 50 insertions, 14 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(); |