summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-08-27 12:53:46 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-08-28 05:03:59 -0700
commit66aeaddd0f9ccdb46bb0879c8a9f7e6181c3d571 (patch)
tree27afd6a46d0a7e7f6a2cf84a28846be999d490ef
parente3f8615054250d3e6fe0eb53f04bed229646e2d4 (diff)
downloadsubsurface-66aeaddd0f9ccdb46bb0879c8a9f7e6181c3d571.tar.gz
Filter: cache number of dives fulfilling filter rules
Currently, in FilterModelBase::data() the number of dives is recalculated. This happens for every mouse-over event! Calculate the number of dives only on recalculation and store the count in the items-struct. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--qt-models/filtermodels.cpp15
-rw-r--r--qt-models/filtermodels.h1
2 files changed, 13 insertions, 3 deletions
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp
index 611c3b78d..beeb7501b 100644
--- a/qt-models/filtermodels.cpp
+++ b/qt-models/filtermodels.cpp
@@ -69,6 +69,16 @@ void FilterModelBase::updateList(const QStringList &newList)
items.back().checked = true;
anyChecked = true;
}
+
+ // Finally, calculate and cache the counts. Ignore the last item, since
+ // this is the "Show Empty Tags" entry.
+ for (int i = 0; i < (int)newList.size() - 1; i++)
+ items[i].count = countDives(qPrintable(newList[i]));
+
+ // Calculate count of "Empty Tags".
+ if (!items.empty())
+ items.back().count = countDives("");
+
setStringList(newList);
}
@@ -99,9 +109,8 @@ QVariant FilterModelBase::data(const QModelIndex &index, int role) const
if (role == Qt::CheckStateRole) {
return items[index.row()].checked ? Qt::Checked : Qt::Unchecked;
} else if (role == Qt::DisplayRole) {
- QString value = stringList()[index.row()];
- int count = countDives((index.row() == rowCount() - 1) ? "" : qPrintable(value));
- return value + QString(" (%1)").arg(count);
+ int row = index.row();
+ return QStringLiteral("%1 (%2)").arg(stringList()[row], QString::number(items[row].count));
}
return QVariant();
}
diff --git a/qt-models/filtermodels.h b/qt-models/filtermodels.h
index 8bac44680..846949809 100644
--- a/qt-models/filtermodels.h
+++ b/qt-models/filtermodels.h
@@ -14,6 +14,7 @@ class FilterModelBase : public QStringListModel {
protected:
struct Item {
bool checked;
+ int count;
};
std::vector<Item> items;
public: