+ const PlacesItem* destItem = m_model->placesItem(index);
+ const PlacesItem::GroupType group = destItem->groupType();
+ if (group == PlacesItem::SearchForType || group == PlacesItem::RecentlySavedType) {
+ return;
+ }
+
+ if (m_model->storageSetupNeeded(index)) {
+ connect(m_model, &PlacesItemModel::storageSetupDone,
+ this, &PlacesPanel::slotItemDropEventStorageSetupDone);
+
+ m_itemDropEventIndex = index;
+
+ // Make a full copy of the Mime-Data
+ m_itemDropEventMimeData = new QMimeData;
+ m_itemDropEventMimeData->setText(event->mimeData()->text());
+ m_itemDropEventMimeData->setHtml(event->mimeData()->html());
+ m_itemDropEventMimeData->setUrls(event->mimeData()->urls());
+ m_itemDropEventMimeData->setImageData(event->mimeData()->imageData());
+ m_itemDropEventMimeData->setColorData(event->mimeData()->colorData());
+
+ m_itemDropEvent = new QDropEvent(event->pos().toPoint(),
+ event->possibleActions(),
+ m_itemDropEventMimeData,
+ event->buttons(),
+ event->modifiers());
+
+ m_model->requestStorageSetup(index);
+ return;
+ }
+
+ QUrl destUrl = destItem->url();
+ QDropEvent dropEvent(event->pos().toPoint(),
+ event->possibleActions(),
+ event->mimeData(),
+ event->buttons(),
+ event->modifiers());
+
+ slotUrlsDropped(destUrl, &dropEvent, this);
+}
+
+void PlacesPanel::slotItemDropEventStorageSetupDone(int index, bool success)
+{
+ disconnect(m_model, &PlacesItemModel::storageSetupDone,
+ this, &PlacesPanel::slotItemDropEventStorageSetupDone);
+
+ if ((index == m_itemDropEventIndex) && m_itemDropEvent && m_itemDropEventMimeData) {
+ if (success) {
+ QUrl destUrl = m_model->placesItem(index)->url();
+ slotUrlsDropped(destUrl, m_itemDropEvent, this);
+ }
+
+ delete m_itemDropEventMimeData;
+ delete m_itemDropEvent;
+
+ m_itemDropEventIndex = -1;
+ m_itemDropEventMimeData = 0;
+ m_itemDropEvent = 0;
+ }
+}
+
+void PlacesPanel::slotAboveItemDropEvent(int index, QGraphicsSceneDragDropEvent* event)
+{
+ m_model->dropMimeDataBefore(index, event->mimeData());
+ m_model->saveBookmarks();
+}
+
+void PlacesPanel::slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget* parent)
+{
+ KIO::DropJob *job = DragAndDropHelper::dropUrls(dest, event, parent);
+ if (job) {
+ connect(job, &KIO::DropJob::result, this, [this](KJob *job) { if (job->error()) emit errorMessage(job->errorString()); });
+ }