/ filters / indexfilter.cpp
indexfilter.cpp
  1  #include "indexfilter.h"
  2  #include "qqmlsortfilterproxymodel.h"
  3  
  4  namespace qqsfpm {
  5  
  6  /*!
  7      \qmltype IndexFilter
  8      \inherits Filter
  9      \inqmlmodule SortFilterProxyModel
 10      \ingroup Filters
 11      \brief Filters rows based on their source index.
 12  
 13      An IndexFilter is a filter allowing contents to be filtered based on their source model index.
 14  
 15      In the following example, only the first row of the source model will be accepted:
 16      \code
 17      SortFilterProxyModel {
 18         sourceModel: contactModel
 19         filters: IndexFilter {
 20             maximumIndex: 0
 21         }
 22      }
 23      \endcode
 24  */
 25  
 26  /*!
 27      \qmlproperty int IndexFilter::minimumIndex
 28  
 29      This property holds the minimumIndex of the filter.
 30      Rows with a source index lower than \c minimumIndex will be rejected.
 31  
 32      If \c minimumIndex is negative, it is counted from the end of the source model, meaning that :
 33      \code
 34      minimumIndex: -1
 35      \endcode
 36      is equivalent to :
 37      \code
 38      minimumIndex: sourceModel.count - 1
 39      \endcode
 40      By default, no value is set.
 41  */
 42  const QVariant& IndexFilter::minimumIndex() const
 43  {
 44      return m_minimumIndex;
 45  }
 46  
 47  void IndexFilter::setMinimumIndex(const QVariant& minimumIndex)
 48  {
 49      if (m_minimumIndex == minimumIndex)
 50          return;
 51  
 52      m_minimumIndex = minimumIndex;
 53      Q_EMIT minimumIndexChanged();
 54      invalidate();
 55  }
 56  
 57  /*!
 58      \qmlproperty int IndexFilter::maximumIndex
 59  
 60      This property holds the maximumIndex of the filter.
 61      Rows with a source index higher than \c maximumIndex will be rejected.
 62  
 63      If \c maximumIndex is negative, it is counted from the end of the source model, meaning that:
 64      \code
 65      maximumIndex: -1
 66      \endcode
 67      is equivalent to :
 68      \code
 69      maximumIndex: sourceModel.count - 1
 70      \endcode
 71      By default, no value is set.
 72  */
 73  const QVariant& IndexFilter::maximumIndex() const
 74  {
 75      return m_maximumIndex;
 76  }
 77  
 78  void IndexFilter::setMaximumIndex(const QVariant& maximumIndex)
 79  {
 80      if (m_maximumIndex == maximumIndex)
 81          return;
 82  
 83      m_maximumIndex = maximumIndex;
 84      Q_EMIT maximumIndexChanged();
 85      invalidate();
 86  }
 87  
 88  bool IndexFilter::filterRow(const QModelIndex& sourceIndex, const QQmlSortFilterProxyModel& proxyModel) const
 89  {
 90      int sourceRowCount = proxyModel.sourceModel()->rowCount();
 91      int sourceRow = sourceIndex.row();
 92  
 93      bool minimumIsValid;
 94      int minimum = m_minimumIndex.toInt(&minimumIsValid);
 95      if (minimumIsValid) {
 96          int actualMinimum = minimum < 0 ? sourceRowCount + minimum : minimum;
 97          if (sourceRow < actualMinimum)
 98              return false;
 99      }
100  
101      bool maximumIsValid;
102      int maximum = m_maximumIndex.toInt(&maximumIsValid);
103      if (maximumIsValid) {
104          int actualMaximum = maximum < 0 ? sourceRowCount + maximum : maximum;
105          if (sourceRow > actualMaximum)
106              return false;
107      }
108  
109      return true;
110  }
111  
112  }