예제 #1
0
파일: QtUI.py 프로젝트: Panmen/email_split
	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()
예제 #2
0
    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)
예제 #3
0
 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)