feat(product-suite): clarify primary image sorting

This commit is contained in:
chengma
2026-07-22 17:45:31 +08:00
parent 0425771598
commit 70c4323c52
5 changed files with 129 additions and 10 deletions
+73 -4
View File
@@ -22,6 +22,7 @@ from PySide6.QtCore import (
)
from PySide6.QtGui import (
QColor,
QFont,
QIcon,
QImage,
QImageReader,
@@ -301,6 +302,7 @@ class ProductOriginalList(QListWidget):
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setAcceptDrops(True)
self._reordering_enabled = True
self.setDragEnabled(True)
self.setDropIndicatorShown(True)
self.setDragDropMode(QListWidget.InternalMove)
@@ -318,7 +320,31 @@ class ProductOriginalList(QListWidget):
self._hover_remove_button.setFixedSize(28, 28)
self._hover_remove_button.clicked.connect(self._remove_hovered)
self._hover_remove_button.hide()
self.setToolTip("可拖入或粘贴图片;已有缩略图可拖动排序")
self._update_reordering_tooltip()
def reordering_enabled(self):
return self._reordering_enabled
def set_reordering_enabled(self, enabled):
self._reordering_enabled = bool(enabled)
self.setDragEnabled(self._reordering_enabled)
self.setDropIndicatorShown(self._reordering_enabled)
self._update_reordering_tooltip()
item_tooltip = (
"拖动到第一位即可设为主图"
if self._reordering_enabled
else "正在拉取蝦皮主图,完成后可调整图片顺序"
)
for row in range(self.count()):
item = self.item(row)
if item.data(Qt.UserRole) is not None:
item.setToolTip(item_tooltip)
def _update_reordering_tooltip(self):
if self._reordering_enabled:
self.setToolTip("可拖入或粘贴图片;拖动图片到第一位即可设为主图")
else:
self.setToolTip("正在拉取蝦皮主图,完成后可调整图片顺序")
def paintEvent(self, event):
super().paintEvent(event)
@@ -343,6 +369,9 @@ class ProductOriginalList(QListWidget):
if event.mimeData().hasUrls():
event.acceptProposedAction()
return
if not self._reordering_enabled:
event.ignore()
return
super().dragMoveEvent(event)
def dropEvent(self, event):
@@ -351,6 +380,9 @@ class ProductOriginalList(QListWidget):
self.filesDropped.emit(paths)
event.acceptProposedAction()
return
if not self._reordering_enabled:
event.ignore()
return
super().dropEvent(event)
self.orderChanged.emit(self.asset_ids())
@@ -3344,6 +3376,11 @@ class ProductSuiteTab(QWidget):
for index, asset in enumerate(assets, 1):
label = "主图" if index == 1 else "参考%d" % (index - 1)
item = QListWidgetItem(label)
if index == 1:
font = QFont(item.font())
font.setBold(True)
item.setFont(font)
item.setForeground(QColor("#1f5fbf"))
item.setData(Qt.UserRole, int(asset.id))
item.setData(
ORIGINAL_CHECK_STATE_ROLE,
@@ -3351,10 +3388,26 @@ class ProductSuiteTab(QWidget):
)
if _asset_usable(asset):
item.setIcon(QIcon(_image_pixmap(asset.local_path, QSize(82, 64))))
item.setToolTip("%s,勾选可批量删除;双击预览;拖动可调整顺序" % label)
item.setToolTip(
"%s,勾选可批量删除;双击预览;%s"
% (
label,
"拖动到第一位即可设为主图"
if self.original_list.reordering_enabled()
else "正在拉取蝦皮主图,完成后可调整图片顺序",
)
)
else:
item.setIcon(QIcon(_placeholder_pixmap("待下载", QSize(82, 64))))
item.setToolTip("%s尚未下载;勾选可批量删除,单击缩略图后台拉取" % label)
item.setToolTip(
"%s尚未下载;勾选可批量删除,单击缩略图后台拉取;%s"
% (
label,
"拖动到第一位即可设为主图"
if self.original_list.reordering_enabled()
else "正在拉取蝦皮主图,完成后可调整图片顺序",
)
)
self.original_list.addItem(item)
finally:
self.original_list.blockSignals(previous)
@@ -3547,16 +3600,31 @@ class ProductSuiteTab(QWidget):
state = self._displayed_state
if state is None or state.project_id is None:
return
if state.generation_running():
self._refresh_originals(state)
self._status("生成中不能调整商品原图顺序", "warning")
return
if state.pull_running():
self._refresh_originals(state)
self._status("正在拉取蝦皮主图,完成后可调整图片顺序", "warning")
return
all_assets = self._original_assets(state, include_missing=True)
hidden_ids = [int(asset.id) for asset in all_assets if int(asset.id) not in set(visible_ids)]
ordered_ids = list(visible_ids) + hidden_ids
before_ids = [int(asset.id) for asset in all_assets]
if ordered_ids == before_ids:
self._refresh_originals(state)
return
try:
image_studio.reorder_original_assets(
state.project_id,
list(visible_ids) + hidden_ids,
ordered_ids,
path=self.db_path,
)
except Exception as exc:
self._message("原图排序失败", _user_error(exc))
else:
self._status("已更新商品原图顺序,第一张图片为主图", "success")
self._refresh_originals(state)
def _asset_for_item(self, item):
@@ -5752,6 +5820,7 @@ class ProductSuiteTab(QWidget):
self.item_id_edit.setEnabled(not generation_running and not pull_running)
self._refresh_add_images_action(state)
self.original_list.setEnabled(not generation_running)
self.original_list.set_reordering_enabled(not generation_running and not pull_running)
self._refresh_original_selection_controls()
for widget in (
self.platform_combo,