summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt-models/filtermodels.cpp122
-rw-r--r--qt-models/filtermodels.h27
2 files changed, 75 insertions, 74 deletions
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp
index abc8d3bac..26759571a 100644
--- a/qt-models/filtermodels.cpp
+++ b/qt-models/filtermodels.cpp
@@ -19,63 +19,10 @@ CLASS *CLASS::instance() \
return self; \
}
-#define CREATE_MODEL_SET_DATA_METHOD( CLASS ) \
-bool CLASS::setData(const QModelIndex &index, const QVariant &value, int role) \
-{ \
- if (role == Qt::CheckStateRole) { \
- checkState[index.row()] = value.toBool(); \
- anyChecked = false; \
- for (int i = 0; i < rowCount(); i++) { \
- if (checkState[i] == true) { \
- anyChecked = true; \
- break; \
- } \
- } \
- dataChanged(index, index); \
- return true; \
- } \
- return false; \
-}
-
-#define CREATE_CLEAR_FILTER_METHOD( CLASS ) \
-void CLASS::clearFilter() \
-{ \
- std::fill(checkState.begin(), checkState.end(), false); \
- anyChecked = false; \
- emit dataChanged(createIndex(0,0), createIndex(rowCount()-1, 0)); \
-}
-
-#define CREATE_FLAGS_METHOD( CLASS ) \
-Qt::ItemFlags CLASS::flags(const QModelIndex &index) const \
-{ \
- return QStringListModel::flags(index) | Qt::ItemIsUserCheckable; \
-}
-
-#define CREATE_DATA_METHOD( CLASS, COUNTER_FUNCTION ) \
-QVariant CLASS::data(const QModelIndex &index, int role) const \
-{ \
- if (role == Qt::CheckStateRole) { \
- return checkState[index.row()] ? Qt::Checked : Qt::Unchecked; \
- } else if (role == Qt::DisplayRole) { \
- QString value = stringList()[index.row()]; \
- int count = COUNTER_FUNCTION((index.row() == rowCount() - 1) ? "" : value.toUtf8().data()); \
- return value + QString(" (%1)").arg(count); \
- } \
- return QVariant(); \
-}
-
-#define CREATE_COMMON_METHODS_FOR_FILTER( CLASS, COUNTER_FUNCTION ) \
-CREATE_FLAGS_METHOD( CLASS ); \
-CREATE_CLEAR_FILTER_METHOD( CLASS ); \
-CREATE_MODEL_SET_DATA_METHOD( CLASS ); \
-CREATE_INSTANCE_METHOD( CLASS ); \
-CREATE_DATA_METHOD( CLASS, COUNTER_FUNCTION )
-
-CREATE_COMMON_METHODS_FOR_FILTER(TagFilterModel, count_dives_with_tag)
-CREATE_COMMON_METHODS_FOR_FILTER(BuddyFilterModel, count_dives_with_person)
-CREATE_COMMON_METHODS_FOR_FILTER(LocationFilterModel, count_dives_with_location)
-CREATE_COMMON_METHODS_FOR_FILTER(SuitsFilterModel, count_dives_with_suit)
-
+CREATE_INSTANCE_METHOD(TagFilterModel)
+CREATE_INSTANCE_METHOD(BuddyFilterModel)
+CREATE_INSTANCE_METHOD(LocationFilterModel)
+CREATE_INSTANCE_METHOD(SuitsFilterModel)
CREATE_INSTANCE_METHOD(MultiFilterSortModel)
FilterModelBase::FilterModelBase(QObject *parent) : QStringListModel(parent)
@@ -112,10 +59,56 @@ void FilterModelBase::updateList(const QStringList &newList)
setStringList(newList);
}
+Qt::ItemFlags FilterModelBase::flags(const QModelIndex &index) const
+{
+ return QStringListModel::flags(index) | Qt::ItemIsUserCheckable;
+}
+
+bool FilterModelBase::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (role == Qt::CheckStateRole) {
+ checkState[index.row()] = value.toBool();
+ anyChecked = false;
+ for (int i = 0; i < rowCount(); i++) {
+ if (checkState[i] == true) {
+ anyChecked = true;
+ break;
+ }
+ }
+ dataChanged(index, index);
+ return true;
+ }
+ return false;
+}
+
+QVariant FilterModelBase::data(const QModelIndex &index, int role) const
+{
+ if (role == Qt::CheckStateRole) {
+ return checkState[index.row()] ? Qt::Checked : Qt::Unchecked;
+ } else if (role == Qt::DisplayRole) {
+ QString value = stringList()[index.row()];
+ int count = countDives((index.row() == rowCount() - 1) ? "" : value.toUtf8().data());
+ return value + QString(" (%1)").arg(count);
+ }
+ return QVariant();
+}
+
+void FilterModelBase::clearFilter()
+{
+ std::fill(checkState.begin(), checkState.end(), false);
+ anyChecked = false;
+ emit dataChanged(createIndex(0,0), createIndex(rowCount()-1, 0));
+}
+
SuitsFilterModel::SuitsFilterModel(QObject *parent) : FilterModelBase(parent)
{
}
+int SuitsFilterModel::countDives(const char *s) const
+{
+ return count_dives_with_suit(s);
+}
+
bool SuitsFilterModel::doFilter(dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const
{
Q_UNUSED(index0);
@@ -165,6 +158,11 @@ TagFilterModel::TagFilterModel(QObject *parent) : FilterModelBase(parent)
{
}
+int TagFilterModel::countDives(const char *s) const
+{
+ return count_dives_with_tag(s);
+}
+
void TagFilterModel::repopulate()
{
if (g_tag_list == NULL)
@@ -219,6 +217,11 @@ BuddyFilterModel::BuddyFilterModel(QObject *parent) : FilterModelBase(parent)
{
}
+int BuddyFilterModel::countDives(const char *s) const
+{
+ return count_dives_with_person(s);
+}
+
bool BuddyFilterModel::doFilter(dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const
{
Q_UNUSED(index0);
@@ -274,6 +277,11 @@ LocationFilterModel::LocationFilterModel(QObject *parent) : FilterModelBase(pare
{
}
+int LocationFilterModel::countDives(const char *s) const
+{
+ return count_dives_with_location(s);
+}
+
bool LocationFilterModel::doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const
{
Q_UNUSED(index0);
diff --git a/qt-models/filtermodels.h b/qt-models/filtermodels.h
index b7d65aae2..d0c3a215a 100644
--- a/qt-models/filtermodels.h
+++ b/qt-models/filtermodels.h
@@ -10,57 +10,52 @@
class FilterModelBase : public QStringListModel {
public:
virtual bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const = 0;
- virtual void clearFilter() = 0;
+ void clearFilter();
std::vector<char> checkState;
bool anyChecked;
protected:
explicit FilterModelBase(QObject *parent = 0);
void updateList(const QStringList &new_list);
+ virtual int countDives(const char *) const = 0;
+private:
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
};
class TagFilterModel : public FilterModelBase {
Q_OBJECT
public:
static TagFilterModel *instance();
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
- virtual Qt::ItemFlags flags(const QModelIndex &index) const;
bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const;
- void clearFilter();
public
slots:
void repopulate();
private:
explicit TagFilterModel(QObject *parent = 0);
+ int countDives(const char *) const;
};
class BuddyFilterModel : public FilterModelBase {
Q_OBJECT
public:
static BuddyFilterModel *instance();
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
- virtual Qt::ItemFlags flags(const QModelIndex &index) const;
bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const;
- void clearFilter();
public
slots:
void repopulate();
private:
explicit BuddyFilterModel(QObject *parent = 0);
+ int countDives(const char *) const;
};
class LocationFilterModel : public FilterModelBase {
Q_OBJECT
public:
static LocationFilterModel *instance();
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
- virtual Qt::ItemFlags flags(const QModelIndex &index) const;
bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const;
- void clearFilter();
public
slots:
void repopulate();
@@ -69,23 +64,21 @@ slots:
private:
explicit LocationFilterModel(QObject *parent = 0);
+ int countDives(const char *) const;
};
class SuitsFilterModel : public FilterModelBase {
Q_OBJECT
public:
static SuitsFilterModel *instance();
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
- virtual Qt::ItemFlags flags(const QModelIndex &index) const;
bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const;
- void clearFilter();
public
slots:
void repopulate();
private:
explicit SuitsFilterModel(QObject *parent = 0);
+ int countDives(const char *) const;
};
class MultiFilterSortModel : public QSortFilterProxyModel {