From 20e847f9d8e307524fc33e590ffbb4ed0a248238 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Tue, 13 Aug 2019 21:31:53 +0200 Subject: 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 --- qt-models/divelistmodel.cpp | 22 +++++++++++++++------- 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(); - if (d.id() == id) - return i; - } - return -1; + DiveListModel *mySourceModel = qobject_cast(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 roleNames() const; QString startAddDive(); -- cgit v1.2.3-70-g09d2