22#include "entityorderproxymodel.h"
26#include <KDE/KConfigGroup>
29#include "collection.h"
31#include "entitytreemodel.h"
36class EntityOrderProxyModelPrivate
45 void saveOrder(
const QModelIndex &index);
47 KConfigGroup m_orderConfig;
59 : QSortFilterProxyModel(parent)
60 , 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());
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);
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()) {
227void EntityOrderProxyModelPrivate::saveOrder(
const QModelIndex &parent)
230 int rowCount = q->rowCount(parent);
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);
259QString EntityOrderProxyModel::parentConfigString(
const QModelIndex &index)
const
268 return QString::number(col.
id());
271QString 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();
292void EntityOrderProxyModel::clearOrder(
const QModelIndex &parent)
296 const QString parentKey = parentConfigString(index(0, 0, parent));
298 if (parentKey.isEmpty()) {
302 d->m_orderConfig.deleteEntry(parentKey);
306void EntityOrderProxyModel::clearTreeOrder()
309 d->m_orderConfig.deleteGroup();
Represents a collection of PIM items.
static Collection fromUrl(const KUrl &url)
Creates a collection from the given url.
A model that keeps the order of entities persistent.
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const
virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits=1, Qt::MatchFlags flags=Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
void setOrderConfig(KConfigGroup &group)
Sets the config group that will be used for storing the order.
virtual ~EntityOrderProxyModel()
Destroys the entity order proxy model.
EntityOrderProxyModel(QObject *parent=0)
Creates a new entity order proxy model.
void saveOrder()
Saves the order.
static QModelIndexList modelIndexesForItem(const QAbstractItemModel *model, const Item &item)
Returns a QModelIndex in model which points to item.
static QModelIndex modelIndexForCollection(const QAbstractItemModel *model, const Collection &collection)
Returns a QModelIndex in model which points to collection.
@ ParentCollectionRole
The parent collection of the entity.
@ CollectionRole
The collection.
@ CollectionIdRole
The collection id.
bool isValid() const
Returns whether the entity is valid.
Id id() const
Returns the unique identifier of the entity.
qint64 Id
Describes the unique id type.
FreeBusyManager::Singleton.