akonadi
collectionfilterproxymodel.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "collectionfilterproxymodel.h"
00021
00022 #include "collectionmodel.h"
00023 #include "mimetypechecker.h"
00024
00025 #include <kdebug.h>
00026
00027 #include <QtCore/QString>
00028 #include <QtCore/QStringList>
00029 #include <QTimer>
00030
00031 using namespace Akonadi;
00032
00036 class CollectionFilterProxyModel::Private
00037 {
00038 public:
00039 Private( CollectionFilterProxyModel *parent )
00040 : mParent( parent )
00041 {
00042 mimeChecker.addWantedMimeType( QLatin1String( "text/uri-list" ) );
00043 }
00044
00045 bool collectionAccepted( const QModelIndex &index, bool checkResourceVisibility = true );
00046
00047 QList< QModelIndex > acceptedResources;
00048 CollectionFilterProxyModel *mParent;
00049 MimeTypeChecker mimeChecker;
00050 };
00051
00052 bool CollectionFilterProxyModel::Private::collectionAccepted( const QModelIndex &index, bool checkResourceVisibility )
00053 {
00054
00055 const Collection collection = mParent->sourceModel()->data( index, CollectionModel::CollectionRole ).value<Collection>();
00056
00057
00058 if ( mimeChecker.isWantedCollection( collection ) ) {
00059
00060 if ( checkResourceVisibility ) {
00061
00062
00063 QModelIndex resource = index;
00064 while ( resource.parent().isValid() )
00065 resource = resource.parent();
00066
00067
00068 if ( resource != index && !acceptedResources.contains( resource ) ) {
00069 kDebug() << "We got a new collection:" << mParent->sourceModel()->data( index ).toString()
00070 << "but the resource is not visible:" << mParent->sourceModel()->data( resource ).toString();
00071 acceptedResources.clear();
00072
00073 mParent->invalidateFilter();
00074 return true;
00075 }
00076 }
00077
00078
00079 if ( !index.parent().isValid() )
00080 acceptedResources.append( index );
00081
00082 return true;
00083 }
00084
00085
00086 QModelIndex childIndex = index.child( 0, 0 );
00087 while ( childIndex.isValid() ) {
00088 if ( collectionAccepted( childIndex, false ) ) {
00089
00090
00091 if ( !index.parent().isValid())
00092 acceptedResources.append( index );
00093
00094 return true;
00095 }
00096 childIndex = childIndex.sibling( childIndex.row() + 1, 0 );
00097 }
00098
00099
00100 return false;
00101 }
00102
00103
00104 CollectionFilterProxyModel::CollectionFilterProxyModel( QObject *parent )
00105 : QSortFilterProxyModel( parent ),
00106 d( new Private( this ) )
00107 {
00108 }
00109
00110 CollectionFilterProxyModel::~CollectionFilterProxyModel()
00111 {
00112 delete d;
00113 }
00114
00115 void CollectionFilterProxyModel::addMimeTypeFilters(const QStringList &typeList)
00116 {
00117 QStringList mimeTypes = d->mimeChecker.wantedMimeTypes() + typeList;
00118 d->mimeChecker.setWantedMimeTypes( mimeTypes );
00119 invalidateFilter();
00120 }
00121
00122 void CollectionFilterProxyModel::addMimeTypeFilter(const QString &type)
00123 {
00124 d->mimeChecker.addWantedMimeType( type );
00125 invalidateFilter();
00126 }
00127
00128 bool CollectionFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent) const
00129 {
00130 return d->collectionAccepted( sourceModel()->index( sourceRow, 0, sourceParent ) );
00131 }
00132
00133 QStringList CollectionFilterProxyModel::mimeTypeFilters() const
00134 {
00135 return d->mimeChecker.wantedMimeTypes();
00136 }
00137
00138 void CollectionFilterProxyModel::clearFilters()
00139 {
00140 d->mimeChecker = MimeTypeChecker();
00141 invalidateFilter();
00142 }
00143
00144 Qt::ItemFlags CollectionFilterProxyModel::flags( const QModelIndex& index ) const
00145 {
00146 const Collection collection = sourceModel()->data( mapToSource( index ), CollectionModel::CollectionRole ).value<Collection>();
00147
00148
00149 if ( d->mimeChecker.isWantedCollection( collection ) )
00150 return QSortFilterProxyModel::flags( index );
00151 else
00152 return QSortFilterProxyModel::flags( index ) & ~( Qt::ItemIsSelectable );
00153 }
00154
00155 #include "collectionfilterproxymodel.moc"