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 void slotReset()
00048 {
00049 mParent->reset();
00050 }
00051
00052 QList< QModelIndex > acceptedResources;
00053 CollectionFilterProxyModel *mParent;
00054 MimeTypeChecker mimeChecker;
00055 };
00056
00057 bool CollectionFilterProxyModel::Private::collectionAccepted( const QModelIndex &index, bool checkResourceVisibility )
00058 {
00059
00060 const Collection collection = mParent->sourceModel()->data( index, CollectionModel::CollectionRole ).value<Collection>();
00061
00062
00063 if ( mimeChecker.isWantedCollection( collection ) ) {
00064
00065 if ( checkResourceVisibility ) {
00066
00067
00068 QModelIndex resource = index;
00069 while ( resource.parent().isValid() )
00070 resource = resource.parent();
00071
00072
00073 if ( resource != index && !acceptedResources.contains( resource ) ) {
00074 kDebug() << "We got a new collection:" << mParent->sourceModel()->data( index ).toString()
00075 << "but the resource is not visible:" << mParent->sourceModel()->data( resource ).toString();
00076 acceptedResources.clear();
00077
00078 QTimer::singleShot( 0, mParent, SLOT(slotReset()) );
00079 return true;
00080 }
00081 }
00082
00083
00084 if ( !index.parent().isValid() )
00085 acceptedResources.append( index );
00086
00087 return true;
00088 }
00089
00090
00091 QModelIndex childIndex = index.child( 0, 0 );
00092 while ( childIndex.isValid() ) {
00093 if ( collectionAccepted( childIndex, false ) ) {
00094
00095
00096 if ( !index.parent().isValid())
00097 acceptedResources.append( index );
00098
00099 return true;
00100 }
00101 childIndex = childIndex.sibling( childIndex.row() + 1, 0 );
00102 }
00103
00104
00105 return false;
00106 }
00107
00108
00109 CollectionFilterProxyModel::CollectionFilterProxyModel( QObject *parent )
00110 : QSortFilterProxyModel( parent ),
00111 d( new Private( this ) )
00112 {
00113 setSupportedDragActions( Qt::CopyAction | Qt::MoveAction );
00114 }
00115
00116 CollectionFilterProxyModel::~CollectionFilterProxyModel()
00117 {
00118 delete d;
00119 }
00120
00121 void CollectionFilterProxyModel::addMimeTypeFilters(const QStringList &typeList)
00122 {
00123 QStringList mimeTypes = d->mimeChecker.wantedMimeTypes() + typeList;
00124 d->mimeChecker.setWantedMimeTypes( mimeTypes );
00125 invalidateFilter();
00126 }
00127
00128 void CollectionFilterProxyModel::addMimeTypeFilter(const QString &type)
00129 {
00130 d->mimeChecker.addWantedMimeType( type );
00131 invalidateFilter();
00132 }
00133
00134 bool CollectionFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent) const
00135 {
00136 return d->collectionAccepted( sourceModel()->index( sourceRow, 0, sourceParent ) );
00137 }
00138
00139 QStringList CollectionFilterProxyModel::mimeTypeFilters() const
00140 {
00141 return d->mimeChecker.wantedMimeTypes();
00142 }
00143
00144 void CollectionFilterProxyModel::clearFilters()
00145 {
00146 d->mimeChecker = MimeTypeChecker();
00147 invalidateFilter();
00148 }
00149
00150 #include "collectionfilterproxymodel.moc"