20 #include "entitytreemodel.h"
21 #include "entitytreemodel_p.h"
23 #include "monitor_p.h"
25 #include <QtCore/QHash>
26 #include <QtCore/QMimeData>
27 #include <QtCore/QTimer>
28 #include <QtGui/QAbstractProxyModel>
29 #include <QtGui/QApplication>
30 #include <QtGui/QPalette>
33 #include <KDE/KLocale>
34 #include <KDE/KMessageBox>
37 #include <akonadi/attributefactory.h>
38 #include <akonadi/changerecorder.h>
39 #include <akonadi/collectionmodifyjob.h>
40 #include <akonadi/entitydisplayattribute.h>
41 #include <akonadi/transactionsequence.h>
42 #include <akonadi/itemmodifyjob.h>
43 #include <akonadi/session.h>
44 #include "collectionfetchscope.h"
46 #include "collectionutils_p.h"
49 #include "pastehelper_p.h"
51 Q_DECLARE_METATYPE( QSet<QByteArray> )
53 using namespace Akonadi;
58 : QAbstractItemModel( parent ),
68 : QAbstractItemModel( parent ),
74 EntityTreeModel::~EntityTreeModel()
78 foreach (
const QList<Node*> &list, d->m_childEntities ) {
79 QList<Node*>::const_iterator it = list.constBegin();
80 const QList<Node*>::const_iterator end = list.constEnd();
81 for ( ; it != end; ++it ) {
91 bool EntityTreeModel::includeUnsubscribed()
const
94 return d->m_includeUnsubscribed;
97 void EntityTreeModel::setIncludeUnsubscribed(
bool show )
100 d->beginResetModel();
101 d->m_includeUnsubscribed = show;
107 bool EntityTreeModel::systemEntitiesShown()
const
110 return d->m_showSystemEntities;
113 void EntityTreeModel::setShowSystemEntities(
bool show )
116 d->m_showSystemEntities = show;
119 void EntityTreeModel::clearAndReset()
122 d->beginResetModel();
126 int EntityTreeModel::columnCount(
const QModelIndex & parent )
const
129 if ( parent.isValid() && parent.column() != 0 )
132 return qMax( entityColumnCount( CollectionTreeHeaders ), entityColumnCount( ItemListHeaders ) );
136 QVariant EntityTreeModel::entityData(
const Item &item,
int column,
int role )
const
140 case Qt::DisplayRole:
142 if ( item.hasAttribute<EntityDisplayAttribute>() &&
143 !item.attribute<EntityDisplayAttribute>()->displayName().isEmpty() ) {
144 return item.attribute<EntityDisplayAttribute>()->displayName();
146 if (!item.remoteId().isEmpty())
147 return item.remoteId();
148 return QString(QLatin1String(
"<") + QString::number( item.id() ) + QLatin1String(
">"));
151 case Qt::DecorationRole:
152 if ( item.hasAttribute<EntityDisplayAttribute>() &&
153 !item.attribute<EntityDisplayAttribute>()->iconName().isEmpty() )
154 return item.attribute<EntityDisplayAttribute>()->icon();
164 QVariant EntityTreeModel::entityData(
const Collection &collection,
int column,
int role )
const
166 Q_D(
const EntityTreeModel );
171 if ( collection == Collection::root() ) {
173 if ( role == Qt::DisplayRole )
174 return d->m_rootCollectionDisplayName;
176 if ( role == Qt::EditRole )
181 case Qt::DisplayRole:
184 if ( collection.hasAttribute<EntityDisplayAttribute>() &&
185 !collection.attribute<EntityDisplayAttribute>()->displayName().isEmpty() ) {
186 return collection.attribute<EntityDisplayAttribute>()->displayName();
188 if ( !collection.name().isEmpty() )
189 return collection.name();
190 return i18n(
"Loading..." );
193 case Qt::DecorationRole:
194 if ( collection.hasAttribute<EntityDisplayAttribute>() &&
195 !collection.attribute<EntityDisplayAttribute>()->iconName().isEmpty() ) {
196 return collection.attribute<EntityDisplayAttribute>()->icon();
198 return KIcon( CollectionUtils::defaultIconName( collection ) );
206 QVariant EntityTreeModel::data(
const QModelIndex & index,
int role )
const
208 Q_D(
const EntityTreeModel );
209 if ( role == SessionRole )
210 return QVariant::fromValue( qobject_cast<QObject *>( d->m_session ) );
213 const HeaderGroup headerGroup =
static_cast<HeaderGroup
>( ( role /
static_cast<int>( TerminalUserRole ) ) );
215 role %= TerminalUserRole;
216 if ( !index.isValid() ) {
217 if ( ColumnCountRole != role )
220 return entityColumnCount( headerGroup );
223 if ( ColumnCountRole == role )
224 return entityColumnCount( headerGroup );
226 const Node *node =
reinterpret_cast<Node *
>( index.internalPointer() );
228 if ( ParentCollectionRole == role && d->m_collectionFetchStrategy != FetchNoCollections ) {
229 const Collection parentCollection = d->m_collections.value( node->parent );
230 Q_ASSERT( parentCollection.isValid() );
232 return QVariant::fromValue( parentCollection );
235 if ( Node::Collection == node->type ) {
237 const Collection collection = d->m_collections.value( node->id );
239 if ( !collection.isValid() )
244 return collection.mimeType();
247 return collection.remoteId();
249 case CollectionIdRole:
250 return collection.id();
258 return QVariant::fromValue( collection );
261 return collection.url().url();
263 case UnreadCountRole:
265 CollectionStatistics statistics = collection.statistics();
266 return statistics.unreadCount();
270 return d->m_pendingCollectionRetrieveJobs.contains(collection.id()) ? FetchingState : IdleState;
272 case CollectionSyncProgressRole:
274 return d->m_collectionSyncProgress.value( collection.id() );
276 case Qt::BackgroundRole:
278 if ( collection.hasAttribute<EntityDisplayAttribute>() )
280 EntityDisplayAttribute *eda = collection.attribute<EntityDisplayAttribute>();
281 QColor color = eda->backgroundColor();
282 if ( color.isValid() )
288 return entityData( collection, index.column(), role );
292 }
else if ( Node::Item == node->type ) {
293 const Item item = d->m_items.value( node->id );
294 if ( !item.isValid() )
298 case ParentCollectionRole:
299 return QVariant::fromValue( item.parentCollection() );
301 return item.mimeType();
304 return item.remoteId();
307 return QVariant::fromValue( item );
312 case CollectionIdRole:
315 case LoadedPartsRole:
316 return QVariant::fromValue( item.loadedPayloadParts() );
318 case AvailablePartsRole:
319 return QVariant::fromValue( item.availablePayloadParts() );
322 return item.url( Akonadi::Item::UrlWithMimeType ).url();
324 case Qt::BackgroundRole:
326 if ( item.hasAttribute<EntityDisplayAttribute>() )
328 EntityDisplayAttribute *eda = item.attribute<EntityDisplayAttribute>();
329 const QColor color = eda->backgroundColor();
330 if ( color.isValid() )
336 return entityData( item, index.column(), role );
345 Qt::ItemFlags EntityTreeModel::flags(
const QModelIndex & index )
const
347 Q_D(
const EntityTreeModel );
350 if ( !index.isValid() )
353 Qt::ItemFlags flags = QAbstractItemModel::flags( index );
355 const Node *node =
reinterpret_cast<Node *
>( index.internalPointer() );
357 if ( Node::Collection == node->type ) {
359 if ( d->m_pendingCutCollections.contains( node->id ) )
360 return Qt::ItemIsSelectable;
362 const Collection collection = d->m_collections.value( node->id );
363 if ( collection.isValid() ) {
365 if ( collection == Collection::root() ) {
370 const int rights = collection.rights();
372 if ( rights & Collection::CanChangeCollection ) {
373 if ( index.column() == 0 )
374 flags |= Qt::ItemIsEditable;
377 flags |= Qt::ItemIsDropEnabled;
379 if ( rights & ( Collection::CanCreateCollection | Collection::CanCreateItem | Collection::CanLinkItem ) ) {
381 flags |= Qt::ItemIsDropEnabled;
385 flags |= Qt::ItemIsDragEnabled;
388 }
else if ( Node::Item == node->type ) {
389 if ( d->m_pendingCutItems.contains( node->id ) )
390 return Qt::ItemIsSelectable;
394 Collection parentCollection;
395 if ( !index.parent().isValid() ) {
396 parentCollection = d->m_rootCollection;
398 const Node *parentNode =
reinterpret_cast<Node *
>( index.parent().internalPointer() );
400 parentCollection = d->m_collections.value( parentNode->id );
402 if ( parentCollection.isValid() ) {
403 const int rights = parentCollection.rights();
406 if ( rights & Collection::CanChangeItem && index.column() == 0 ) {
407 flags = flags | Qt::ItemIsEditable;
410 flags |= Qt::ItemIsDragEnabled;
417 Qt::DropActions EntityTreeModel::supportedDropActions()
const
419 return (Qt::CopyAction | Qt::MoveAction | Qt::LinkAction);
422 QStringList EntityTreeModel::mimeTypes()
const
425 return QStringList() << QLatin1String(
"text/uri-list" );
428 bool EntityTreeModel::dropMimeData(
const QMimeData * data, Qt::DropAction action,
int row,
int column,
const QModelIndex & parent )
432 Q_D( EntityTreeModel );
435 if ( !parent.isValid() )
452 if ( action == Qt::IgnoreAction )
459 Node *node =
reinterpret_cast<Node *
>( parent.internalId() );
463 if ( Node::Item == node->type ) {
464 if ( !parent.parent().isValid() ) {
467 kWarning() <<
"Dropped onto item with no parent collection";
472 node =
reinterpret_cast<Node *
>( parent.parent().internalId() );
475 if ( Node::Collection == node->type ) {
476 const Collection destCollection = d->m_collections.value( node->id );
479 if ( destCollection == Collection::root() )
483 if ( data->hasFormat( QLatin1String(
"text/uri-list" ) ) ) {
485 MimeTypeChecker mimeChecker;
486 mimeChecker.setWantedMimeTypes( destCollection.contentMimeTypes() );
488 const KUrl::List urls = KUrl::List::fromMimeData( data );
489 foreach (
const KUrl &url, urls ) {
490 const Collection collection = d->m_collections.value( Collection::fromUrl( url ).
id() );
491 if ( collection.isValid() ) {
492 if ( collection.parentCollection().id() == destCollection.id() && action != Qt::CopyAction) {
493 kDebug() <<
"Error: source and destination of move are the same.";
497 if ( !mimeChecker.isWantedCollection( collection ) ) {
498 kDebug() <<
"unwanted collection" << mimeChecker.wantedMimeTypes() << collection.contentMimeTypes();
502 if ( url.hasQueryItem( QLatin1String(
"name" ) ) ) {
503 const QString collectionName = url.queryItemValue( QLatin1String(
"name" ) );
506 if ( collectionNames.contains( collectionName ) ) {
507 KMessageBox::error( 0, i18n(
"The target collection '%1' contains already\na collection with name '%2'.",
508 destCollection.name(), collection.name() ) );
513 const Item item = d->m_items.value( Item::fromUrl( url ).
id() );
514 if ( item.isValid() ) {
515 if ( item.parentCollection().id() == destCollection.id() && action != Qt::CopyAction ) {
516 kDebug() <<
"Error: source and destination of move are the same.";
520 if ( !mimeChecker.isWantedItem( item ) ) {
521 kDebug() <<
"unwanted item" << mimeChecker.wantedMimeTypes() << item.mimeType();
532 connect( job, SIGNAL(result(KJob*)), SLOT(pasteJobDone(KJob*)) );
546 QModelIndex EntityTreeModel::index(
int row,
int column,
const QModelIndex & parent )
const
549 Q_D(
const EntityTreeModel );
551 if ( parent.column() > 0 )
552 return QModelIndex();
555 if ( column >= columnCount() || column < 0 )
556 return QModelIndex();
558 QList<Node*> childEntities;
560 const Node *parentNode =
reinterpret_cast<Node*
>( parent.internalPointer() );
562 if ( !parentNode || !parent.isValid() ) {
563 if ( d->m_showRootCollection )
564 childEntities << d->m_childEntities.value( -1 );
566 childEntities = d->m_childEntities.value( d->m_rootCollection.
id() );
568 if ( parentNode->id >= 0 )
569 childEntities = d->m_childEntities.value( parentNode->id );
572 const int size = childEntities.size();
573 if ( row < 0 || row >= size )
574 return QModelIndex();
576 Node *node = childEntities.at( row );
578 return createIndex( row, column, reinterpret_cast<void*>( node ) );
581 QModelIndex EntityTreeModel::parent(
const QModelIndex & index )
const
583 Q_D(
const EntityTreeModel );
585 if ( !index.isValid() )
586 return QModelIndex();
588 if ( d->m_collectionFetchStrategy == InvisibleCollectionFetch || d->m_collectionFetchStrategy == FetchNoCollections )
589 return QModelIndex();
591 const Node *node =
reinterpret_cast<Node*
>( index.internalPointer() );
594 return QModelIndex();
596 const Collection collection = d->m_collections.value( node->parent );
598 if ( !collection.isValid() )
599 return QModelIndex();
601 if ( collection.id() == d->m_rootCollection.
id() ) {
602 if ( !d->m_showRootCollection )
603 return QModelIndex();
605 return createIndex( 0, 0, reinterpret_cast<void *>( d->m_rootNode ) );
608 Q_ASSERT( collection.parentCollection().isValid() );
609 const int row = d->
indexOf<Node::Collection>( d->m_childEntities.value( collection.parentCollection().id() ), collection.id() );
611 Q_ASSERT( row >= 0 );
612 Node *parentNode = d->m_childEntities.value( collection.parentCollection().id() ).at( row );
614 return createIndex( row, 0, reinterpret_cast<void*>( parentNode ) );
617 int EntityTreeModel::rowCount(
const QModelIndex & parent )
const
619 Q_D(
const EntityTreeModel );
621 if ( d->m_collectionFetchStrategy == InvisibleCollectionFetch || d->m_collectionFetchStrategy == FetchNoCollections ) {
622 if ( parent.isValid() )
625 return d->m_items.size();
628 if ( !parent.isValid() ) {
630 if ( d->m_showRootCollection )
631 return d->m_childEntities.value( -1 ).size();
632 return d->m_childEntities.value( d->m_rootCollection.
id() ).size();
635 if ( parent.column() != 0 )
638 const Node *node =
reinterpret_cast<Node*
>( parent.internalPointer() );
643 if ( Node::Item == node->type )
646 Q_ASSERT( parent.isValid() );
647 return d->m_childEntities.value( node->id ).size();
650 int EntityTreeModel::entityColumnCount( HeaderGroup headerGroup )
const
653 Q_UNUSED( headerGroup );
658 QVariant EntityTreeModel::entityHeaderData(
int section, Qt::Orientation orientation,
int role,
HeaderGroup headerGroup )
const
662 Q_UNUSED( headerGroup );
664 if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ) {
665 if ( d->m_rootCollection == Collection::root() )
666 return i18nc(
"@title:column Name of a thing",
"Name" );
667 return d->m_rootCollection.
name();
670 return QAbstractItemModel::headerData( section, orientation, role );
673 QVariant EntityTreeModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
675 const HeaderGroup headerGroup =
static_cast<HeaderGroup
>( (role /
static_cast<int>( TerminalUserRole ) ) );
677 role %= TerminalUserRole;
678 return entityHeaderData( section, orientation, role, headerGroup );
681 QMimeData *EntityTreeModel::mimeData(
const QModelIndexList &indexes )
const
683 Q_D(
const EntityTreeModel );
685 QMimeData *data =
new QMimeData();
687 foreach (
const QModelIndex &index, indexes ) {
688 if ( index.column() != 0 )
691 if ( !index.isValid() )
694 const Node *node =
reinterpret_cast<Node*
>( index.internalPointer() );
696 if ( Node::Collection == node->type )
697 urls << d->m_collections.value( node->id ).url( Collection::UrlWithName );
698 else if ( Node::Item == node->type )
699 urls << d->m_items.value( node->id ).url( Item::UrlWithMimeType );
704 urls.populateMimeData( data );
710 bool EntityTreeModel::setData(
const QModelIndex &index,
const QVariant &value,
int role )
712 Q_D( EntityTreeModel );
714 const Node *node =
reinterpret_cast<Node*
>( index.internalPointer() );
716 if ( role == PendingCutRole ) {
717 if ( index.isValid() && value.toBool() ) {
718 if ( Node::Collection == node->type )
719 d->m_pendingCutCollections.append( node->id );
721 if ( Node::Item == node->type )
722 d->m_pendingCutItems.append( node->id );
724 d->m_pendingCutCollections.clear();
725 d->m_pendingCutItems.clear();
730 if ( index.isValid() && node->type == Node::Collection && (role == CollectionRefRole || role == CollectionDerefRole) ) {
731 const Collection collection = index.data( CollectionRole ).value<Collection>();
732 Q_ASSERT( collection.isValid() );
734 if ( role == CollectionDerefRole )
735 d->deref( collection.id() );
736 else if ( role == CollectionRefRole )
737 d->ref( collection.id() );
740 if ( index.column() == 0 && ( role & ( Qt::EditRole | ItemRole | CollectionRole ) ) ) {
741 if ( Node::Collection == node->type ) {
743 Collection collection = d->m_collections.value( node->id );
745 if ( !collection.isValid() || !value.isValid() )
748 if ( Qt::EditRole == role ) {
749 collection.setName( value.toString() );
751 if ( collection.hasAttribute<EntityDisplayAttribute>() ) {
752 EntityDisplayAttribute *displayAttribute = collection.attribute<EntityDisplayAttribute>();
753 displayAttribute->setDisplayName( value.toString() );
757 if ( Qt::BackgroundRole == role )
759 QColor color = value.value<QColor>();
761 if ( !color.isValid() )
764 EntityDisplayAttribute *eda = collection.attribute<EntityDisplayAttribute>( Entity::AddIfMissing );
765 eda->setBackgroundColor( color );
768 if ( CollectionRole == role )
769 collection = value.value<Collection>();
771 CollectionModifyJob *job =
new CollectionModifyJob( collection, d->m_session );
772 connect( job, SIGNAL(result(KJob*)),
773 SLOT(updateJobDone(KJob*)) );
776 }
else if ( Node::Item == node->type ) {
778 Item item = d->m_items.value( node->id );
780 if ( !item.isValid() || !value.isValid() )
783 if ( Qt::EditRole == role ) {
784 if ( item.hasAttribute<EntityDisplayAttribute>() ) {
785 EntityDisplayAttribute *displayAttribute = item.attribute<EntityDisplayAttribute>( Entity::AddIfMissing );
786 displayAttribute->setDisplayName( value.toString() );
790 if ( Qt::BackgroundRole == role )
792 QColor color = value.value<QColor>();
794 if ( !color.isValid() )
797 EntityDisplayAttribute *eda = item.attribute<EntityDisplayAttribute>( Entity::AddIfMissing );
798 eda->setBackgroundColor( color );
801 if ( ItemRole == role )
803 item = value.value<Item>();
804 Q_ASSERT( item.id() == node->id );
807 ItemModifyJob *itemModifyJob =
new ItemModifyJob( item, d->m_session );
808 connect( itemModifyJob, SIGNAL(result(KJob*)),
809 SLOT(updateJobDone(KJob*)) );
815 return QAbstractItemModel::setData( index, value, role );
818 bool EntityTreeModel::canFetchMore(
const QModelIndex & parent )
const
824 void EntityTreeModel::fetchMore( const QModelIndex & parent )
826 Q_D( EntityTreeModel );
828 if ( !d->canFetchMore( parent ) )
831 if ( d->m_collectionFetchStrategy == InvisibleCollectionFetch )
834 if ( d->m_itemPopulation == ImmediatePopulation )
837 else if ( d->m_itemPopulation == LazyPopulation ) {
838 const Collection collection = parent.data( CollectionRole ).value<Collection>();
840 if ( !collection.isValid() )
843 d->fetchItems( collection );
847 bool EntityTreeModel::hasChildren(
const QModelIndex &parent )
const
849 Q_D(
const EntityTreeModel );
851 if ( d->m_collectionFetchStrategy == InvisibleCollectionFetch || d->m_collectionFetchStrategy == FetchNoCollections )
852 return parent.isValid() ?
false : !d->m_items.isEmpty();
858 return ((rowCount( parent ) > 0) || (canFetchMore( parent ) && d->m_itemPopulation == LazyPopulation));
861 bool EntityTreeModel::entityMatch(
const Item &item,
const QVariant &value, Qt::MatchFlags flags )
const
869 bool EntityTreeModel::entityMatch(
const Collection &collection,
const QVariant &value, Qt::MatchFlags flags )
const
871 Q_UNUSED( collection );
877 QModelIndexList EntityTreeModel::match(
const QModelIndex& start,
int role,
const QVariant& value,
int hits, Qt::MatchFlags flags )
const
881 if ( role == CollectionIdRole || role == CollectionRole ) {
883 if ( role == CollectionRole ) {
885 id = collection.
id();
887 id = value.toLongLong();
890 QModelIndexList list;
892 const Collection collection = d->m_collections.value(
id );
898 Q_ASSERT( collectionIndex.isValid() );
899 list << collectionIndex;
904 if ( role == ItemIdRole || role == ItemRole ) {
906 if ( role == ItemRole ) {
907 const Item item = value.value<
Item>();
910 id = value.toLongLong();
912 QModelIndexList list;
914 const Item item = d->m_items.value(
id );
921 if ( role == EntityUrlRole ) {
922 const KUrl url( value.toString() );
923 const Item item = Item::fromUrl( url );
925 if ( item.isValid() )
928 const Collection collection = Collection::fromUrl( url );
929 QModelIndexList list;
936 if ( role != AmazingCompletionRole )
937 return QAbstractItemModel::match( start, role, value, hits, flags );
940 QModelIndexList list;
942 if ( role < 0 || !start.isValid() || !value.isValid() )
945 const int column = 0;
946 int row = start.row();
947 const QModelIndex parentIndex = start.parent();
948 const int parentRowCount = rowCount( parentIndex );
950 while ( row < parentRowCount && (hits == -1 || list.size() < hits) ) {
951 const QModelIndex idx = index( row, column, parentIndex );
952 const Item item = idx.data( ItemRole ).value<
Item>();
959 if ( entityMatch( collection, value, flags ) )
963 if ( entityMatch( item, value, flags ) )
973 bool EntityTreeModel::insertRows(
int,
int,
const QModelIndex& )
978 bool EntityTreeModel::insertColumns(
int,
int,
const QModelIndex& )
983 bool EntityTreeModel::removeRows(
int,
int,
const QModelIndex& )
988 bool EntityTreeModel::removeColumns(
int,
int,
const QModelIndex& )
996 d->beginResetModel();
997 d->m_itemPopulation = strategy;
999 if ( strategy == NoItemPopulation ) {
1000 disconnect( d->m_monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)),
1001 this, SLOT(monitoredItemAdded(Akonadi::Item,Akonadi::Collection)) );
1002 disconnect( d->m_monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)),
1003 this, SLOT(monitoredItemChanged(Akonadi::Item,QSet<QByteArray>)) );
1004 disconnect( d->m_monitor, SIGNAL(itemRemoved(Akonadi::Item)),
1005 this, SLOT(monitoredItemRemoved(Akonadi::Item)) );
1006 disconnect( d->m_monitor, SIGNAL(itemMoved(Akonadi::Item,Akonadi::Collection,Akonadi::Collection)),
1007 this, SLOT(monitoredItemMoved(Akonadi::Item,Akonadi::Collection,Akonadi::Collection)) );
1009 disconnect( d->m_monitor, SIGNAL(itemLinked(Akonadi::Item,Akonadi::Collection)),
1010 this, SLOT(monitoredItemLinked(Akonadi::Item,Akonadi::Collection)) );
1011 disconnect( d->m_monitor, SIGNAL(itemUnlinked(Akonadi::Item,Akonadi::Collection)),
1012 this, SLOT(monitoredItemUnlinked(Akonadi::Item,Akonadi::Collection)) );
1015 d->m_monitor->d_ptr->useRefCounting = (strategy == LazyPopulation);
1023 return d->m_itemPopulation;
1026 void EntityTreeModel::setIncludeRootCollection(
bool include )
1029 d->beginResetModel();
1030 d->m_showRootCollection = include;
1034 bool EntityTreeModel::includeRootCollection()
const
1037 return d->m_showRootCollection;
1040 void EntityTreeModel::setRootCollectionDisplayName(
const QString &displayName )
1043 d->m_rootCollectionDisplayName = displayName;
1048 QString EntityTreeModel::rootCollectionDisplayName()
const
1051 return d->m_rootCollectionDisplayName;
1057 d->beginResetModel();
1058 d->m_collectionFetchStrategy = strategy;
1060 if ( strategy == FetchNoCollections || strategy == InvisibleCollectionFetch ) {
1061 disconnect( d->m_monitor, SIGNAL(collectionChanged(Akonadi::Collection)),
1062 this, SLOT(monitoredCollectionChanged(Akonadi::Collection)) );
1063 disconnect( d->m_monitor, SIGNAL(collectionAdded(Akonadi::Collection,Akonadi::Collection)),
1064 this, SLOT(monitoredCollectionAdded(Akonadi::Collection,Akonadi::Collection)) );
1065 disconnect( d->m_monitor, SIGNAL(collectionRemoved(Akonadi::Collection)),
1066 this, SLOT(monitoredCollectionRemoved(Akonadi::Collection)) );
1067 disconnect( d->m_monitor,
1068 SIGNAL(collectionMoved(Akonadi::Collection,Akonadi::Collection,Akonadi::Collection)),
1069 this, SLOT(monitoredCollectionMoved(Akonadi::Collection,Akonadi::Collection,Akonadi::Collection)) );
1080 return d->m_collectionFetchStrategy;
1083 static QPair<QList<const QAbstractProxyModel *>,
const EntityTreeModel *> proxiesAndModel(
const QAbstractItemModel *model )
1085 QList<const QAbstractProxyModel *> proxyChain;
1086 const QAbstractProxyModel *proxy = qobject_cast<
const QAbstractProxyModel *>( model );
1087 const QAbstractItemModel *_model = model;
1090 proxyChain.prepend( proxy );
1091 _model = proxy->sourceModel();
1092 proxy = qobject_cast<
const QAbstractProxyModel *>( _model );
1095 const EntityTreeModel *etm = qobject_cast<
const EntityTreeModel *>( _model );
1096 return qMakePair(proxyChain, etm);
1099 static QModelIndex proxiedIndex(
const QModelIndex &idx, QList<const QAbstractProxyModel *> proxyChain )
1101 QListIterator<const QAbstractProxyModel *> it( proxyChain );
1102 QModelIndex _idx = idx;
1103 while ( it.hasNext() )
1104 _idx = it.next()->mapFromSource( _idx );
1108 QModelIndex EntityTreeModel::modelIndexForCollection(
const QAbstractItemModel *model,
const Collection &collection )
1110 QPair<QList<const QAbstractProxyModel *>,
const EntityTreeModel*> pair = proxiesAndModel( model );
1111 QModelIndex idx = pair.second->d_ptr->indexForCollection( collection );
1112 return proxiedIndex( idx, pair.first );
1115 QModelIndexList EntityTreeModel::modelIndexesForItem(
const QAbstractItemModel *model,
const Item &item )
1117 QPair<QList<const QAbstractProxyModel *>,
const EntityTreeModel*> pair = proxiesAndModel( model );
1118 QModelIndexList list = pair.second->d_ptr->indexesForItem( item );
1119 QModelIndexList proxyList;
1120 foreach(
const QModelIndex &idx, list )
1122 const QModelIndex pIdx = proxiedIndex( idx, pair.first );
1123 if ( pIdx.isValid() )
1129 #include "entitytreemodel.moc"