feat(gui): add task deletion menus
This commit is contained in:
+79
-4
@@ -39,6 +39,7 @@ class ApplyTab(QWidget):
|
||||
status_callback=None,
|
||||
open_accounts_callback=None,
|
||||
open_settings_callback=None,
|
||||
refresh_workflow_callback=None,
|
||||
):
|
||||
super().__init__(parent)
|
||||
self.config = appconfig.load_config() if config is None else config
|
||||
@@ -47,6 +48,7 @@ class ApplyTab(QWidget):
|
||||
self.status_callback = status_callback
|
||||
self.open_accounts_callback = open_accounts_callback
|
||||
self.open_settings_callback = open_settings_callback
|
||||
self.refresh_workflow_callback = refresh_workflow_callback
|
||||
self.apply_worker = None
|
||||
self.apply_thread = None
|
||||
self.result_write_back_worker = None
|
||||
@@ -357,18 +359,91 @@ class ApplyTab(QWidget):
|
||||
|
||||
def show_task_context_menu(self, position):
|
||||
index = self.task_table.indexAt(position)
|
||||
if index.isValid():
|
||||
self.task_table.setCurrentIndex(index)
|
||||
menu = QMenu(self)
|
||||
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)
|
||||
reset_action = menu.addAction("重置更新状态")
|
||||
reset_action.setEnabled(
|
||||
self.apply_thread is None
|
||||
and self.result_write_back_thread is None
|
||||
and self._selected_task() is not None
|
||||
and getattr(task, "status", "") != "running"
|
||||
)
|
||||
reset_action.triggered.connect(self.reset_apply_status)
|
||||
menu.addSeparator()
|
||||
delete_action = menu.addAction("删除本条记录")
|
||||
delete_action.setEnabled(
|
||||
self.apply_thread is None
|
||||
and self.result_write_back_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.apply_thread is not None or self.result_write_back_thread is not None:
|
||||
self._set_status("更新或回写正在进行,不能删除记录", 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="用户在更新蝦皮页删除单条记录",
|
||||
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_apply_status(self, checked=False):
|
||||
if self.apply_thread is not None or self.result_write_back_thread is not None:
|
||||
self._set_status("更新或回写正在进行,不能重置")
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user