22 #include "collectioncombobox.h"
23 #include "collectioncombobox_p.h"
25 #include "asyncselectionhandler_p.h"
26 #include "collectiondialog.h"
28 #include <akonadi/changerecorder.h>
29 #include <akonadi/collectionfetchscope.h>
30 #include <akonadi/collectionfilterproxymodel.h>
31 #include <akonadi/entityrightsfiltermodel.h>
32 #include <akonadi/entitytreemodel.h>
33 #include <akonadi/session.h>
35 #include <kdescendantsproxymodel.h>
36 #include "collectionutils_p.h"
38 #include <QtCore/QAbstractItemModel>
39 #include <QtCore/QEvent>
40 #include <QtGui/QMouseEvent>
42 using namespace Akonadi;
44 class CollectionComboBox::Private
47 Private( QAbstractItemModel *customModel, CollectionComboBox *parent )
48 : mParent( parent ), mMonitor( 0 ), mModel( 0 )
51 mBaseModel = customModel;
54 mMonitor->fetchCollection(
true );
55 mMonitor->setCollectionMonitored( Akonadi::Collection::root() );
57 mModel =
new EntityTreeModel( mMonitor, mParent );
58 mModel->setItemPopulationStrategy( EntityTreeModel::NoItemPopulation );
63 KDescendantsProxyModel *proxyModel =
new KDescendantsProxyModel( parent );
64 proxyModel->setDisplayAncestorData(
true );
65 proxyModel->setSourceModel( mBaseModel );
67 mMimeTypeFilterModel =
new CollectionFilterProxyModel( parent );
68 mMimeTypeFilterModel->setSourceModel( proxyModel );
70 mRightsFilterModel =
new EntityRightsFilterModel( parent );
71 mRightsFilterModel->setSourceModel( mMimeTypeFilterModel );
73 mParent->setModel( mRightsFilterModel );
74 mParent->model()->sort( mParent->modelColumn() );
77 mParent->connect( mSelectionHandler, SIGNAL(collectionAvailable(QModelIndex)),
78 mParent, SLOT(activated(QModelIndex)) );
80 mParent->connect( mParent, SIGNAL(activated(
int)),
81 mParent, SLOT(activated(
int)) );
88 void activated(
int index );
89 void activated(
const QModelIndex& index );
91 CollectionComboBox *mParent;
94 EntityTreeModel *mModel;
95 QAbstractItemModel *mBaseModel;
96 CollectionFilterProxyModel *mMimeTypeFilterModel;
97 EntityRightsFilterModel *mRightsFilterModel;
101 void CollectionComboBox::Private::activated(
int index )
103 const QModelIndex modelIndex = mParent->model()->index( index, 0 );
104 if ( modelIndex.isValid() )
105 emit mParent->currentChanged( modelIndex.data( EntityTreeModel::CollectionRole).value<Collection>() );
108 void CollectionComboBox::Private::activated(
const QModelIndex &index )
110 mParent->setCurrentIndex( index.row() );
113 MobileEventHandler::MobileEventHandler( CollectionComboBox *comboBox, CollectionFilterProxyModel *mimeTypeFilter,
114 EntityRightsFilterModel *accessRightsFilter, QAbstractItemModel *customModel )
115 : QObject( comboBox ),
116 mComboBox( comboBox ),
117 mMimeTypeFilter( mimeTypeFilter ),
118 mAccessRightsFilter( accessRightsFilter ),
119 mCustomModel( customModel )
123 bool MobileEventHandler::eventFilter( QObject *
object, QEvent *event )
125 if (
object == mComboBox && mComboBox->isEnabled() &&
event->type() == QEvent::MouseButtonPress ) {
127 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent*
>( event );
130 if ( mComboBox->rect().contains( mouseEvent->pos() ) ) {
131 QMetaObject::invokeMethod(
this,
"openDialog", Qt::QueuedConnection );
137 return QObject::eventFilter(
object, event );
140 void MobileEventHandler::openDialog()
142 Akonadi::CollectionDialog dialog( mCustomModel );
143 dialog.setMimeTypeFilter( mMimeTypeFilter->mimeTypeFilters() );
144 dialog.setAccessRightsFilter( mAccessRightsFilter->accessRights() );
146 if ( dialog.exec() ) {
147 const Akonadi::Collection collection = dialog.selectedCollection();
149 mComboBox->setCurrentIndex( index.row() );
154 CollectionComboBox::CollectionComboBox( QWidget *parent )
155 : KComboBox( parent ), d( new Private( 0, this ) )
157 #ifdef KDEPIM_MOBILE_UI
158 MobileEventHandler *handler =
new MobileEventHandler(
this, d->mMimeTypeFilterModel, d->mRightsFilterModel, d->mBaseModel );
159 installEventFilter( handler );
163 CollectionComboBox::CollectionComboBox( QAbstractItemModel *model, QWidget *parent )
164 : KComboBox( parent ), d( new Private( model, this ) )
166 #ifdef KDEPIM_MOBILE_UI
167 MobileEventHandler *handler =
new MobileEventHandler(
this, d->mMimeTypeFilterModel, d->mRightsFilterModel, d->mBaseModel );
168 installEventFilter( handler );
172 CollectionComboBox::~CollectionComboBox()
177 void CollectionComboBox::setMimeTypeFilter(
const QStringList &contentMimeTypes )
179 d->mMimeTypeFilterModel->clearFilters();
180 d->mMimeTypeFilterModel->addMimeTypeFilters( contentMimeTypes );
183 foreach (
const QString &mimeType, contentMimeTypes )
184 d->mMonitor->setMimeTypeMonitored( mimeType,
true );
187 QStringList CollectionComboBox::mimeTypeFilter()
const
189 return d->mMimeTypeFilterModel->mimeTypeFilters();
192 void CollectionComboBox::setAccessRightsFilter( Collection::Rights rights )
194 d->mRightsFilterModel->setAccessRights( rights );
197 Akonadi::Collection::Rights CollectionComboBox::accessRightsFilter()
const
199 return d->mRightsFilterModel->accessRights();
202 void CollectionComboBox::setDefaultCollection(
const Collection &collection )
204 d->mSelectionHandler->waitForCollection( collection );
207 Akonadi::Collection CollectionComboBox::currentCollection()
const
209 const QModelIndex modelIndex = model()->index( currentIndex(), 0 );
210 if ( modelIndex.isValid() )
211 return modelIndex.data( Akonadi::EntityTreeModel::CollectionRole ).value<Collection>();
213 return Akonadi::Collection();
216 #include "collectioncombobox.moc"
217 #include "collectioncombobox_p.moc"