Skip to content

[#82-B] 用差量协调替代任务 CRUD 的整表重建 #91

Description

@amazing-fish

背景

#82-A / #89 已消除空闲 Tick 和卡片初始化的重复渲染,但新增、编辑、完成切换、删除以及提醒处置仍会调用 update_list_widget() 清空并重建整张列表。百条以内任务时,主要浪费来自未变化卡片的 QWidget 销毁、重建、图标加载、信号连接和布局。

范围

  1. 在主窗口维护稳定的 task_id -> QListWidgetItem / TodoItemWidget 映射。
  2. update_list_widget() 改为差量协调:
    • 添加仅创建并插入新卡片;
    • 编辑、完成切换只更新目标卡片,必要时移动或移出当前筛选;
    • 删除只移除目标卡片;
    • 提醒完成、推迟、忽略只协调受影响任务;
    • 筛选/排序仍重新计算目标顺序,但复用未变化卡片。
  3. TodoItemWidget 增加原位更新任务数据的入口,正文、优先级、完成态和计时呈现只更新实际变化部分。
  4. 正常 CRUD 不调用 QListWidget.clear();映射失配等异常恢复路径可执行一次完整重建。
  5. 保持空列表占位、信号只连接一次、卡片/详情浮层正确释放,并尽量保持滚动锚点。
  6. 继续同步调用现有 save_todos(),不修改 JSON、原子保存、备份或损坏保护语义。
  7. 按 bugfix 规则更新版本与 anchor。

验收标准

  • 添加、编辑、完成切换、删除任一任务时,QListWidget.clear() 调用次数为 0。
  • 未变化任务的 QListWidgetItemTodoItemWidget 对象身份保持不变。
  • 排序字段变化时只移动目标;筛选归属变化时只添加/移除目标。
  • 提醒完成、推迟、忽略只更新请求中的任务。
  • 从空列表添加及删除最后一项时,占位语义正确。
  • 增量更新后滚动位置/可见锚点不被无条件重置。
  • 信号不重复连接,删除的卡片及详情子对象进入释放流程。
  • 新增确定性测试,不使用易抖动的毫秒阈值。
  • 通过 python -m compileall todo_app、完整 unittestgit diff --check
  • PR 记录 Windows 开发版/EXE 的 CRUD 性能手工验证仍待执行。

非目标

  • TaskEditDialog 生命周期与启动阶段耗时治理;
  • Windows/EXE 性能采样框架;
  • 列表虚拟化或数据模型迁移;
  • 空闲 Tick、提醒规则、存储格式和构建流程修改。

Parent: #82

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions