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>
This commit is contained in:
Berthold Stoeger 2018-08-27 12:53:46 +02:00 committed by Dirk Hohndel
parent e3f8615054
commit 66aeaddd0f
2 changed files with 13 additions and 3 deletions

View file

@ -69,6 +69,16 @@ void FilterModelBase::updateList(const QStringList &newList)
items.back().checked = true; items.back().checked = true;
anyChecked = 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); setStringList(newList);
} }
@ -99,9 +109,8 @@ QVariant FilterModelBase::data(const QModelIndex &index, int role) const
if (role == Qt::CheckStateRole) { if (role == Qt::CheckStateRole) {
return items[index.row()].checked ? Qt::Checked : Qt::Unchecked; return items[index.row()].checked ? Qt::Checked : Qt::Unchecked;
} else if (role == Qt::DisplayRole) { } else if (role == Qt::DisplayRole) {
QString value = stringList()[index.row()]; int row = index.row();
int count = countDives((index.row() == rowCount() - 1) ? "" : qPrintable(value)); return QStringLiteral("%1 (%2)").arg(stringList()[row], QString::number(items[row].count));
return value + QString(" (%1)").arg(count);
} }
return QVariant(); return QVariant();
} }

View file

@ -14,6 +14,7 @@ class FilterModelBase : public QStringListModel {
protected: protected:
struct Item { struct Item {
bool checked; bool checked;
int count;
}; };
std::vector<Item> items; std::vector<Item> items;
public: public: