summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-08-13 21:31:53 +0200
committerGravatar bstoeger <32835590+bstoeger@users.noreply.github.com>2019-09-14 13:20:59 +0200
commit20e847f9d8e307524fc33e590ffbb4ed0a248238 (patch)
tree8a098faaa4029466bf150bfeb9c801e0e507138b
parent62f1a92068a3322c306f88344bd02836abbade9a (diff)
downloadsubsurface-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.cpp22
-rw-r--r--qt-models/divelistmodel.h1
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();