def mouseMoveEvent(self, event): if not self.image_list.drag_icon: return if qt_version_info >= (6, 0): pos = event.position() else: pos = event.pos() if ((pos - self.drag_start_pos).manhattanLength() < QtWidgets.QApplication.startDragDistance()): return if not self.get_selected(): # user has started dragging an unselected image self.image_list.select_image(self) paths = [] for image in self.image_list.get_selected_images(): paths.append(image.path) if not paths: return drag = QtGui.QDrag(self) # construct icon count = min(len(paths), 8) src_icon = self.image_list.drag_icon src_w = src_icon.width() src_h = src_icon.height() margin = (count - 1) * 4 if count == 1: icon = src_icon else: icon = QtGui.QPixmap(src_w + margin, src_h + margin) icon.fill(Qt.transparent) try: paint = QtGui.QPainter(icon) for i in range(count): paint.drawPixmap(QtCore.QPoint(margin - (i * 4), i * 4), src_icon) finally: del paint drag.setPixmap(icon) if self.image_list.drag_hotspot: x, y = self.image_list.drag_hotspot else: x, y = src_w // 2, src_h drag.setHotSpot(QtCore.QPoint(x, y + margin)) mimeData = QtCore.QMimeData() mimeData.setData(DRAG_MIMETYPE, repr(paths).encode('utf-8')) drag.setMimeData(mimeData) if qt_version_info >= (6, 0): drag.exec(Qt.CopyAction) else: drag.exec_(Qt.CopyAction)
def _do_layout(self, origin): left, top, right, bottom = self.getContentsMargins() width_hint = left + right height_hint = top + bottom if self.item_list: item_size = self.item_list[0].sizeHint() item_h = item_size.height() item_w = item_size.width() multi_row = self.viewport_size.height() - height_hint > item_h if multi_row: columns = max( (self.viewport_size.width() - width_hint) // item_w, 1) rows = (len(self.item_list) + columns - 1) // columns else: columns = len(self.item_list) rows = 1 width_hint += columns * item_w height_hint += rows * item_h self.size_hint = QtCore.QSize(width_hint, height_hint) if not self.item_list: return x = origin.x() + left y = origin.y() + top for n, item in enumerate(self.item_list): i, j = n % columns, n // columns item.setGeometry( QtCore.QRect(QtCore.QPoint(x + (i * item_w), y + (j * item_h)), item_size)) self.scroll_area.set_multi_row(multi_row)
def mouseMoveEvent(self, event): if not self.image_list.drag_icon: return if ((event.pos() - self.drag_start_pos).manhattanLength() < QtWidgets.QApplication.startDragDistance()): return paths = [] for image in self.image_list.get_selected_images(): paths.append(image.path) if not paths: return drag = QtGui.QDrag(self) # construct icon count = min(len(paths), 8) src_icon = self.image_list.drag_icon src_w = src_icon.width() src_h = src_icon.height() margin = (count - 1) * 4 if count == 1: icon = src_icon else: icon = QtGui.QPixmap(src_w + margin, src_h + margin) icon.fill(Qt.transparent) with QtGui.QPainter(icon) as paint: for i in range(count): paint.drawPixmap( QtCore.QPoint(margin - (i * 4), i * 4), src_icon) drag.setPixmap(icon) if src_h == src_w: # round marker used in Bing maps version 8 drag.setHotSpot(QtCore.QPoint(src_w // 2, (src_h // 2) + margin)) else: drag.setHotSpot(QtCore.QPoint(src_w // 2, src_h + margin)) mimeData = QtCore.QMimeData() mimeData.setData(DRAG_MIMETYPE, repr(paths).encode('utf-8')) drag.setMimeData(mimeData) dropAction = drag.exec_(Qt.CopyAction)
def _do_layout(self, rect, test_only): left, top, right, bottom = self.getContentsMargins() effective_rect = rect.adjusted(left, top, -right, -bottom) x = effective_rect.x() y = effective_rect.y() row_height = 0 for item in self.item_list: item_size = item.sizeHint() if x + item_size.width() > effective_rect.right() and row_height > 0: x = effective_rect.x() y += row_height row_height = 0 if not test_only: item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item_size)) x += item_size.width() row_height = max(row_height, item_size.height()) return y + row_height - rect.y() + bottom
def set_viewport_size(self, size): self.viewport_size = size self._do_layout(QtCore.QPoint(0, 0))
def __init__(self, scroll_area=None, **kw): super(ThumbsLayout, self).__init__(**kw) self.scroll_area = scroll_area self.item_list = [] self.viewport_size = QtCore.QSize() self._do_layout(QtCore.QPoint(0, 0))