diff --git a/manuskript/models/worldModel.py b/manuskript/models/worldModel.py
index f189a4a5..cdc1f910 100644
--- a/manuskript/models/worldModel.py
+++ b/manuskript/models/worldModel.py
@@ -2,7 +2,7 @@
# --!-- coding: utf8 --!--
from PyQt5.QtCore import QModelIndex
from PyQt5.QtCore import QSize
-from PyQt5.QtCore import Qt
+from PyQt5.QtCore import Qt, QMimeData, QByteArray
from PyQt5.QtGui import QStandardItem, QBrush, QFontMetrics
from PyQt5.QtGui import QStandardItemModel, QColor
from PyQt5.QtWidgets import QMenu, QAction, qApp
@@ -122,6 +122,14 @@ class worldModel(QStandardItemModel):
path = " > ".join(path)
return path
+ def copyRowFromIndex(self, index):
+ row_i = index.row()
+ row = []
+ for column_i in range(self.columnCount()):
+ item = self.itemFromIndex(index.sibling(row_i, column_i)).clone()
+ row.append(item)
+ return row
+
###############################################################################
# ADDING AND REMOVE
###############################################################################
@@ -162,6 +170,42 @@ class worldModel(QStandardItemModel):
index = self.selectedIndexes()[0]
self.removeRows(index.row(), 1, index.parent())
+ ###############################################################################
+ # DRAG & DROP
+ ###############################################################################
+
+ """Mime type for worldModel"""
+ MIME_TYPE = "application/x.manuskript.worldmodel"
+
+ def mimeTypes(self):
+ """Returns available MIME types
+
+ Returns only worldModel MIME type to allow only internal drag & drop"""
+ return [self.MIME_TYPE]
+
+ def mimeData(self, indexes):
+ """Returns dragged data as MIME data"""
+ mime_data = QMimeData()
+ """set MIME type"""
+ mime_data.setData(self.MIME_TYPE, QByteArray())
+ rows = []
+ for i in indexes:
+ """copy not move, because these rows will be deleted automatically
+ after dropMimeData"""
+ rows.append(self.copyRowFromIndex(i))
+ """mime_data.rows available only in the application"""
+ mime_data.rows = rows
+ return mime_data
+
+ def dropMimeData(self, mime_data, action, row, column, parent):
+ """insert MIME data"""
+ parent_item = self.itemFromIndex(parent)
+ if not parent_item:
+ parent_item = self.invisibleRootItem()
+ for row in mime_data.rows:
+ parent_item.appendRow(row)
+ return True
+
###############################################################################
# TEMPLATES
###############################################################################
diff --git a/manuskript/ui/mainWindow.py b/manuskript/ui/mainWindow.py
index b7514909..5589962a 100644
--- a/manuskript/ui/mainWindow.py
+++ b/manuskript/ui/mainWindow.py
@@ -737,6 +737,9 @@ class Ui_MainWindow(object):
self.verticalLayout_32.setObjectName("verticalLayout_32")
self.treeWorld = QtWidgets.QTreeView(self.frame_3)
self.treeWorld.setEditTriggers(QtWidgets.QAbstractItemView.EditKeyPressed)
+ self.treeWorld.setDragEnabled(True)
+ self.treeWorld.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
+ self.treeWorld.setDefaultDropAction(QtCore.Qt.MoveAction)
self.treeWorld.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.treeWorld.setIndentation(15)
self.treeWorld.setRootIsDecorated(False)
diff --git a/manuskript/ui/mainWindow.ui b/manuskript/ui/mainWindow.ui
index b7bd72df..182df211 100644
--- a/manuskript/ui/mainWindow.ui
+++ b/manuskript/ui/mainWindow.ui
@@ -1531,6 +1531,15 @@
QAbstractItemView::EditKeyPressed
+
+ true
+
+
+ QAbstractItemView::InternalMove
+
+
+ Qt::MoveAction
+
QAbstractItemView::ExtendedSelection