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
00024 #include <kdebug.h>
00025 #include <kmimetype.h>
00026
00027 #include <QtCore/QString>
00028 #include <QtCore/QStringList>
00029
00030 using namespace Akonadi;
00031
00035 class CollectionFilterProxyModel::Private
00036 {
00037 public:
00038 Private( CollectionFilterProxyModel *parent )
00039 : mParent( parent )
00040 {
00041 mimeTypes << QLatin1String( "text/uri-list" );
00042 }
00043
00044 bool collectionAccepted( const QModelIndex &index, bool checkResourceVisibility = true );
00045
00046 QList< QModelIndex > acceptedResources;
00047 CollectionFilterProxyModel *mParent;
00048 QStringList mimeTypes;
00049 };
00050
00051 bool CollectionFilterProxyModel::Private::collectionAccepted( const QModelIndex &index, bool checkResourceVisibility )
00052 {
00053
00054 QStringList collectionMimeTypes = mParent->sourceModel()->data( index, CollectionModel::CollectionRole ).value<Collection>().contentMimeTypes();
00055
00056
00057 foreach ( const QString &type, collectionMimeTypes ) {
00058 if ( mimeTypes.contains( type ) ) {
00059
00060
00061 if ( checkResourceVisibility ) {
00062
00063
00064 QModelIndex resource = index;
00065 while ( resource.parent().isValid() )
00066 resource = resource.parent();
00067
00068
00069 if ( resource != index && !acceptedResources.contains( resource ) ) {
00070 kDebug() << "We got a new collection:" << mParent->sourceModel()->data( index ).toString()
00071 << "but the resource is not visible:" << mParent->sourceModel()->data( resource ).toString();
00072 acceptedResources.clear();
00073 mParent->reset();
00074 return true;
00075 }
00076 }
00077
00078
00079 if ( !index.parent().isValid() )
00080 acceptedResources.append( index );
00081
00082 return true;
00083 }
00084
00085 KMimeType::Ptr mimeType = KMimeType::mimeType( type, KMimeType::ResolveAliases );
00086 if ( !mimeType.isNull() ) {
00087 foreach ( const QString &mt, mimeTypes ) {
00088 if ( mimeType->is( mt ) ) {
00089
00090
00091 if ( !index.parent().isValid() )
00092 acceptedResources.append( index );
00093
00094 return true;
00095 }
00096 }
00097 }
00098 }
00099
00100
00101 QModelIndex childIndex = index.child( 0, 0 );
00102 while ( childIndex.isValid() ) {
00103 if ( collectionAccepted( childIndex, false ) ) {
00104
00105
00106 if ( !index.parent().isValid())
00107 acceptedResources.append( index );
00108
00109 return true;
00110 }
00111 childIndex = childIndex.sibling( childIndex.row() + 1, 0 );
00112 }
00113
00114
00115 return false;
00116 }
00117
00118
00119 CollectionFilterProxyModel::CollectionFilterProxyModel( QObject *parent )
00120 : QSortFilterProxyModel( parent ),
00121 d( new Private( this ) )
00122 {
00123 setSupportedDragActions( Qt::CopyAction | Qt::MoveAction );
00124 }
00125
00126 CollectionFilterProxyModel::~CollectionFilterProxyModel()
00127 {
00128 delete d;
00129 }
00130
00131 void CollectionFilterProxyModel::addMimeTypeFilters(const QStringList &typeList)
00132 {
00133 d->mimeTypes << typeList;
00134 invalidateFilter();
00135 }
00136
00137 void CollectionFilterProxyModel::addMimeTypeFilter(const QString &type)
00138 {
00139 d->mimeTypes << type;
00140 invalidateFilter();
00141 }
00142
00143 bool CollectionFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent) const
00144 {
00145 return d->collectionAccepted( sourceModel()->index( sourceRow, 0, sourceParent ) );
00146 }
00147
00148 QStringList CollectionFilterProxyModel::mimeTypeFilters() const
00149 {
00150 return d->mimeTypes;
00151 }
00152
00153 void CollectionFilterProxyModel::clearFilters()
00154 {
00155 d->mimeTypes.clear();
00156 invalidateFilter();
00157 }
00158
00159 #include "collectionfilterproxymodel.moc"