diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | qt-models/ssrfsortfilterproxymodel.cpp | 42 | ||||
-rw-r--r-- | qt-models/ssrfsortfilterproxymodel.h | 33 |
3 files changed, 76 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index c0374f1e0..1426040ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -390,6 +390,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS qt-models/diveplotdatamodel.cpp qt-models/divelocationmodel.cpp qt-models/divesitepicturesmodel.cpp + qt-models/ssrfsortfilterproxymodel.cpp ) source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) 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 |