feat(gui): add task deletion menus

This commit is contained in:
chengma
2026-07-20 11:12:01 +08:00
parent 6abe4decff
commit 9f43e5547a
7 changed files with 358 additions and 6 deletions
+81
View File
@@ -982,6 +982,7 @@ class GenerateTab(QWidget):
cover_prompts_dir=None,
title_templates_dir=None,
open_accounts_callback=None,
refresh_workflow_callback=None,
):
super().__init__(parent)
self.config = appconfig.load_config(config_path or appconfig.CONFIG_PATH) if config is None else config
@@ -993,6 +994,7 @@ class GenerateTab(QWidget):
self.db_path = _database_path(db_path, self.config)
self.status_callback = status_callback
self.open_accounts_callback = open_accounts_callback
self.refresh_workflow_callback = refresh_workflow_callback
self.title_prompt_path = title_prompt_path or appconfig.title_prompt_path(self.config)
self.cover_prompts_dir = cover_prompts_dir or appconfig.cover_prompts_dir(self.config)
self.title_templates_dir = title_templates_dir or appconfig.title_templates_dir(self.config)
@@ -1185,6 +1187,7 @@ class GenerateTab(QWidget):
self.task_table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.task_table.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.task_table.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.EditKeyPressed)
self.task_table.setContextMenuPolicy(Qt.CustomContextMenu)
self.task_table.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)
self.task_table.horizontalHeader().setStretchLastSection(False)
self.task_table.verticalHeader().setVisible(False)
@@ -1271,6 +1274,7 @@ class GenerateTab(QWidget):
self.stop_generate_button.clicked.connect(self.stop_generate)
self.reset_generate_button.clicked.connect(self.reset_generated_result)
self.task_table.leftDoubleClicked.connect(self.show_task_images)
self.task_table.customContextMenuRequested.connect(self.show_task_context_menu)
self.refresh_title_templates()
self.refresh_cover_templates()
@@ -1937,6 +1941,83 @@ class GenerateTab(QWidget):
f"已重置生成结果:{len(target_tasks)} 条,内容:{label},run_id={run_id}"
)
def show_task_context_menu(self, position):
index = self.task_table.indexAt(position)
if not index.isValid():
return
self.task_table.selectRow(index.row())
self.task_table.setCurrentIndex(index)
task = self.model.task_at(index.row())
if task is None:
return
menu = QMenu(self.task_table)
delete_action = menu.addAction("删除本条记录")
delete_action.setEnabled(
self.generate_thread is None and getattr(task, "status", "") != "running"
)
delete_action.triggered.connect(self.delete_selected_task)
menu.exec(self.task_table.viewport().mapToGlobal(position))
def delete_selected_task(self, checked=False):
if self.generate_thread is not None:
self._set_status("AI 生成正在进行,不能删除记录", level="warning")
return
task = self._selected_task()
if task is None:
self._set_status("请选择要删除的记录", level="warning")
return
if getattr(task, "status", "") == "running":
self._set_status("任务正在处理,不能删除", level="warning")
return
batch = db.get_batch(task.batch_id, path=self.db_path)
batch_text = self._batch_label(batch) if batch is not None else task.batch_id
lines = [
"确定要删除本条本地记录吗?",
f"商品ID:{task.item_id}",
f"店铺:{self.model.account_name_for(task)}({task.alias})",
f"所属批次:{batch_text}",
]
if int(getattr(task, "committed", 0) or 0) == 1:
lines.extend(
[
"",
"该商品已提交过蝦皮。本次仅删除本地记录,不会回滚蝦皮线上商品。",
]
)
lines.extend(
[
"",
"删除后,该记录不会出现在①、②、③的列表、筛选、采集、生成、更新或回写范围。",
"不会删除原 Excel、本地图片或账号 Chrome 数据。",
]
)
answer = QMessageBox.question(
self,
"删除本条记录",
"\n".join(lines),
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No,
)
if answer != QMessageBox.Yes:
self._set_status("已取消删除本条记录")
return
try:
result = db.delete_task(
task.id,
reason="用户在AI生成页删除单条记录",
path=self.db_path,
)
except Exception as exc:
QMessageBox.warning(self, "删除本条记录", str(exc))
self._set_status(f"删除本条记录失败:{exc}", level="danger")
return
self.refresh_tasks()
if self.refresh_workflow_callback is not None:
self.refresh_workflow_callback()
message = f"已删除本地记录:商品 {result['item_id']}"
self._set_status(message, level="success")
QMessageBox.information(self, "删除本条记录", message)
def _reset_scope_tasks(self):
selection = self.task_table.selectionModel()
selected_rows = []