diff options
author | Tomaz Canabrava <tomaz.canabrava@intel.com> | 2015-08-31 20:19:06 -0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-08-31 18:41:14 -0700 |
commit | ab32295f8906ae5b6334f7abc8d05032b68ae577 (patch) | |
tree | 7905a5fbcefc438d12253f0ff65312b785008dff /qt-models | |
parent | 5db6d415986ffacf199f75e10d277934d3ff5a7b (diff) | |
download | subsurface-ab32295f8906ae5b6334f7abc8d05032b68ae577.tar.gz |
Add a new model: SsrfFilterProxyModel
Add a new Model, it's the QSortFilterProxyModel that accepts
functions to filter / sort. so instead of creating a new class
for each different sorting (overkill), now we can just create
a function and pass to this class. I'll rework the filtering
system of subsurface to use this - in the meantime I've created
this to ease the creation of another filter: the dive sites
by gps coordinates.
Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/ssrfsortfilterproxymodel.cpp | 42 | ||||
-rw-r--r-- | qt-models/ssrfsortfilterproxymodel.h | 33 |
2 files changed, 75 insertions, 0 deletions
diff --git a/qt-models/ssrfsortfilterproxymodel.cpp b/qt-models/ssrfsortfilterproxymodel.cpp new file mode 100644 index 000000000..1a8c835dc --- /dev/null +++ b/qt-models/ssrfsortfilterproxymodel.cpp @@ -0,0 +1,42 @@ +#include "ssrfsortfilterproxymodel.h" + +SsrfSortFilterProxyModel::SsrfSortFilterProxyModel(QObject *parent) +: QSortFilterProxyModel(parent), less_than(0), accepts_col(0), accepts_row(0) +{ +} + +bool SsrfSortFilterProxyModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const +{ + Q_ASSERT(less_than); + const QAbstractItemModel *self = this; + return less_than(const_cast<QAbstractItemModel*>(self), source_left, source_right); +} + +bool SsrfSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const +{ + Q_ASSERT(accepts_row); + const QAbstractItemModel *self = this; + return accepts_row(const_cast<QAbstractItemModel*>(self), source_row, source_parent); +} + +bool SsrfSortFilterProxyModel::filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const +{ + Q_ASSERT(accepts_col); + const QAbstractItemModel *self = this; + return accepts_col(const_cast<QAbstractItemModel*>(self), source_column, source_parent); +} + +void SsrfSortFilterProxyModel::setLessThan(less_than_cb func) +{ + less_than = func; +} + +void SsrfSortFilterProxyModel::setFilterRow(filter_accepts_row_cb func) +{ + accepts_row = func; +} + +void SsrfSortFilterProxyModel::setFilterCol(filter_accepts_col_cb func) +{ + accepts_col = func; +} diff --git a/qt-models/ssrfsortfilterproxymodel.h b/qt-models/ssrfsortfilterproxymodel.h new file mode 100644 index 000000000..6427a35dc --- /dev/null +++ b/qt-models/ssrfsortfilterproxymodel.h @@ -0,0 +1,33 @@ +#ifndef SSRFSORTFILTERPROXYMODEL_H +#define SSRFSORTFILTERPROXYMODEL_H + +#include <QSortFilterProxyModel> + +typedef bool (*filter_accepts_col_cb) (QAbstractItemModel *model,int sourceRow, const QModelIndex& parent); +typedef bool (*filter_accepts_row_cb) (QAbstractItemModel *model,int sourceRow, const QModelIndex& parent); +typedef bool (*less_than_cb) (QAbstractItemModel *model, const QModelIndex& left, const QModelIndex& right); + +/* Use this class when you wanna a quick filter. + * instead of creating a new class, just create a new instance of this class + * and plug your callback. + */ +class SsrfSortFilterProxyModel : public QSortFilterProxyModel { + Q_OBJECT + +public: + SsrfSortFilterProxyModel(QObject *parent = 0); + virtual bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const; + virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; + virtual bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const; + + void setLessThan(less_than_cb func); + void setFilterRow(filter_accepts_row_cb func); + void setFilterCol(filter_accepts_col_cb func); + +private: + less_than_cb less_than; + filter_accepts_col_cb accepts_col; + filter_accepts_row_cb accepts_row; +}; + +#endif |