feat: 实现 PDD 任务详情窗口 (#39)
This commit is contained in:
@@ -45,6 +45,7 @@ from .task_models import (
|
||||
TaskType,
|
||||
)
|
||||
from .task_repository import TaskRepository
|
||||
from .task_detail_view import TaskDetailWindow
|
||||
|
||||
|
||||
TASK_TYPE_BY_TEXT = {
|
||||
@@ -203,6 +204,7 @@ class PDDTaskPageEvent(QObject):
|
||||
self._claim_busy = False
|
||||
self._claim_thread: Optional[QThread] = None
|
||||
self._claim_worker: Optional[ClaimTaskWorker] = None
|
||||
self._detail_windows: Dict[str, TaskDetailWindow] = {}
|
||||
self._collect_service_factory = collect_service_factory
|
||||
|
||||
try:
|
||||
@@ -234,6 +236,7 @@ class PDDTaskPageEvent(QObject):
|
||||
page.searchRequested.connect(self.search_tasks)
|
||||
page.refreshRequested.connect(self.refresh_tasks)
|
||||
page.autoFetchRequested.connect(self._request_claim_task)
|
||||
page.detailRequested.connect(self.show_task_detail)
|
||||
page.taskModel.loadMoreRequested.connect(self._load_page)
|
||||
page.autoFetchButton.setText("获取任务")
|
||||
page.destroyed.connect(self.shutdown)
|
||||
@@ -387,6 +390,55 @@ class PDDTaskPageEvent(QObject):
|
||||
rows = [summary_to_row(summary) for summary in summaries]
|
||||
self._page.append_task_page(rows, has_more=len(rows) == limit)
|
||||
|
||||
@pyqtSlot(str)
|
||||
def show_task_detail(self, task_id: str) -> None:
|
||||
"""读取本地完整任务,并打开一个非模态详情窗口。"""
|
||||
|
||||
if self._closing or not task_id:
|
||||
return
|
||||
current = self._detail_windows.get(task_id)
|
||||
if current is not None:
|
||||
current.showNormal()
|
||||
current.raise_()
|
||||
current.activateWindow()
|
||||
return
|
||||
|
||||
try:
|
||||
detail = self._repository.get_task(task_id)
|
||||
except Exception:
|
||||
InfoBar.error(
|
||||
title="无法打开任务详情",
|
||||
content="无法读取本地任务,请检查数据库后重试。",
|
||||
isClosable=True,
|
||||
duration=-1,
|
||||
position=InfoBarPosition.TOP_RIGHT,
|
||||
parent=self._page,
|
||||
)
|
||||
return
|
||||
if detail is None:
|
||||
InfoBar.warning(
|
||||
title="任务不存在",
|
||||
content=f"本地找不到任务 {task_id},请刷新任务列表。",
|
||||
isClosable=True,
|
||||
duration=5000,
|
||||
position=InfoBarPosition.TOP_RIGHT,
|
||||
parent=self._page,
|
||||
)
|
||||
return
|
||||
|
||||
window = TaskDetailWindow(detail, self._page.window())
|
||||
window.closed.connect(self._on_detail_closed)
|
||||
self._detail_windows[task_id] = window
|
||||
window.show()
|
||||
window.raise_()
|
||||
window.activateWindow()
|
||||
|
||||
@pyqtSlot(str)
|
||||
def _on_detail_closed(self, task_id: str) -> None:
|
||||
self._detail_windows.pop(task_id, None)
|
||||
if not self._closing:
|
||||
self._page.taskTable.setFocus()
|
||||
|
||||
@pyqtSlot()
|
||||
def shutdown(self) -> None:
|
||||
"""窗口关闭时停止新的领取,并等待已领取任务完成本地保存。"""
|
||||
@@ -395,6 +447,10 @@ class PDDTaskPageEvent(QObject):
|
||||
return
|
||||
self._closing = True
|
||||
|
||||
for window in list(self._detail_windows.values()):
|
||||
window.close()
|
||||
self._detail_windows.clear()
|
||||
|
||||
worker = self._claim_worker
|
||||
thread = self._claim_thread
|
||||
if worker is not None:
|
||||
|
||||
Reference in New Issue
Block a user