批量方案管理
当你想把“筛选哪些区域、对这些区域做什么”这组批量编辑设置保存下来并在后续会话复用,就把它们存成一个批量方案。方案由名称、匹配条件(match)和动作(actions)三部分组成;这里仅负责方案的列表与新建、复制、重命名、删除,以及自动保存与持久化。匹配条件的字段、运算符与 all/any 逻辑见匹配条件,动作的类型与固定执行顺序见动作与顺序,命中预览、批量写回与从备份恢复见预览、执行与恢复。
适用场景
- 一个方案 = 名称 +
match(logic+conditions)+actions;方案只保存在config/batch_edit_schemes.yaml,不写入config/config.json,也不参与渲染或翻译管线。 - 方案条的“新建 / 重命名 / 复制 / 删除”只管理方案本身;条件行、逻辑下拉框与三类动作卡片是相邻页面的内容,这里仅说明它们作为方案的一部分被保存。
- 批量管理的作用范围跟随主页文件列表:面板底部显示“范围:主页文件列表中的 {count} 个已翻译文件”。文件列表本身在文件列表与输入页管理。
- 方案内容不含密钥或用户私有数据;方案名、条件值与动作字段可能包含业务文本,公开报告前必须脱敏。
在批量管理中操作
查看与切换方案
- 从左侧导航打开“批量管理”页。页面标题为“批量管理”,副标题为“跨主页文件列表匹配区域,批量修改文字、富文本样式与属性”。
- 顶部方案条左侧是“方案:”下拉框,列出所有方案;右侧依次是“新建”“重命名”“复制”“删除”四个按钮。
- 选中某个方案后,下方“匹配条件”“批量动作”和预览区会载入该方案的内容;条件与动作的编辑属于相邻页面。
- 切换方案时,如果当前方案还有未落盘的修改,程序会先停止防抖计时器并保存当前方案,再载入新选中的方案。
- 切回本页时,若没有待保存的修改,面板会重新从磁盘读取方案列表并选中第一项;若有待保存修改则跳过重新读取,避免覆盖内存中的编辑。
新建方案
- 点击“新建”。弹出文本输入框,标题为“新方案”,字段标签为“方案名称”,按钮为“确定”/“取消”。
- 输入名称后回车或点击“确定”。名称会去除首尾空白;空名称等同取消,不会创建方案。
- 名称与现有方案重名时弹出警告“已存在名为“{name}”的方案。”,本次创建中止,需要换一个名称。
- 新方案没有匹配条件和动作,需要先在匹配条件与动作与顺序中补充内容;任何一次保存都会自动写盘。
复制方案
- 选中要复制的方案,点击“复制”。
- 输入框默认名称为“
<原方案名> 2”,字段标签仍为“方案名称”。 - 确认后程序把当前方案的
match与actions深拷贝到新方案,只替换名称,然后切到新方案并保存。 - 复制同样遵守空名称与重名规则;重复复制时默认名可能已经存在,需要手动改名。
重命名方案
- 选中方案,点击“重命名”。输入框默认显示当前名称。
- 确认后只修改名称,条件和动作保持不变,随后保存。
- 重名时弹出同样的“已存在名为“{name}”的方案。”警告并中止。
删除方案
- 选中方案,点击“删除”。
- 弹出确认框“删除方案“{name}”?”,默认按钮为“否”;只有点击“是”才继续。
- 删除前会停掉未触发的自动保存;删除后如果列表为空,面板自动创建一个默认“新方案”。
- 删除方案只影响
config/batch_edit_schemes.yaml,不会删除或修改任何逐图 JSON、备份或翻译结果。
自动保存与状态提示
- 修改条件、动作或逻辑后,面板启动 600 ms 防抖计时器,等待期间不写盘;计时结束后调用一次
save_schemes()整体写回,状态栏显示“已自动保存”。 - 写盘遇到
OSError时状态栏显示“保存失败”加错误信息,不弹窗。 - 切换方案时,未落盘的修改会先写盘;删除确认后,未落盘的修改被丢弃。
- 关闭应用时
shutdown()会先停掉计时器并把待保存修改写盘,再关闭后台服务。
空状态与错误状态
| 触发条件 | 界面表现 | 后续行为 |
|---|---|---|
config/batch_edit_schemes.yaml 不存在 | 首次访问时按内置示例创建文件;下拉框显示示例方案 | 可直接使用,或重命名/删除后得到默认方案 |
| 文件损坏或 YAML 解析失败 | load_schemes() 返回空列表,下拉框临时显示一个“新方案” | 任何一次保存都会把内存列表整体覆盖写回文件 |
| 文件存在但没有任何有效方案条目 | 同上,临时“新方案” | 同上 |
| 名称输入为空或仅空白 | 新建/复制/重命名直接取消,无提示 | 不产生任何写盘 |
| 名称与现有方案重名 | 弹出“已存在名为“{name}”的方案。”警告 | 本次操作中止,需改名 |
| 保存失败(I/O 错误) | 状态栏显示“保存失败: {error}” | 内存列表保留,可重试保存 |
错误信息可能包含本机路径;复制到公开报告前必须脱敏。
方案如何应用
方案的读取、编辑和保存共用同一条数据流:
flowchart TD
A["打开批量管理页\n_load_schemes()"] --> B{"config/batch_edit_schemes.yaml 存在?"}
B -->|否| C["ensure_schemes_exists 写入内置示例方案"]
B -->|是| D["load_schemes() 归一化条目"]
C --> E["下拉框填充方案名"]
D --> E
E --> F{"用户操作"}
F -->|新建 New| G["输入名称:空名取消 / 重名警告"]
F -->|复制 Duplicate| H["默认名 \"<原名> 2\",深拷贝 match 与 actions"]
F -->|重命名 Rename| I["只改名称,条件与动作不变"]
F -->|删除 Delete| J["确认“是”后移除;删空则重建默认“新方案”"]
F -->|修改条件或动作| K["600ms 防抖后整体保存"]
G --> L["save_schemes() 写回 YAML"]
H --> L
I --> L
J --> L
K --> L
L --> M["状态栏“已自动保存”"]
- 读取:
load_schemes()先ensure_schemes_exists()惰性创建文件,再用yaml.safe_load解析;条目经过normalize_scheme():空名称丢弃、非法动作丢弃、actions按set_fields -> replace_text -> rich_text稳定排序。 - 收集:
_collect_scheme()从逻辑下拉框、条件行和三个动作卡片收集数据,enabled恒写为True,再经normalize_scheme()归一化。 - 写回:
save_schemes()用yaml.safe_dump(allow_unicode=True, sort_keys=False, width=120)序列化整个列表,以 UTF-8、LF 换行写入;每次保存都是整体覆盖,不依赖文件原有内容。 - 防抖:
_AUTOSAVE_DELAY_MS = 600,_mark_dirty()在条件或动作变化时启动单次计时器并清空上次预览结果。 enabled字段会被读取保留,但当前 UI 保存时恒为True,批量引擎也不按该字段过滤方案;不要依赖它做启用/停用开关。
限制与注意事项
- 方案文件只服务桌面批量管理页,
batch_edit_schemes.py明确不加入manga_translator/runtime_files.py的启动引导,因此方案不会进入渲染或翻译管线。 - 方案不写入
config/config.json或任何配置模型;它不属于设置页参数。 - 切换、复制、重命名或删除方案不会修改逐图 JSON、
.bak备份或编辑器内存;编辑器冲突与写回时机见预览、执行与恢复。 - 条件或动作被修改后,上一次的命中预览立即作废(表格清空、执行按钮禁用),因为盘上结果已经不可信;预览与执行细节见预览、执行与恢复。
- 方案名会显示在下拉框中,可能包含业务文本;共享截图或日志前需检查方案名、条件值和动作内容。
