def _decode_rows_drag_mime_data(self, mime_data): """If mime_data contains packed ROWS_DRAG_MIME_TYPE mime data, it is unpacked into a list containing the source model and objects dragged, and this tuple is returned. None is returned otherwise.""" if mime_data.hasFormat(ROWS_DRAG_MIME_TYPE): d = mime_data.data(ROWS_DRAG_MIME_TYPE) ds = Qt.QDataStream(d, Qt.QIODevice.ReadOnly) rows = [] src_model = ctypes.cast(ds.readUInt64(), ctypes.py_object).value while not ds.atEnd(): rows.append(ds.readInt64()) if rows: return RowsDrag(src_model, rows)
def mimeData(self, midxs): mime_data = super().mimeData(midxs) if mime_data is None: mime_data = Qt.QMimeData() d = Qt.QByteArray() ds = Qt.QDataStream(d, Qt.QIODevice.WriteOnly) ds.writeUInt64(id(self)) # There is an midx for every column of the dragged row(s), but our ROW_DRAG_MIME_TYPE data should contain only one entry per row packed_rows = set() for midx in midxs: assert midx.isValid() row = midx.row() if row in packed_rows: continue packed_rows.add(row) ds.writeInt64(row) mime_data.setData(ROWS_DRAG_MIME_TYPE, d) return mime_data