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 }