跳到正文Skip to content

编辑器布局与文件列表

需要逐页调整翻译结果时,从左侧导航进入编辑器视图。编辑器一次只打开一张“当前页”,右侧文件列表就是这张页面的切换器:添加图片或文件夹、点击行切页、删除行,都会直接改变画布上的内容。这里说明进入编辑器的方式、四块布局分区,以及文件/页面列表的增删、选择、状态与切换流程。

顶栏菜单与常驻控件见工具栏与菜单,画布工具与选区见画布工具与选区,显示模式与排列见显示、对比与排列,左侧区域列表与文本编辑见区域列表与文本编辑,导入导出与回写见导入导出与写回,快捷键见快捷键。主页“翻译界面”的文件列表与编辑器文件列表的关系见文件列表与输入

可以做什么

  • 本页负责编辑器视图的入口、布局分区和右侧文件/页面列表:添加文件、添加文件夹、清空列表、拖放、树形展开、行删除、已翻译/未翻译状态、当前页选择与 A/D 切页。
  • 不负责顶栏三个下拉菜单、常驻控件和五个编辑开关的展开与持久化(归工具栏与菜单);不负责画布缩放、工具与选区(归画布工具与选区);不负责左侧区域列表的内容编辑(归区域列表与文本编辑)。
  • 编辑器文件列表与主页文件列表共享同一套后台扫描服务,但运行时是两份独立列表:主页单项删除不会同步编辑器,只有主页“清空列表”才会清空编辑器。
  • 一次只编辑一张图片;文件列表中的每个图片行就是一张“页”,点击或按快捷键切换的行会立刻加载到画布。

在编辑器中操作

进入编辑器视图

  1. 点击左侧导航底部的“编辑器视图”:只切换视图,不重新加载文件列表;若还没有文件,列表显示空状态提示。
  2. 在“翻译界面”的文件列表中双击任意图片:进入编辑器并直接加载该图片。
  3. 翻译任务完成后,在弹出的“任务完成”确认框中选择“是”:进入编辑器并打开结果对应的原图。该提示只在配置不处于 translate_json_onlytemplategenerate_and_exportcolorize_onlyupscale_onlyinpaint_only 等不兼容模式时显示;replace_translationload_text 模式总是显示。

文件列表为空时显示占位提示;后台扫描期间显示“正在加载文件列表...”;扫描或解析出错时以红色文本显示错误信息。

布局分区

编辑器视图由垂直排列的顶栏和下方横向分割器组成,分割器可拖动调整三块面板宽度。

分区内容布局行为
顶栏“菜单”、“显示模式”、“排列”三个下拉菜单,以及“适应窗口”、“原图不透明度:”两个常驻控件固定高度 56 像素;不随内容滚动
左栏“译文列表”与“属性编辑”两个路由页签;默认显示“属性编辑”最小宽度 280 像素,可拖动;属性编辑含文本、样式、操作与图像编辑区
中心画布 GraphicsView;原图双栏对比预览容器分割器伸展因子为 1,随窗口拉伸;对比预览默认隐藏,开启“显示模式 → 与原图对比(双栏)”后与画布并排
右栏“添加文件”、“添加文件夹”、“清空列表”三个按钮 + 文件树列表宽度 220300 像素;固定不随窗口拉伸

管理文件列表

  1. 点击“添加文件”:弹出系统文件选择器,可多选图片;对话框标题“添加文件到编辑器”是源码中的硬编码中文,文件类型过滤器为 Image Files (...)(来自 IMAGE_FILE_DIALOG_FILTER)。
  2. 点击“添加文件夹”:弹出支持多选的文件夹选择器,选中后递归扫描文件夹内的全部支持图片并加入列表。
  3. 点击“清空列表”:移除全部文件、清空画布并释放图片缓存。
  4. 直接把文件或文件夹拖放到列表:等价于“添加文件/添加文件夹”。
  5. 每一行显示:40×40 缩略图(未就绪时用文件夹/压缩包/文档图标代替)、文件名、状态点与“已翻译”/“未翻译”、行尾 × 删除按钮。文件夹节点可展开为树,子图片同样按已翻译/未翻译着色。
  6. 点击图片行:该行成为当前页并加载到画布;点击文件夹行只展开/收起,不切页。

选择与切换页面

  • 点击图片行切换页面;画布获得焦点时按 A / D 可切换到上一张 / 下一张(焦点在文本框时 A / D 被当作文字输入,见快捷键)。
  • 切换前如果有未保存的编辑:
    • “切图时自动导出”开启(默认):先自动导出当前页,导出被拒绝则中止切图;
    • 关闭:弹出“未保存的编辑”三按钮对话框,可“导出图片”(导出完成后继续切图)、“不保存”(丢弃后切图)或“取消”(留在当前页)。这三个按钮文字是源码中的硬编码中文,不随语言切换。

修改如何保存

文件快照与后台扫描

  • 文件列表由 FileListDataService 在后台线程构建不可变快照(FileCatalogSnapshot),GUI 线程只接收结果;扫描期间列表进入加载状态,取消或清空会递增代号并丢弃过期快照。
  • 编辑器使用快照的 images_only() 投影:递归保留图片和文件夹节点,过滤掉压缩包节点;压缩包(.pdf.epub.cbz.cbr.zip)在主页文件列表中可见,但不会进入编辑器的页面列表。
  • 支持的图片扩展名来自 manga_translator/image_formats.py#SUPPORTED_IMAGE_EXTENSIONS.png.jpg.jpeg.jfif.webp.avif.bmp.tiff.tif.heic.heif
  • 排序使用文件名自然排序(数字段按数值比较,其余按大小写折叠的文本比较)。
  • 缩略图按可见行异步加载(40×40,QImageReader 优先、PIL 兜底),结果缓存在内存中(上限 200 项);行数据只来自内存快照,不在 GUI 线程访问磁盘。
  • 图片行是否显示“已翻译”由该文件是否关联到 *_translations.json 元数据(json_path)决定,不是由图片内容决定。

页面加载与切换流程

flowchart TD
    A["文件列表选中图片行<br/>点击或 A / D 快捷键"] --> B["提交视图层草稿<br/>commit_pending_edits"]
    B --> C{"有未保存的编辑?"}
    C -->|否| D["do_load_image<br/>加载原图与区域到画布"]
    C -->|是| E{"切图时自动导出?"}
    E -->|是| F["自动导出当前页"]
    F -->|被拒绝| X["中止切图,留在当前页"]
    F -->|成功| D
    E -->|否| G["未保存的编辑对话框<br/>导出图片 / 不保存 / 取消"]
    G -->|导出图片| H["等待导出完成"] --> D
    G -->|不保存| D
    G -->|取消| X

首次添加文件且列表为空时,load_first 标记会让第一张图片在快照就绪后自动加载;从主页双击文件或从“任务完成”进入时,则按目标路径加载。每次加载前还会提交浮动编辑器防抖期内的草稿,避免刚打完字就切页丢失内容。

删除与清空

  • 点击行尾 × 删除:先从视图移除,再把该路径加入排除集合(文件夹加入 excluded_folders,图片加入 excluded_files),后台重建快照后保持删除结果;删除的正是当前页时,画布状态会被清空。
  • “清空列表”:取消后台扫描、清空源路径与排除集合、清空画布状态并释放图片缓存。
  • 主页“翻译界面”清空文件列表时,主窗口会同步调用编辑器的 clear_list();主页单项删除不会同步编辑器的文件列表,但如果删除的正是当前加载的图片(或包含它的文件夹),编辑器会清空画布状态。

限制与注意事项

  • 编辑器文件列表独立于主页列表,因此同一文件在元数据刷新后,“已翻译”状态与主页缩略图列表可能短暂不一致;快照重建后重新一致。
  • 切页自动导出依赖导出队列:自动导出被拒绝会中止切图;手动选择“导出图片”时切图会等待导出完成。导出细节见导入导出与写回
  • 文件列表只把图片行作为页面;压缩包与不支持扩展名的文件不会出现在编辑器页面列表,不能作为编辑器页面打开。
  • 未翻译的图片可以正常加载到画布编辑,仅记录日志警告;再次运行翻译生成 JSON 后,行状态会变为“已翻译”。
  • 空列表、加载中、错误三种列表状态分别显示占位提示、加载文字和红色错误信息;语言切换只刷新“已翻译/未翻译”等 locale 文案,占位与加载提示因缺 key 不刷新。
  • 左栏默认显示“属性编辑”;切到“译文列表”页签会先刷新待提交的区域编辑,防止列表行与画布数据不一致。