20 #include "collectionmodel.h"
21 #include "collectionmodel_p.h"
23 #include "collectionutils_p.h"
24 #include "collectionmodifyjob.h"
25 #include "entitydisplayattribute.h"
27 #include "pastehelper_p.h"
34 #include <QtCore/QMimeData>
35 #include <QtGui/QPixmap>
37 using namespace Akonadi;
39 CollectionModel::CollectionModel( QObject * parent ) :
40 QAbstractItemModel( parent ),
50 : QAbstractItemModel( parent ),
57 CollectionModel::~CollectionModel()
60 d->childCollections.clear();
61 d->collections.clear();
69 int CollectionModel::columnCount(
const QModelIndex & parent )
const
71 if (parent.isValid() && parent.column() != 0)
76 QVariant CollectionModel::data(
const QModelIndex & index,
int role )
const
78 Q_D(
const CollectionModel );
79 if ( !index.isValid() )
82 const Collection col = d->collections.value( index.internalId() );
86 if ( index.column() == 0 && (role == Qt::DisplayRole || role == Qt::EditRole) ) {
87 if ( col.hasAttribute<EntityDisplayAttribute>() &&
88 !col.attribute<EntityDisplayAttribute>()->displayName().isEmpty() )
89 return col.attribute<EntityDisplayAttribute>()->displayName();
94 case Qt::DecorationRole:
95 if ( index.column() == 0 ) {
96 if ( col.hasAttribute<EntityDisplayAttribute>() &&
97 !col.attribute<EntityDisplayAttribute>()->iconName().isEmpty() )
98 return col.attribute<EntityDisplayAttribute>()->icon();
99 return KIcon( CollectionUtils::defaultIconName( col ) );
102 case OldCollectionIdRole:
103 case CollectionIdRole:
105 case OldCollectionRole:
107 return QVariant::fromValue( col );
112 QModelIndex CollectionModel::index(
int row,
int column,
const QModelIndex & parent )
const
114 Q_D(
const CollectionModel );
115 if (column >= columnCount() || column < 0)
return QModelIndex();
117 QVector<Collection::Id> list;
118 if ( !parent.isValid() )
119 list = d->childCollections.value( Collection::root().id() );
122 if (parent.column() > 0)
123 return QModelIndex();
124 list = d->childCollections.value( parent.internalId() );
127 if ( row < 0 || row >= list.size() )
128 return QModelIndex();
129 if ( !d->collections.contains( list.at(row) ) )
130 return QModelIndex();
131 return createIndex( row, column, reinterpret_cast<void*>( d->collections.value( list.at(row) ).
id() ) );
134 QModelIndex CollectionModel::parent(
const QModelIndex & index )
const
136 Q_D(
const CollectionModel );
137 if ( !index.isValid() )
138 return QModelIndex();
140 Collection col = d->collections.value( index.internalId() );
141 if ( !col.isValid() )
142 return QModelIndex();
145 Collection parentCol = d->collections.value( col.parentCollection().id() );
146 if ( !parentCol.isValid() )
148 return QModelIndex();
150 QVector<Collection::Id> list;
151 list = d->childCollections.value( parentCol.parentCollection().id() );
153 int parentRow = list.indexOf( parentCol.id() );
155 return QModelIndex();
157 return createIndex( parentRow, 0, reinterpret_cast<void*>( parentCol.id() ) );
160 int CollectionModel::rowCount(
const QModelIndex & parent )
const
162 const Q_D( CollectionModel );
163 QVector<Collection::Id> list;
164 if ( parent.isValid() )
165 list = d->childCollections.value( parent.internalId() );
167 list = d->childCollections.value( Collection::root().
id() );
172 QVariant CollectionModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
174 const Q_D( CollectionModel );
176 if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole )
177 return d->headerContent;
178 return QAbstractItemModel::headerData( section, orientation, role );
181 bool CollectionModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role )
183 Q_D( CollectionModel );
185 if ( section == 0 && orientation == Qt::Horizontal && role == Qt::EditRole ) {
186 d->headerContent = value.toString();
193 bool CollectionModel::setData(
const QModelIndex & index,
const QVariant & value,
int role )
195 Q_D( CollectionModel );
196 if ( index.column() == 0 && role == Qt::EditRole ) {
198 Collection col = d->collections.value( index.internalId() );
199 if ( !col.isValid() || value.toString().isEmpty() )
201 col.setName( value.toString() );
202 CollectionModifyJob *job =
new CollectionModifyJob( col, d->session );
203 connect( job, SIGNAL(result(KJob*)), SLOT(editDone(KJob*)) );
206 return QAbstractItemModel::setData( index, value, role );
209 Qt::ItemFlags CollectionModel::flags(
const QModelIndex & index )
const
211 Q_D(
const CollectionModel );
215 if (!index.isValid())
218 Qt::ItemFlags flags = QAbstractItemModel::flags( index );
220 flags = flags | Qt::ItemIsDragEnabled;
223 if ( index.isValid() ) {
224 col = d->collections.value( index.internalId() );
225 Q_ASSERT( col.isValid() );
228 return flags | Qt::ItemIsDropEnabled;
230 if ( col.isValid() ) {
231 if ( col.rights() & (Collection::CanChangeCollection |
232 Collection::CanCreateCollection |
233 Collection::CanDeleteCollection |
234 Collection::CanCreateItem) ) {
235 if ( index.column() == 0 )
236 flags = flags | Qt::ItemIsEditable;
238 flags = flags | Qt::ItemIsDropEnabled;
245 Qt::DropActions CollectionModel::supportedDropActions()
const
247 return Qt::CopyAction | Qt::MoveAction;
250 QStringList CollectionModel::mimeTypes()
const
252 return QStringList() << QLatin1String(
"text/uri-list" );
255 QMimeData *CollectionModel::mimeData(
const QModelIndexList &indexes)
const
257 QMimeData *data =
new QMimeData();
259 foreach (
const QModelIndex &index, indexes ) {
260 if ( index.column() != 0 )
263 urls << Collection( index.internalId() ).url();
265 urls.populateMimeData( data );
270 bool CollectionModel::dropMimeData(
const QMimeData * data, Qt::DropAction action,
int row,
int column,
const QModelIndex & parent)
272 Q_D( CollectionModel );
273 if ( !(action & supportedDropActions()) )
278 if ( row >= 0 && column >= 0 )
279 idx = index( row, column, parent );
283 if ( !idx.isValid() )
286 const Collection parentCol = d->collections.value( idx.internalId() );
287 if (!parentCol.isValid())
291 connect( job, SIGNAL(result(KJob*)), SLOT(dropResult(KJob*)) );
298 return d->collections.value(
id );
301 void CollectionModel::fetchCollectionStatistics(
bool enable)
304 d->fetchStatistics = enable;
308 void CollectionModel::includeUnsubscribed(
bool include)
311 d->unsubscribed = include;
316 #include "collectionmodel.moc"