22 #include "entityorderproxymodel.h"
26 #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)
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()) {
227 void 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);
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.