7.9.0 容器内 App 手动排序实现与 QA 记录
实现范围
- 数据层新增
containerAppOrder,用稳定容器 ID 保存每个容器内的 App 路径顺序。
- 普通标签使用
tag:<tagName>;系统分类使用 system:<SmartCategoryID>;未分类和 Apple 内置使用固定特殊 ID。
TagGroup、AppLibrarySnapshot、ContentView、AppIndexer.group 贯通容器 ID 和排序数据。
- 同容器拖拽排序只改变显示顺序,不改变 App 与标签的归属关系。
- 跨容器移动、Option 复制、拖空白移除、Apple 内置保护继续走原有逻辑。
- 排序变化纳入分类方案 fingerprint,自动上一方案、导出导入、备份恢复都会包含排序字段。
关键文件
src/Apptag/DataLayer.swift
src/Apptag/AppGridCollectionView.swift
src/Apptag/AppDragCoordinator.swift
src/Apptag/ContentView.swift
src/Apptag/AppLibraryController.swift
src/Apptag/SmartCategorization/SmartStartService.swift
src/Scripts/app_ordering_data_qa.sh
QA 结果
bash Scripts/app_ordering_data_qa.sh:通过。
bash Scripts/macos14_availability_typecheck_qa.sh:通过。
bash Scripts/macos14_build_metadata_qa.sh:通过。
bash Scripts/quick_search_app_name_qa.sh:通过。
bash Scripts/quick_search_system_app_qa.sh:通过。
bash Scripts/smartstart_catalog_resource_qa.sh:通过。
bash Scripts/window_logic_qa.sh:通过。
代码复审处理
- 复审发现同容器排序拖拽贴近源容器边缘释放时,可能落入旧的“拖到空白移除标签”路径;已改为识别最近同容器排序区域并取消该类 near-edge empty drop。
- 复审发现 Apple 内置容器同容器 no-op / Option drop 会误触发保护提示;已在 AppGrid 层消费同容器 drop,并在
ContentView.dropApp 增加同源同目标 no-op 防线。
- 文档引用统一使用 Git 跟踪的
docs/7.90 路径,避免大小写敏感环境出现断链。
Scripts/app_ordering_data_qa.sh 已补充对应静态门禁。
风险与边界
- 第一版只做同容器排序,不做跨容器插入式重排。
- 排序 key 不依赖当前语言显示名,语言切换不会改变顺序归属。
- 新安装或新扫描到、未出现在排序字段里的 App 会追加到已排序 App 后面,并按原有默认名称排序。
- GUI 真实手感仍需要用户用 DMG 或本机构建做最终体验验收,重点看拖拽插入线是否符合预期。