Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "qxtsortfilterproxymodel.h"
00027 #include <QRegExp>
00028
00045 class QxtModelFilterPrivate
00046 {
00047 public:
00048 QxtModelFilterPrivate (const QVariant &value = QVariant(), const int role = Qt::DisplayRole, const Qt::MatchFlags flags = Qt::MatchContains);
00049 bool acceptsValue ( const QVariant & value );
00050 QVariant m_value;
00051 int m_role;
00052 Qt::MatchFlags m_flags;
00053 };
00054
00055 class QxtSortFilterProxyModelPrivate : public QxtPrivate<QxtSortFilterProxyModel>
00056 {
00057 public:
00058 QMap<int,QxtModelFilterPrivate> filters;
00059 bool m_declaringFilter;
00060 };
00061
00062 QxtModelFilterPrivate::QxtModelFilterPrivate(const QVariant &value, const int role, const Qt::MatchFlags flags)
00063 :m_value(value),m_role(role),m_flags(flags)
00064 {
00065
00066 }
00067
00068 bool QxtModelFilterPrivate::acceptsValue ( const QVariant & value )
00069 {
00070 uint matchType = m_flags & 0x0F;
00071
00072 if(!m_value.isValid() || !value.isValid())
00073 return true;
00074
00075
00076 if (matchType == Qt::MatchExactly ){
00077 if(m_value == value)
00078 return true;
00079 }
00080
00081 else {
00082 Qt::CaseSensitivity cs = m_flags & Qt::MatchCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
00083 QString filterText = m_value.toString();
00084 QString modelText = value.toString();
00085 switch (matchType){
00086 case Qt::MatchRegExp:
00087 if (QRegExp(filterText, cs).exactMatch(modelText))
00088 return true;
00089 break;
00090 case Qt::MatchWildcard:
00091 if (QRegExp(filterText, cs, QRegExp::Wildcard).exactMatch(modelText))
00092 return true;
00093 break;
00094 case Qt::MatchStartsWith:
00095 if (modelText.startsWith(filterText, cs))
00096 return true;
00097 break;
00098 case Qt::MatchEndsWith:
00099 if (modelText.endsWith(filterText, cs))
00100 return true;
00101 break;
00102 case Qt::MatchFixedString:
00103 if (modelText.compare(filterText, cs) == 0)
00104 return true;
00105 break;
00106 default:
00107 case Qt::MatchContains:
00108 if (modelText.contains(filterText, cs))
00109 return true;
00110 }
00111 }
00112 return false;
00113 }
00114
00115
00116 QxtSortFilterProxyModel::QxtSortFilterProxyModel ( QObject *parent) : QSortFilterProxyModel(parent)
00117 {
00118 QXT_INIT_PRIVATE(QxtSortFilterProxyModel);
00119 qxt_d().m_declaringFilter = false;
00120 }
00121
00128 void QxtSortFilterProxyModel::beginDeclareFilter ( )
00129 {
00130 qxt_d().m_declaringFilter = true;
00131 }
00132
00137 void QxtSortFilterProxyModel::endDeclareFilter ( )
00138 {
00139 if(qxt_d().m_declaringFilter){
00140 qxt_d().m_declaringFilter = false;
00141 invalidateFilter();
00142 }
00143 }
00144
00145 bool QxtSortFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex &source_parent ) const
00146 {
00147 QList<int> filterColumns = qxt_d().filters.keys();
00148 foreach(int currCol,filterColumns){
00149 QxtModelFilterPrivate filter = qxt_d().filters[currCol];
00150
00151
00152 if (currCol == -1) {
00153 int column_count = sourceModel()->columnCount(source_parent);
00154 for (int column = 0; column < column_count; ++column) {
00155 QModelIndex source_index = sourceModel()->index(source_row, column, source_parent);
00156 QVariant key = sourceModel()->data(source_index, filter.m_role);
00157 if (!filter.acceptsValue(key))
00158 return false;
00159 }
00160 continue;
00161 }
00162 QModelIndex source_index = sourceModel()->index(source_row, currCol , source_parent);
00163 if (!source_index.isValid())
00164 continue;
00165 QVariant key = sourceModel()->data(source_index, filter.m_role);
00166 if(!filter.acceptsValue(key))
00167 return false;
00168 }
00169 return true;
00170 }
00171
00172 void QxtSortFilterProxyModel::setFilter ( const int column, const QVariant &value, const int role, Qt::MatchFlags flags )
00173 {
00174 if(qxt_d().filters.contains(column))
00175 qxt_d().filters[column] = QxtModelFilterPrivate(value,role,flags);
00176 else
00177 qxt_d().filters.insert(column,QxtModelFilterPrivate(value,role,flags));
00178
00179 if(!qxt_d().m_declaringFilter)
00180 invalidateFilter();
00181 }
00182
00183 void QxtSortFilterProxyModel::removeFilter ( const int column )
00184 {
00185 if(qxt_d().filters.contains(column)){
00186 qxt_d().filters.remove(column);
00187
00188 if(!qxt_d().m_declaringFilter)
00189 invalidateFilter();
00190 }
00191 }
00192
00193 void QxtSortFilterProxyModel::setFilterValue ( const int column , const QVariant &value )
00194 {
00195 if(qxt_d().filters.contains(column))
00196 qxt_d().filters[column].m_value = value;
00197 else
00198 qxt_d().filters.insert(column,QxtModelFilterPrivate(value));
00199
00200 if(!qxt_d().m_declaringFilter)
00201 invalidateFilter();
00202 }
00203
00204 void QxtSortFilterProxyModel::setFilterRole ( const int column , const int role )
00205 {
00206 if(qxt_d().filters.contains(column))
00207 qxt_d().filters[column].m_role=role;
00208 else
00209 qxt_d().filters.insert(column,QxtModelFilterPrivate(QVariant(),role));
00210
00211 if(!qxt_d().m_declaringFilter)
00212 invalidateFilter();
00213 }
00214
00215 void QxtSortFilterProxyModel::setFilterFlags ( const int column , const Qt::MatchFlags flags )
00216 {
00217 if(qxt_d().filters.contains(column))
00218 qxt_d().filters[column].m_flags = flags;
00219 else
00220 qxt_d().filters.insert(column,QxtModelFilterPrivate(QVariant(),Qt::DisplayRole,flags));
00221
00222 if(!qxt_d().m_declaringFilter)
00223 invalidateFilter();
00224 }
00225
00226 QVariant QxtSortFilterProxyModel::filterValue ( const int column ) const
00227 {
00228 if(qxt_d().filters.contains(column))
00229 return qxt_d().filters[column].m_value;
00230 return QVariant();
00231 }
00232
00233 int QxtSortFilterProxyModel::filterRole ( const int column ) const
00234 {
00235 if(qxt_d().filters.contains(column))
00236 return qxt_d().filters[column].m_role;
00237 return -1;
00238 }
00239
00244 Qt::MatchFlags QxtSortFilterProxyModel::filterFlags ( const int column ) const
00245 {
00246 if(qxt_d().filters.contains(column))
00247 return qxt_d().filters[column].m_flags;
00248 return Qt::MatchContains;
00249 }
00250
00254 bool QxtSortFilterProxyModel::isFiltered ( const int column )
00255 {
00256 return qxt_d().filters.contains(column);
00257 }
00258