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