fix(product-suite): finalize sorting after drag

This commit is contained in:
chengma
2026-07-23 09:36:00 +08:00
parent 03b9bbab78
commit 8706151e23
5 changed files with 127 additions and 18 deletions
+48 -9
View File
@@ -310,6 +310,8 @@ class ProductOriginalList(QListWidget):
self.setDragDropMode(QListWidget.InternalMove)
self.setDefaultDropAction(Qt.MoveAction)
self._dragged_item = None
self._drag_start_ids = None
self._pending_order = None
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self._show_menu)
self.itemChanged.connect(lambda item: self.checkedAssetsChanged.emit(self.checked_asset_ids()))
@@ -398,31 +400,68 @@ class ProductOriginalList(QListWidget):
if event.source() is not self:
event.ignore()
return
self._move_dragged_item_to(event.position().toPoint())
if not self._move_dragged_item_to(event.position().toPoint()):
event.ignore()
return
event.setDropAction(Qt.MoveAction)
event.accept()
def startDrag(self, supported_actions):
item = self.currentItem()
if not self._begin_internal_drag(item):
return
try:
super().startDrag(Qt.MoveAction)
finally:
self._finish_internal_drag()
def _begin_internal_drag(self, item):
if (
not self._reordering_enabled
or item is None
or item.data(Qt.UserRole) is None
):
return
return False
asset_ids = self.asset_ids()
if len(asset_ids) != len(set(asset_ids)):
return False
self._dragged_item = item
try:
super().startDrag(Qt.MoveAction)
finally:
self._dragged_item = None
self._drag_start_ids = asset_ids
self._pending_order = None
return True
def _finish_internal_drag(self):
pending_order = self._pending_order
drag_start_ids = self._drag_start_ids
self._dragged_item = None
self._drag_start_ids = None
self._pending_order = None
if pending_order is None or drag_start_ids is None:
return False
current_ids = self.asset_ids()
if (
current_ids != pending_order
or len(pending_order) != len(set(pending_order))
or len(pending_order) != len(drag_start_ids)
or set(pending_order) != set(drag_start_ids)
):
return False
self.orderChanged.emit(list(pending_order))
return True
def _move_dragged_item_to(self, position):
item = self._dragged_item
if item is None:
drag_start_ids = self._drag_start_ids
if item is None or drag_start_ids is None:
return False
source_row = self.row(item)
before_ids = self.asset_ids()
if source_row < 0 or len(before_ids) != len(set(before_ids)):
if (
source_row < 0
or len(before_ids) != len(set(before_ids))
or len(before_ids) != len(drag_start_ids)
or set(before_ids) != set(drag_start_ids)
):
return False
target = self.itemAt(position)
if target is None:
@@ -446,7 +485,7 @@ class ProductOriginalList(QListWidget):
return False
if after_ids == before_ids:
return False
self.orderChanged.emit(after_ids)
self._pending_order = after_ids
return True
def resizeEvent(self, event):