┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/places
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-05-28 23:10:20 +0200
committerPeter Penz <[email protected]>2012-05-28 23:11:52 +0200
commit4e2f3dcffe2c2388e9d2d63e626ee6d03abce953 (patch)
tree7249e8bfda0cbec3d913abfdefdf6deb93d9d134 /src/panels/places
parent276100dcecf19b8037d4da37109c1f8fe6d85459 (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')
-rw-r--r--src/panels/places/placesitemmodel.cpp85
-rw-r--r--src/panels/places/placesitemmodel.h6
2 files changed, 88 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");
diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h
index 95a994e76..b850f356f 100644
--- a/src/panels/places/placesitemmodel.h
+++ b/src/panels/places/placesitemmodel.h
@@ -200,6 +200,12 @@ private:
QString internalMimeType() const;
/**
+ * @return Adjusted drop index which assures that the item is aligned
+ * into the same group as specified by PlacesItem::groupType().
+ */
+ int groupedDropIndex(int index, const PlacesItem* item) const;
+
+ /**
* @return True if the bookmarks have the same identifiers. The identifier
* is the unique "ID"-property in case if no UDI is set, otherwise
* the UDI is used as identifier.