fix(product-suite): finalize sorting after drag
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user