20 #include "collectionfilterproxymodel.h"
22 #include "collectionmodel.h"
23 #include "mimetypechecker.h"
27 #include <QtCore/QString>
28 #include <QtCore/QStringList>
31 using namespace Akonadi;
36 class CollectionFilterProxyModel::Private
39 Private( CollectionFilterProxyModel *parent )
40 : mParent( parent ), mExcludeVirtualCollections( false )
42 mimeChecker.addWantedMimeType( QLatin1String(
"text/uri-list" ) );
45 bool collectionAccepted(
const QModelIndex &index,
bool checkResourceVisibility =
true );
47 QVector< QModelIndex > acceptedResources;
48 CollectionFilterProxyModel *mParent;
49 MimeTypeChecker mimeChecker;
50 bool mExcludeVirtualCollections;
53 bool CollectionFilterProxyModel::Private::collectionAccepted(
const QModelIndex &index,
bool checkResourceVisibility )
56 const Collection collection = mParent->sourceModel()->data( index, CollectionModel::CollectionRole ).value<Collection>();
58 if ( !collection.isValid() )
61 if ( collection.isVirtual() && mExcludeVirtualCollections )
65 if ( mimeChecker.isWantedCollection( collection ) ) {
67 if ( checkResourceVisibility ) {
70 QModelIndex resource = index;
71 while ( resource.parent().isValid() )
72 resource = resource.parent();
75 if ( resource != index && !acceptedResources.contains( resource ) ) {
76 kDebug() <<
"We got a new collection:" << mParent->sourceModel()->data( index ).toString()
77 <<
"but the resource is not visible:" << mParent->sourceModel()->data( resource ).toString();
78 acceptedResources.clear();
80 mParent->invalidateFilter();
86 if ( !index.parent().isValid() )
87 acceptedResources.append( index );
93 QModelIndex childIndex = index.child( 0, 0 );
94 while ( childIndex.isValid() ) {
95 if ( collectionAccepted( childIndex,
false ) ) {
98 if ( !index.parent().isValid())
99 acceptedResources.append( index );
103 childIndex = childIndex.sibling( childIndex.row() + 1, 0 );
111 CollectionFilterProxyModel::CollectionFilterProxyModel( QObject *parent )
112 : QSortFilterProxyModel( parent ),
113 d( new Private( this ) )
117 CollectionFilterProxyModel::~CollectionFilterProxyModel()
122 void CollectionFilterProxyModel::addMimeTypeFilters(
const QStringList &typeList)
124 QStringList mimeTypes = d->mimeChecker.wantedMimeTypes() + typeList;
125 d->mimeChecker.setWantedMimeTypes( mimeTypes );
129 void CollectionFilterProxyModel::addMimeTypeFilter(
const QString &type)
131 d->mimeChecker.addWantedMimeType( type );
135 bool CollectionFilterProxyModel::filterAcceptsRow(
int sourceRow,
const QModelIndex &sourceParent)
const
137 return d->collectionAccepted( sourceModel()->index( sourceRow, 0, sourceParent ) );
140 QStringList CollectionFilterProxyModel::mimeTypeFilters()
const
142 return d->mimeChecker.wantedMimeTypes();
145 void CollectionFilterProxyModel::clearFilters()
147 d->mimeChecker = MimeTypeChecker();
151 void CollectionFilterProxyModel::setExcludeVirtualCollections(
bool exclude )
153 if ( exclude != d->mExcludeVirtualCollections ) {
154 d->mExcludeVirtualCollections = exclude;
159 Qt::ItemFlags CollectionFilterProxyModel::flags(
const QModelIndex& index )
const
161 if ( !index.isValid() ) {
166 const Collection collection = sourceModel()->data( mapToSource( index ), CollectionModel::CollectionRole ).value<Collection>();
169 if ( d->mimeChecker.isWantedCollection( collection ) )
170 return QSortFilterProxyModel::flags( index );
172 return QSortFilterProxyModel::flags( index ) & ~( Qt::ItemIsSelectable );
175 #include "collectionfilterproxymodel.moc"