diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2014-11-12 16:01:58 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-11-12 16:02:37 -0800 |
commit | 61dc19d2e0bc69004b03a990993eda547f4e0093 (patch) | |
tree | 0cb4af2322199c5ef65bf1083d8a3f4c2e7ac083 | |
parent | 5a329ff26295717181dd99b22dab5b6b1e80d821 (diff) | |
download | subsurface-61dc19d2e0bc69004b03a990993eda547f4e0093.tar.gz |
Show the number of dives with given person / location in the filter panel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.c | 29 | ||||
-rw-r--r-- | dive.h | 2 | ||||
-rw-r--r-- | qt-ui/models.cpp | 10 | ||||
-rw-r--r-- | qthelper.cpp | 14 |
4 files changed, 52 insertions, 3 deletions
@@ -2500,6 +2500,7 @@ bool taglist_contains(struct tag_entry *tag_list, const char *tag) return false; } +// count the dives where the tag list contains the given tag int count_dives_with_tag(const char *tag) { int i, counter = 0; @@ -2512,6 +2513,34 @@ int count_dives_with_tag(const char *tag) return counter; } +extern bool string_sequence_contains(const char *string_sequence, const char *text); + +// count the dives where the person is included in the comma separated string sequences of buddies or divemasters +int count_dives_with_person(const char *person) +{ + int i, counter = 0; + struct dive *d; + + for_each_dive (i, d) { + if (string_sequence_contains(d->buddy, person) || string_sequence_contains(d->divemaster, person)) + counter++; + } + return counter; +} + +// count the dives with exactly the location +int count_dives_with_location(const char *location) +{ + int i, counter = 0; + struct dive *d; + + for_each_dive (i, d) { + if (same_string(d->location, location)) + counter++; + } + return counter; +} + struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool prefer_downloaded) { struct dive *res = alloc_dive(); @@ -235,6 +235,8 @@ void taglist_free(struct tag_entry *tag_list); bool taglist_contains(struct tag_entry *tag_list, const char *tag); int count_dives_with_tag(const char *tag); +int count_dives_with_person(const char *person); +int count_dives_with_location(const char *location); struct extra_data { const char *key; diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index c7886d2b9..a8e561272 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2270,7 +2270,7 @@ QVariant TagFilterModel::data(const QModelIndex &index, int role) const } else if (role == Qt::DisplayRole) { QString tag = stringList()[index.row()]; int count = count_dives_with_tag(tag.toUtf8().data()); - return tag + QString("(%1)").arg(count); + return tag + QString(" (%1)").arg(count); } return QVariant(); } @@ -2467,7 +2467,9 @@ QVariant BuddyFilterModel::data(const QModelIndex &index, int role) const if (role == Qt::CheckStateRole) { return checkState[index.row()] ? Qt::Checked : Qt::Unchecked; } else if (role == Qt::DisplayRole) { - return stringList()[index.row()]; + QString person = stringList()[index.row()]; + int count = count_dives_with_person(person.toUtf8().data()); + return person + QString(" (%1)").arg(count); } return QVariant(); } @@ -2499,7 +2501,9 @@ QVariant LocationFilterModel::data(const QModelIndex &index, int role) const if (role == Qt::CheckStateRole) { return checkState[index.row()] ? Qt::Checked : Qt::Unchecked; } else if (role == Qt::DisplayRole) { - return stringList()[index.row()]; + QString location = stringList()[index.row()]; + int count = count_dives_with_location(location.toUtf8().data()); + return location + QString(" (%1)").arg(count); } return QVariant(); } diff --git a/qthelper.cpp b/qthelper.cpp index e481bc9e9..6769e8abe 100644 --- a/qthelper.cpp +++ b/qthelper.cpp @@ -301,6 +301,20 @@ extern "C" void copy_image_and_overwrite(const char *cfileName, const char *cnew QFile::copy(fileName, newName); } +extern "C" bool string_sequence_contains(const char *string_sequence, const char *text) +{ + if (same_string(text, "") || same_string(string_sequence, "")) + return false; + + QString stringSequence(string_sequence); + QStringList strings = stringSequence.split(",", QString::SkipEmptyParts); + Q_FOREACH (QString string, strings) { + if (string.trimmed().compare(QString(text).trimmed(), Qt::CaseInsensitive) == 0) + return true; + } + return false; +} + static bool lessThan(const QPair<QString, int> &a, const QPair<QString, int> &b) { return a.second < b.second; |