def dropEvent(self, event): if event.source(): QTreeView.dropEvent(self, event) else: ix = self.indexAt(event.pos()) if not self.model().isDir(ix): ix = ix.parent() pathDir = self.model().filePath(ix) m = event.mimeData() if m.hasUrls(): urlLocals = [url for url in m.urls() if url.isLocalFile()] accepted = False for urlLocal in urlLocals: path = urlLocal.toLocalFile() info = QFileInfo(path) n_path = QDir(pathDir).filePath(info.fileName()) o_path = info.absoluteFilePath() if n_path == o_path: continue if info.isDir(): QDir().rename(o_path, n_path) else: qfile = QFile(o_path) if QFile(n_path).exists(): n_path += "(copy)" qfile.rename(n_path) accepted = True if accepted: event.acceptProposedAction()
def myDropEvent(self, event, drop_item): """Workaround for broken QTreeWidget::dropEvent per https://bugreports.qt.io/browse/QTBUG-45320 doing reverse ordering of items on dropping. reimplementation in python from C++ For this code we need dual GPL3 license instead of pure BSD3 """ if event.source() == self and (event.dropAction() == Qt.MoveAction or self.dragDropMode() == QAbstractItemView.InternalMove): droptuple = self.dropOn(event, drop_item) if droptuple is not None: (row, col, drop_index) = droptuple # print("droptuple", droptuple[2].row()) idxs = self.selectedIndexes() indexes = [] for idx in idxs: if idx.column() == 0: indexes.append(idx) if drop_index in indexes: return # When removing items the drop location could shift new_drop_index = QPersistentModelIndex(self.model().index( row, col, drop_index)) # print("updatated drop_row", new_drop_index.row()) # Remove the items taken = [] for i in range(len(indexes) - 1, -1, -1): # print("idx", indexes[i].row(), indexes[i].column()) parent = self.itemFromIndex(indexes[i]) if parent is None or parent.parent() is None: t_item = self.takeTopLevelItem(indexes[i].row()) taken.append(t_item) else: t_item = parent.parent().takeChild(indexes[i].row()) taken.append(t_item) # end for # insert them back in at their new positions for i in range(len(indexes)): # Either at a specific point or appended if row == -1: if drop_index.isValid(): parent = self.itemFromIndex(drop_index) parent.insertChild(parent.childCount(), taken.pop()) else: self.insertTopLevelItem(self.topLevelItemCount(), taken.pop()) else: r = new_drop_index.row( ) if new_drop_index.row() >= 0 else row if drop_index.isValid(): parent = self.itemFromIndex(drop_index) parent.insertChild(min(r, parent.childCount()), taken.pop()) else: self.insertTopLevelItem( min(r, self.topLevelItemCount()), taken.pop()) # end for event.accept() # Don't want QAbstractItemView to delete it because it was "moved" we already did it event.setDropAction(Qt.CopyAction) QTreeView.dropEvent(self, event)
def dropEvent(self, evt): """ Executes dropEvent when taegetlocation is within first row""" #TODO: self.indexAt(index).row()==0 insted if self.header().sectionSize( 0) > evt.pos().x(): #Only execute drop when on first column QTreeView.dropEvent(self, evt)