23 #include "entityorderproxymodel.h"
27 #include <KDE/KConfigGroup>
29 #include "collection.h"
31 #include "entitytreemodel.h"
36 class EntityOrderProxyModelPrivate
45 void saveOrder(
const QModelIndex &index );
47 KConfigGroup m_orderConfig;
56 using namespace Akonadi;
59 : QSortFilterProxyModel(parent), d_ptr( new EntityOrderProxyModelPrivate( this ) )
61 setDynamicSortFilter(
true);
73 layoutAboutToBeChanged();
74 d->m_orderConfig = configGroup;
82 if ( !d->m_orderConfig.isValid() ) {
83 return QSortFilterProxyModel::lessThan( left, right );
87 if ( !d->m_orderConfig.hasKey( QString::number( col.
id() ) ) )
88 return QSortFilterProxyModel::lessThan( left, right );
90 const QStringList list = d->m_orderConfig.readEntry( QString::number( col.
id() ), QStringList() );
93 return QSortFilterProxyModel::lessThan( left, right );
95 const QString leftValue = configString( left );
96 const QString rightValue = configString( right );
98 const int leftPosition = list.indexOf( leftValue );
99 const int rightPosition = list.indexOf( rightValue );
101 if ( leftPosition < 0 || rightPosition < 0 )
102 return QSortFilterProxyModel::lessThan( left, right );
104 return leftPosition < rightPosition;
111 if ( !d->m_orderConfig.isValid() )
112 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
114 if ( !data->hasFormat( QLatin1String(
"text/uri-list" ) ) )
115 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
118 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
120 bool containsMove =
false;
122 const KUrl::List urls = KUrl::List::fromMimeData( data );
126 if (parent.isValid())
130 if (!hasChildren(parent))
131 return QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
133 const QModelIndex targetIndex = index( 0, column, parent );
138 QStringList droppedList;
139 foreach (
const KUrl &url, urls ) {
149 if ( list.isEmpty() )
155 droppedList << configString( list.first() );
158 if ( !idx.isValid() )
164 droppedList << configString( idx );
168 QStringList existingList;
169 if ( d->m_orderConfig.hasKey( QString::number( parentCol.
id() ) ) ) {
170 existingList = d->m_orderConfig.readEntry( QString::number( parentCol.
id() ), QStringList() );
172 const int rowCount = this->rowCount( parent );
173 for (
int row = 0; row < rowCount; ++row) {
174 static const int column = 0;
175 const QModelIndex idx = this->index( row, column, parent );
176 existingList.append(configString( idx ));
179 const int numberOfDroppedElement( droppedList.size() );
180 for (
int i = 0; i < numberOfDroppedElement; ++i )
182 const QString droppedItem = droppedList.at( i );
183 const int existingIndex = existingList.indexOf( droppedItem );
184 existingList.removeAt( existingIndex );
185 existingList.insert( row + i - (existingIndex > row ? 0 : 1), droppedList.at( i ) );
188 d->m_orderConfig.writeEntry( QString::number( parentCol.
id() ), existingList );
192 bool result = QSortFilterProxyModel::dropMimeData( data, action, row, column, parent );
202 if ( role < Qt::UserRole )
203 return QSortFilterProxyModel::match( start, role, value, hits, flags );
205 QModelIndexList list;
206 QModelIndex proxyIndex;
207 foreach (
const QModelIndex &idx, sourceModel()->match( mapToSource( start ), role, value, hits, flags ) ) {
208 proxyIndex = mapFromSource( idx );
209 if ( proxyIndex.isValid() )
216 void EntityOrderProxyModelPrivate::saveOrder(
const QModelIndex &parent )
219 int rowCount = q->rowCount( parent );
224 static const int column = 0;
225 QModelIndex childIndex = q->index( 0, column, parent );
227 QString parentKey = q->parentConfigString( childIndex );
229 if ( parentKey.isEmpty() )
234 list << q->configString( childIndex );
235 saveOrder( childIndex );
237 for (
int row = 1; row < rowCount; ++row )
239 childIndex = q->index( row, column, parent );
240 list << q->configString( childIndex );
241 saveOrder( childIndex );
244 m_orderConfig.writeEntry( parentKey, list );
247 QString EntityOrderProxyModel::parentConfigString(
const QModelIndex& index )
const
255 return QString::number( col.
id() );
258 QString EntityOrderProxyModel::configString(
const QModelIndex& index )
const
263 return QString::fromLatin1(
"i" ) + QString::number( eId );
268 return QString::fromLatin1(
"c" ) + QString::number( eId );
270 Q_ASSERT( !
"Invalid entity" );
277 d->saveOrder( QModelIndex() );
278 d->m_orderConfig.sync();
281 void EntityOrderProxyModel::clearOrder(
const QModelIndex& parent )
285 const QString parentKey = parentConfigString( index( 0, 0, parent ) );
287 if ( parentKey.isEmpty() )
290 d->m_orderConfig.deleteEntry( parentKey );
294 void EntityOrderProxyModel::clearTreeOrder()
297 d->m_orderConfig.deleteGroup();