feat: 优化任务表批量选择和详情入口 (#131)

This commit is contained in:
chengma
2026-08-11 09:43:29 +08:00
parent f9dc22161b
commit cc4c1c4c4c
5 changed files with 183 additions and 41 deletions
+90 -4
View File
@@ -49,6 +49,38 @@ class TaskTableModelCheckTests(unittest.TestCase):
self.assertEqual(model.checked_task_ids(), ())
def test_check_all_and_invert_only_loaded_real_tasks(self):
model = TaskTableModel()
changes = []
model.checkedTaskIdsChanged.connect(changes.append)
model.append_tasks(
[TaskRow("TASK-1", "采集"), TaskRow("TASK-2", "采集")],
has_more=True,
)
model.check_all_loaded_tasks()
self.assertEqual(model.checked_task_ids(), ("TASK-1", "TASK-2"))
self.assertEqual(len(changes), 1)
model.invert_loaded_task_checks()
self.assertEqual(model.checked_task_ids(), ())
self.assertEqual(len(changes), 2)
def test_new_page_is_not_checked_after_select_all(self):
model = TaskTableModel()
model.append_tasks([TaskRow("TASK-1", "采集")], has_more=True)
model.check_all_loaded_tasks()
model.append_tasks([TaskRow("TASK-2", "采集")], has_more=False)
self.assertEqual(model.checked_task_ids(), ("TASK-1",))
self.assertEqual(
model.data(model.index(1, CHECK_COLUMN), Qt.CheckStateRole),
Qt.Unchecked,
)
def test_search_clears_checks_and_refresh_is_next_to_search(self):
page = PDDTaskPage()
page.set_tasks([TaskRow("TASK-1", "采集")])
@@ -56,26 +88,39 @@ class TaskTableModelCheckTests(unittest.TestCase):
page.taskModel.index(0, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole
)
page.resize(1300, 650)
self.app.processEvents()
page._update_command_layout(compact=False)
layout = page.commandCard.layout()
search_position = layout.getItemPosition(layout.indexOf(page.searchButton))
refresh_position = layout.getItemPosition(layout.indexOf(page.refreshButton))
rerun_position = layout.getItemPosition(layout.indexOf(page.rerunButton))
resubmit_position = layout.getItemPosition(layout.indexOf(page.resubmitButton))
remove_position = layout.getItemPosition(layout.indexOf(page.removeButton))
select_all_position = layout.getItemPosition(
layout.indexOf(page.selectAllButton)
)
invert_position = layout.getItemPosition(
layout.indexOf(page.invertSelectionButton)
)
self.assertEqual(refresh_position[1], search_position[1] + 1)
self.assertEqual(search_position[0], 0)
self.assertEqual(select_all_position[0], 0)
self.assertEqual(resubmit_position[1], rerun_position[1] + 1)
self.assertEqual(remove_position[1], resubmit_position[1] + 1)
self.assertEqual(invert_position[1], select_all_position[1] + 1)
self.assertEqual(page.checkedCountLabel.text(), "已选 1 条")
self.assertTrue(page.removeButton.isEnabled())
self.assertTrue(page.selectAllButton.isEnabled())
self.assertTrue(page.invertSelectionButton.isEnabled())
page.resize(1000, 650)
self.app.processEvents()
page._update_command_layout(compact=True)
compact_search = layout.getItemPosition(layout.indexOf(page.searchButton))
compact_refresh = layout.getItemPosition(layout.indexOf(page.refreshButton))
compact_select_all = layout.getItemPosition(
layout.indexOf(page.selectAllButton)
)
self.assertEqual(compact_search[0], 1)
self.assertEqual(compact_refresh[1], compact_search[1] + 1)
self.assertEqual(compact_select_all[0], 2)
page.searchButton.click()
@@ -84,6 +129,47 @@ class TaskTableModelCheckTests(unittest.TestCase):
self.assertFalse(page.removeButton.isEnabled())
page.deleteLater()
def test_selection_buttons_are_disabled_during_batch_work(self):
page = PDDTaskPage()
page.set_tasks([TaskRow("TASK-1", "采集")])
page.set_resubmit_running(True)
self.assertFalse(page.selectAllButton.isEnabled())
self.assertFalse(page.invertSelectionButton.isEnabled())
page.set_resubmit_running(False)
self.assertTrue(page.selectAllButton.isEnabled())
self.assertTrue(page.invertSelectionButton.isEnabled())
page.deleteLater()
def test_selection_buttons_ignore_empty_placeholder_rows(self):
page = PDDTaskPage()
self.assertFalse(page.selectAllButton.isEnabled())
self.assertFalse(page.invertSelectionButton.isEnabled())
page.selectAllButton.click()
page.invertSelectionButton.click()
self.assertEqual(page.taskModel.checked_task_ids(), ())
page.deleteLater()
def test_detail_has_no_column_and_checkbox_activation_does_not_open(self):
page = PDDTaskPage()
page.set_tasks([TaskRow("TASK-1", "采集")])
received = []
page.detailRequested.connect(received.append)
self.assertNotIn("操作", page.taskModel.HEADERS)
self.assertEqual(page.taskModel.columnCount(), 9)
page._on_table_activated(page.taskModel.index(0, CHECK_COLUMN))
page._on_table_activated(page.taskModel.index(0, 2))
self.assertEqual(received, ["TASK-1"])
self.assertIn("Enter", page.taskTable.accessibleDescription())
page.deleteLater()
def test_remove_emits_stable_checked_task_ids(self):
page = PDDTaskPage()
page.set_tasks(