23 #include "entityorderproxymodel.h"
27 #include <KDE/KConfigGroup>
30 #include "collection.h"
32 #include "entitytreemodel.h"
37 class EntityOrderProxyModelPrivate
46 void saveOrder(
const QModelIndex &index );
48 KConfigGroup m_orderConfig;
57 using namespace Akonadi;
60 : QSortFilterProxyModel(parent), d_ptr( new EntityOrderProxyModelPrivate( this ) )
62 setDynamicSortFilter(
true );
74 layoutAboutToBeChanged();
75 d->m_orderConfig = configGroup;
83 if ( !d->m_orderConfig.isValid() ) {
84 return QSortFilterProxyModel::lessThan( left, right );
88 if ( !d->m_orderConfig.hasKey( QString::number( col.
id() ) ) ) {
89 return QSortFilterProxyModel::lessThan( left, right );
92 const QStringList list = d->m_orderConfig.readEntry( QString::number( col.
id() ), QStringList() );
94 if ( list.isEmpty() ) {
95 return QSortFilterProxyModel::lessThan( left, right );
98 const QString leftValue = configString( left );
99 const QString rightValue = configString( right );
101 const int leftPosition = list.indexOf( leftValue );
102 const int rightPosition = list.indexOf( rightValue );
104 if ( leftPosition < 0 || rightPosition < 0 ) {
105 return QSortFilterProxyModel::lessThan( left, right );
108 return leftPosition < rightPosition;
115 if ( !d->m_orderConfig.isValid() ) {
116 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
119 if ( !data->hasFormat( QLatin1String(
"text/uri-list" ) ) ) {
120 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
124 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
127 bool containsMove =
false;
129 const KUrl::List urls = KUrl::List::fromMimeData( data );
133 if ( parent.isValid() ) {
136 if ( !hasChildren( parent ) ) {
137 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
140 const QModelIndex targetIndex = index( 0, column, parent );
145 QStringList droppedList;
146 foreach (
const KUrl &url, urls ) {
150 Item item = Item::fromUrl( url );
151 if ( !item.isValid() ) {
156 if ( list.isEmpty() ) {
164 droppedList << configString( list.first() );
167 if ( !idx.isValid() ) {
175 droppedList << configString( idx );
179 QStringList existingList;
180 if ( d->m_orderConfig.hasKey( QString::number( parentCol.
id() ) ) ) {
181 existingList = d->m_orderConfig.readEntry( QString::number( parentCol.
id() ), QStringList() );
183 const int rowCount = this->rowCount( parent );
184 for (
int row = 0; row < rowCount; ++row ) {
185 static const int column = 0;
186 const QModelIndex idx = this->index( row, column, parent );
187 existingList.append( configString( idx ) );
190 const int numberOfDroppedElement( droppedList.size() );
191 for (
int i = 0; i < numberOfDroppedElement; ++i ) {
192 const QString droppedItem = droppedList.at( i );
193 const int existingIndex = existingList.indexOf( droppedItem );
194 existingList.removeAt( existingIndex );
195 existingList.insert( row + i - ( existingIndex > row ? 0 : 1 ), droppedList.at( i ) );
198 d->m_orderConfig.writeEntry( QString::number( parentCol.
id() ), existingList );
200 if ( containsMove ) {
201 bool result = QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
211 if ( role < Qt::UserRole ) {
212 return QSortFilterProxyModel::match( start, role, value, hits, flags );
215 QModelIndexList list;
216 QModelIndex proxyIndex;
217 foreach (
const QModelIndex &idx, sourceModel()->match( mapToSource( start ), role, value, hits, flags ) ) {
218 proxyIndex = mapFromSource( idx );
219 if ( proxyIndex.isValid() ) {
227 void EntityOrderProxyModelPrivate::saveOrder(
const QModelIndex &parent )
230 int rowCount = q->rowCount( parent );
232 if ( rowCount == 0 ) {
236 static const int column = 0;
237 QModelIndex childIndex = q->index( 0, column, parent );
239 QString parentKey = q->parentConfigString( childIndex );
241 if ( parentKey.isEmpty() ) {
247 list << q->configString( childIndex );
248 saveOrder( childIndex );
250 for (
int row = 1; row < rowCount; ++row ) {
251 childIndex = q->index( row, column, parent );
252 list << q->configString( childIndex );
253 saveOrder( childIndex );
256 m_orderConfig.writeEntry( parentKey, list );
259 QString EntityOrderProxyModel::parentConfigString(
const QModelIndex& index )
const
268 return QString::number( col.
id() );
271 QString EntityOrderProxyModel::configString(
const QModelIndex& index )
const
275 return QString::fromLatin1(
"i" ) + QString::number( eId );
279 return QString::fromLatin1(
"c" ) + QString::number( eId );
281 Q_ASSERT( !
"Invalid entity" );
288 d->saveOrder( QModelIndex() );
289 d->m_orderConfig.sync();
292 void EntityOrderProxyModel::clearOrder(
const QModelIndex& parent )
296 const QString parentKey = parentConfigString( index( 0, 0, parent ) );
298 if ( parentKey.isEmpty() ) {
302 d->m_orderConfig.deleteEntry( parentKey );
306 void EntityOrderProxyModel::clearTreeOrder()
309 d->m_orderConfig.deleteGroup();
Represents a collection of PIM items.
qint64 Id
Describes the unique id type.
void setOrderConfig(KConfigGroup &group)
Sets the config group that will be used for storing the order.
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
A model that keeps the order of entities persistent.
virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits=1, Qt::MatchFlags flags=Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
The parent collection of the entity.
Id id() const
Returns the unique identifier of the entity.
static QModelIndex modelIndexForCollection(const QAbstractItemModel *model, const Collection &collection)
Returns a QModelIndex in model which points to collection.
void saveOrder()
Saves the order.
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const
virtual ~EntityOrderProxyModel()
Destroys the entity order proxy model.
static QModelIndexList modelIndexesForItem(const QAbstractItemModel *model, const Item &item)
Returns a QModelIndex in model which points to item.
bool isValid() const
Returns whether the entity is valid.
static Collection fromUrl(const KUrl &url)
Creates a collection from the given url.