From ab32295f8906ae5b6334f7abc8d05032b68ae577 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Mon, 31 Aug 2015 20:19:06 -0300 Subject: 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 Signed-off-by: Dirk Hohndel --- qt-models/ssrfsortfilterproxymodel.cpp | 42 ++++++++++++++++++++++++++++++++++ qt-models/ssrfsortfilterproxymodel.h | 33 ++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 qt-models/ssrfsortfilterproxymodel.cpp create mode 100644 qt-models/ssrfsortfilterproxymodel.h (limited to 'qt-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(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(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(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 + +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 -- cgit v1.2.3-70-g09d2