diff options
| author | Peter Penz <[email protected]> | 2012-05-28 23:10:20 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2012-05-28 23:11:52 +0200 |
| commit | 4e2f3dcffe2c2388e9d2d63e626ee6d03abce953 (patch) | |
| tree | 7249e8bfda0cbec3d913abfdefdf6deb93d9d134 /src/panels/places/placesitemmodel.cpp | |
| parent | 276100dcecf19b8037d4da37109c1f8fe6d85459 (diff) | |
Implement dropping of items into the Places Panel
Some polishing regarding the icons and group-alignment must still
be done, but at least the basic functionality is back again.
Diffstat (limited to 'src/panels/places/placesitemmodel.cpp')
| -rw-r--r-- | src/panels/places/placesitemmodel.cpp | 85 |
1 files changed, 82 insertions, 3 deletions
diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index bc9975c47..aea262277 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -338,11 +338,46 @@ QMimeData* PlacesItemModel::createMimeData(const QSet<int>& indexes) const void PlacesItemModel::dropMimeData(int index, const QMimeData* mimeData) { - Q_UNUSED(index); // TODO if (mimeData->hasFormat(internalMimeType())) { - // TODO + // The item has been moved inside the view + QByteArray itemData = mimeData->data(internalMimeType()); + QDataStream stream(&itemData, QIODevice::ReadOnly); + int oldIndex; + stream >> oldIndex; + + PlacesItem* oldItem = placesItem(oldIndex); + if (!oldItem) { + return; + } + + PlacesItem* newItem = new PlacesItem(oldItem->bookmark()); + removeItem(oldIndex); + + if (oldIndex <= index) { + --index; + } + + const int dropIndex = groupedDropIndex(index, newItem); + insertItem(dropIndex, newItem); } else if (mimeData->hasFormat("text/uri-list")) { - // TODO + // One or more items must be added to the model + const KUrl::List urls = KUrl::List::fromMimeData(mimeData); + for (int i = urls.count() - 1; i >= 0; --i) { + const KUrl& url = urls[i]; + + QString text = url.fileName(); + if (text.isEmpty()) { + text = url.host(); + } + + KBookmark bookmark = PlacesItem::createBookmark(m_bookmarkManager, + text, + url, + "folder"); + PlacesItem* newItem = new PlacesItem(bookmark); + const int dropIndex = groupedDropIndex(index, newItem); + insertItem(dropIndex, newItem); + } } } @@ -892,6 +927,50 @@ QString PlacesItemModel::internalMimeType() const QString::number((qptrdiff)this); } +int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const +{ + Q_ASSERT(item); + + int dropIndex = index; + const PlacesItem::GroupType type = item->groupType(); + + const int itemCount = count(); + if (index < 0) { + dropIndex = itemCount; + } + + // Search nearest previous item with the same group + int previousIndex = -1; + for (int i = dropIndex - 1; i >= 0; --i) { + if (placesItem(i)->groupType() == type) { + previousIndex = i; + break; + } + } + + // Search nearest next item with the same group + int nextIndex = -1; + for (int i = dropIndex; i < count(); ++i) { + if (placesItem(i)->groupType() == type) { + nextIndex = i; + break; + } + } + + // Adjust the drop-index to be inserted to the + // nearest item with the same group. + if (previousIndex >= 0 && nextIndex >= 0) { + dropIndex = (dropIndex - previousIndex < nextIndex - dropIndex) ? + previousIndex + 1 : nextIndex; + } else if (previousIndex >= 0) { + dropIndex = previousIndex + 1; + } else if (nextIndex >= 0) { + dropIndex = nextIndex; + } + + return dropIndex; +} + bool PlacesItemModel::equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2) { const QString udi1 = b1.metaDataItem("UDI"); |
