22 #include "entitymimetypefiltermodel.h"
24 #include "entitytreemodel.h"
25 #include "mimetypechecker.h"
28 #include <kmimetype.h>
30 #include <QtCore/QString>
31 #include <QtCore/QStringList>
33 using namespace Akonadi;
39 class EntityMimeTypeFilterModelPrivate
42 EntityMimeTypeFilterModelPrivate( EntityMimeTypeFilterModel *parent )
44 m_headerGroup( EntityTreeModel::EntityTreeHeaders )
48 Q_DECLARE_PUBLIC(EntityMimeTypeFilterModel)
49 EntityMimeTypeFilterModel *q_ptr;
51 QStringList includedMimeTypes;
52 QStringList excludedMimeTypes;
54 QPersistentModelIndex m_rootIndex;
56 EntityTreeModel::HeaderGroup m_headerGroup;
62 : QSortFilterProxyModel( parent ),
63 d_ptr( new EntityMimeTypeFilterModelPrivate( this ) )
67 EntityMimeTypeFilterModel::~EntityMimeTypeFilterModel()
72 void EntityMimeTypeFilterModel::addMimeTypeInclusionFilters(
const QStringList &typeList)
75 d->includedMimeTypes << typeList;
79 void EntityMimeTypeFilterModel::addMimeTypeExclusionFilters(
const QStringList &typeList)
82 d->excludedMimeTypes << typeList;
86 void EntityMimeTypeFilterModel::addMimeTypeInclusionFilter(
const QString &type)
89 d->includedMimeTypes << type;
93 void EntityMimeTypeFilterModel::addMimeTypeExclusionFilter(
const QString &type)
96 d->excludedMimeTypes << type;
100 bool EntityMimeTypeFilterModel::filterAcceptsColumn(
int sourceColumn,
const QModelIndex &sourceParent )
const
102 if (sourceColumn >= columnCount(mapFromSource(sourceParent)))
104 return QSortFilterProxyModel::filterAcceptsColumn( sourceColumn, sourceParent );
107 bool EntityMimeTypeFilterModel::filterAcceptsRow(
int sourceRow,
const QModelIndex &sourceParent)
const
109 Q_D(
const EntityMimeTypeFilterModel);
110 const QModelIndex idx = sourceModel()->index(sourceRow, 0, sourceParent);
112 const Akonadi::Item item = idx.data( EntityTreeModel::ItemRole ).value<Akonadi::Item>();
114 if ( item.isValid() && !item.hasPayload() ) {
115 kDebug() <<
"Item " << item.id() <<
" doesn't have payload";
119 const QString rowMimetype = idx.data( EntityTreeModel::MimeTypeRole ).toString();
121 if ( d->excludedMimeTypes.contains( rowMimetype ) )
123 if ( d->includedMimeTypes.isEmpty() || d->includedMimeTypes.contains( rowMimetype ) )
129 QStringList EntityMimeTypeFilterModel::mimeTypeInclusionFilters()
const
132 return d->includedMimeTypes;
135 QStringList EntityMimeTypeFilterModel::mimeTypeExclusionFilters()
const
138 return d->excludedMimeTypes;
141 void EntityMimeTypeFilterModel::clearFilters()
144 d->includedMimeTypes.clear();
145 d->excludedMimeTypes.clear();
152 d->m_headerGroup = headerGroup;
155 QVariant EntityMimeTypeFilterModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
161 role += (EntityTreeModel::TerminalUserRole * d->m_headerGroup);
162 return sourceModel()->headerData(section, orientation, role);
165 QModelIndexList EntityMimeTypeFilterModel::match(
const QModelIndex& start,
int role,
const QVariant& value,
int hits, Qt::MatchFlags flags )
const
167 if ( !sourceModel() )
168 return QModelIndexList();
170 if ( EntityTreeModel::AmazingCompletionRole != role ) {
171 if ( role < Qt::UserRole )
172 return QSortFilterProxyModel::match( start, role, value, hits, flags );
174 QModelIndexList list;
175 QModelIndex proxyIndex;
176 foreach (
const QModelIndex &idx, sourceModel()->match( mapToSource( start ), role, value, hits, flags ) ) {
177 proxyIndex = mapFromSource(idx);
178 if (proxyIndex.isValid())
185 const int allHits = -1;
187 QModelIndexList proxyList;
188 QMap<int, QModelIndex> proxyMap;
189 const QModelIndexList sourceList = sourceModel()->match( mapToSource( start ), role, value, allHits, flags );
190 QModelIndexList::const_iterator it;
191 const QModelIndexList::const_iterator begin = sourceList.constBegin();
192 const QModelIndexList::const_iterator end = sourceList.constEnd();
193 QModelIndex proxyIndex;
194 for ( it = begin; it != end; ++it ) {
195 proxyIndex = mapFromSource( *it );
198 if ( !proxyIndex.isValid() )
202 proxyMap.insert( proxyIndex.row(), proxyIndex );
206 return proxyMap.values();
208 return proxyMap.values().mid( 0, hits );
211 int EntityMimeTypeFilterModel::columnCount(
const QModelIndex &parent)
const
213 Q_D(
const EntityMimeTypeFilterModel);
218 const QVariant value = sourceModel()->data(mapToSource(parent), EntityTreeModel::ColumnCountRole + (EntityTreeModel::TerminalUserRole * d->m_headerGroup));
219 if ( !value.isValid() )
222 return value.toInt();
225 bool EntityMimeTypeFilterModel::hasChildren(
const QModelIndex &parent)
const
234 return rowCount(parent) > 0;
237 if ( !parent.isValid() )
238 return sourceModel()->hasChildren(parent);
240 Q_D(
const EntityMimeTypeFilterModel);
241 if ( EntityTreeModel::ItemListHeaders == d->m_headerGroup)
244 if ( EntityTreeModel::CollectionTreeHeaders == d->m_headerGroup )
246 QModelIndex childIndex = parent.child( 0, 0 );
247 while ( childIndex.isValid() )
249 Collection col = childIndex.data( EntityTreeModel::CollectionRole ).value<Collection>();
252 childIndex = childIndex.sibling( childIndex.row() + 1, childIndex.column() );
259 bool EntityMimeTypeFilterModel::canFetchMore(
const QModelIndex &parent )
const
261 Q_D(
const EntityMimeTypeFilterModel);
262 if ( EntityTreeModel::CollectionTreeHeaders == d->m_headerGroup )
264 return QSortFilterProxyModel::canFetchMore(parent);
267 #include "entitymimetypefiltermodel.moc"