diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-08-13 21:31:53 +0200 |
---|---|---|
committer | bstoeger <32835590+bstoeger@users.noreply.github.com> | 2019-09-14 13:20:59 +0200 |
commit | 20e847f9d8e307524fc33e590ffbb4ed0a248238 (patch) | |
tree | 8a098faaa4029466bf150bfeb9c801e0e507138b | |
parent | 62f1a92068a3322c306f88344bd02836abbade9a (diff) | |
download | subsurface-20e847f9d8e307524fc33e590ffbb4ed0a248238.tar.gz |
Mobile: Map directly from source in DiveListSortModel::getIdxForId()
Instead of looping over all dives and search the dive with the given
id, let the source model determine the index and map that. Thus,
we do only one mapping and don't generate a ton of DiveObjectHelpers.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | qt-models/divelistmodel.cpp | 22 | ||||
-rw-r--r-- | qt-models/divelistmodel.h | 1 |
2 files changed, 16 insertions, 7 deletions
diff --git a/qt-models/divelistmodel.cpp b/qt-models/divelistmodel.cpp index 8143dd550..64661a3f8 100644 --- a/qt-models/divelistmodel.cpp +++ b/qt-models/divelistmodel.cpp @@ -62,13 +62,12 @@ int DiveListSortModel::shown() int DiveListSortModel::getIdxForId(int id) { - for (int i = 0; i < rowCount(); i++) { - QVariant v = data(index(i, 0), DiveListModel::DiveRole); - DiveObjectHelper d = v.value<DiveObjectHelper>(); - if (d.id() == id) - return i; - } - return -1; + DiveListModel *mySourceModel = qobject_cast<DiveListModel *>(sourceModel()); + QModelIndex sourceIdx = mySourceModel->getDiveQIdx(id); + if (!sourceIdx.isValid()) + return -1; + QModelIndex localIdx = mapFromSource(sourceIdx); + return localIdx.row(); } void DiveListSortModel::reload() @@ -187,11 +186,20 @@ int DiveListModel::rowCount(const QModelIndex &) const return dive_table.nr; } +// Get the index of a dive in the global dive list by the dive's unique id. Returns an integer [0..nrdives). int DiveListModel::getDiveIdx(int id) const { return get_idx_by_uniq_id(id); } +// Get an index of a dive. In contrast to getDiveIdx, this returns a Qt model-index, +// which can be used to access data of a Qt model. +QModelIndex DiveListModel::getDiveQIdx(int id) +{ + int idx = getDiveIdx(id); + return idx >= 0 ? createIndex(idx, 0) : QModelIndex(); +} + QVariant DiveListModel::data(const QModelIndex &index, int role) const { if(index.row() < 0 || index.row() >= dive_table.nr) diff --git a/qt-models/divelistmodel.h b/qt-models/divelistmodel.h index 193d728ea..c355aceaf 100644 --- a/qt-models/divelistmodel.h +++ b/qt-models/divelistmodel.h @@ -58,6 +58,7 @@ public: struct dive *getDive(int i); int rowCount(const QModelIndex &parent = QModelIndex()) const; int getDiveIdx(int id) const; + QModelIndex getDiveQIdx(int id); QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QHash<int, QByteArray> roleNames() const; QString startAddDive(); |