Files
oak-editor/docs/zh/plans/ui-redesign-plan.md
T
Mike-Solar c486c853ff docs: C ABI migration campaign plans, handoffs and roadmap
Complete documentation set for the facade migration (B1-R6) and beyond:
facade-migration-roadmap, handoffs v3-v6, R5 guides, R6 cleanup plan,
R7 pure-ABI plan, long-term plans (riir/ai-agent/gtest/ui-redesign),
updated Chinese README draft, UI design mockups, and the Google Test +
struct-typedef rules in CONTRIBUTING.
2026-07-26 22:42:44 +08:00

214 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Oak 主界面 UI 改版计划
> 本文是主界面重新设计的执行手册,面向 DeepSeek Flash**不识字图,本文全部
> 用文字精确定义目标形态**)。详细程度对齐 `../r5-app-migration-guide.md`。
> 工作分支:`c-abi-migration`。**启动前提:R5C ABI app 侧迁移)验收完成之
> 后**;启动后可与 Google Test 统一迁移并行——协调规则见 §2。
> 依据:`design/Oak-UI设计图-主界面-标注版.png`、`...-效果栈版.png`、
> `...-节点编辑器版.png`(共 10 项关键改动,本文逐项落地)。
---
## 1. 目标布局(文字定义,照此实现)
```
┌ 菜单栏:文件(F) 编辑(E) 视图(V) 回放(P) 序列(S) 窗口(W) 工具(T) 帮助(H)
├ 工具条(31px):14 个工具图标 + 吸附开关 + 缩放滑块 + 轨道高度滑块
├────────────────────────────────────────────────────────────────────
│ 素材查看器(源) │ 序列查看器(节目) │ 检查器│历史记录
│ ·适合/安全框 │ ·适合/安全框 │ ┌──────────────────┐
│ ·独立走带控制 │ ·节点编辑器(同组切换)│ 媒体 · xxx.mp4 │
│ ·1920×1080·25FPS │ ·分辨率·帧率信息 │ ▼ │
│ │ │ ≡ 变换 ✓ ×(卡片) │
│ │ 26px电平条(右缘) │ ≡ OCIO LUT ✓ ×(卡片)│
│ │ │ [+ 添加效果] │
│ │ │ └──────────────────┘
├────────────────────────────────────────────────────────────────────
│ 时间线(全宽贯通) │
│ 轨道头180px │ 轨道区 │
│ V2 视频轨道1 [锁定][显示] ████████ │
│ V1 视频轨道0 [锁定][显示] ████████████ │
│ A1 音频轨道0 [锁定][静音][独奏] ▁▂▃▅▂▁ │
│ A2 音频轨道1 [锁定][静音][独奏] ▁▂▁▃▂▁ │
├────────────────────────────────────────────────────────────────────
│ 状态栏:就绪 | 缓存:已启用 | 代理:关 | 自动保存:3分钟前 || 时间码/时长 | 25FPS | 1920×1080
└────────────────────────────────────────────────────────────────────
```
节点编辑器视图(与序列查看器同组切换、占中央最大面板):
```
┌ 节点编辑器(中央最大面板)
│ [+] [-] [适配] ┌ 检查器(同效果栈) ┐
│ ┌ 第一稿.mp4[视频] · 00:00:00:0000:04:18:18 ┐ │ │
│ │ [媒体]→[变换]→[OCIO LUT]→[输出] │ │ │
│ └───────────────────────────────────────┘ │ │
│ ┌ 第一稿.mp4[音频] · 00:00:00:0000:04:18:18 ┐ │ │
│ │ [媒体]→[音量]→[输出] │ │ │
│ └───────────────────────────────────────┘ │ │
│ ┌ 小地图 ┐ │ │
└────────────────────────────────────────────────────────────────────
```
**核心原则:效果栈(检查器)与节点图是同一份节点数据的两种视图**——检查器按
「媒体 → 变换 → OCIO LUT → 输出」自上而下线性排卡片;节点编辑器把同一份数据
画成图。默认用户像传统软件一样在检查器里线性工作,需要分支合成时切到节点
编辑器。
## 2. 执行前提与并行协调
### 2.1 执行前提:R5 验收完成后启动
**本计划在 R5(C ABI app 侧迁移)验收完成之前不启动。** 这不是保守,是
依赖关系:
- WP4(检查器·效果栈)落在 `app/widget/nodeparamview/`、WP2(时间线轨道
头)落在 `app/widget/timelinewidget/`、WP5(节点编辑器移位)落在
`app/widget/nodeview/`——这些都是 R5 符号消除的主战场。R5 先把这些文件
的 engine 调用点换到 facade(行为不变),本计划再在其上做 UI 重构,
面对的才是干净的 facade 边界;提前动手只会和 R5 互相踩踏。
- R5 完成后不存在文件重叠问题,**全部 WP 无需错峰**,按 §4 顺序执行即可。
启动时仍需遵守的红线(R5 的成果,永久有效):
- **禁止**:在本计划里改 `oakengine_*` 签名、新建 engine 命令类、或把
engine 源码再编进 app。
- 全部改动限 **app 侧 UI 代码**`app/`),不加 engine 符号。
### 2.2 与 Google Test 统一迁移(`gtest-migration-guide.md`)的并行协调
**结论:可以完全并行,无错峰要求。** 两份计划的文件域不相交:
| 计划 | 动的文件 |
|---|---|
| UI 改版(本文) | `app/`widget、panel、window、dialog、ts 翻译) |
| GTest 统一迁移 | `tests/``engine/tests/``core/tests/` 及三处测试 CMake |
唯一的接触点与规则:
- **`tests/gtest/`**GTest 迁移明确"不动已有 gtest";本计划 §5 要求新增
UI 逻辑用例,新用例**直接加进 `tests/gtest/` 现有 `olive-gtest` 目标**
不新建测试二进制。两边若同时改 `tests/gtest/CMakeLists.txt`,后提交者
普通三路合并即可(都是追加行,不会语义冲突)。
- **ctest 基线**GTest 迁移的硬门槛是"用例总数只增不减";本计划只**新增**
用例、不删不改旧用例,天然满足。两边都以全量
`ctest --output-on-failure` 绿为提交前提,谁先跑谁后跑无所谓。
- **共享入口约定**:ctest 仍是唯一运行入口(gtest 仅编写框架),本计划
新增用例同样遵守,不引入别的测试框架或独立 runner。
- **已知 flaky**`oak_cli_transcode``oakengine_export_test`
`olive-gtest` 单次失败需单独重跑)是两个计划共同的背景噪音,判定规则
相同:单独重跑一次,连续两次失败才算回归。
## 3. 工作包(WP1WP10,对应设计图 10 项)
### WP1 取消独立「工具」面板 → 31px 工具条
- **现状**`app/panel/tool/tool.{h,cpp}` 是独立停靠面板,~8% 屏幕仅放 14 个图标。
- **目标**:删除该面板;在时间线(`app/widget/timelinewidget/`)上方加一条 31px
工具条,承载 14 个工具图标 + 吸附开关 + 缩放滑块 + 轨道高度滑块。
- **文件**:删/改 `app/panel/tool/``app/widget/timelinewidget/timelinewidget.{h,cpp}`
顶部加工具条;`app/panel/CMakeLists.txt``app/panel/panelmanager.cpp` 注册点。
- **验证**:工具条全部按钮功能与原面板一致;布局保存/恢复无该面板。
### WP2 时间线全宽贯通 + 轨道头 180px
- **现状**:时间线未全宽;轨道头窄,无统一的 显示/静音/独奏/锁定 与 V/A 编号命名。
- **目标**:时间线全宽;轨道头加宽至 180px 贴住轨道;视频轨「显示」、音频轨
「静音/独奏」、统一「锁定」;轨道以 `V2/V1/A1/A2` 编号 + 用途名(与主流 NLE 一致)。
- **文件**`app/widget/timelinewidget/`timelinewidget、trackview、trackviewitem、
timelineview)。**前提:R5 已完成 Track/ClipBlock facade 化,本 WP 在其上重构。**
- **验证**:轨道头控件改变 track 的 lock/mute/solo/show 状态;命名正确;全宽布局。
### WP3 双监看并列(源 + 节目)
- **现状**`app/panel/footageviewer/`(源)与 `app/panel/sequenceviewer/`(节目)分开,
审素材对位需切换标签。
- **目标**:左右并排常显;素材查看器带独立走带控制(transport)。
- **文件**`app/window/mainwindow/mainwindow.cpp` 布局;`app/panel/footageviewer/`
`app/panel/sequenceviewer/`KDDockWidgets 分组/dock 关系)。
- **验证**:两查看器同屏并列;源查看器独立走带;布局可保存/恢复。
### WP4 参数编辑器 → 「检查器·效果栈」
- **现状**`app/widget/nodeparamview/` 是参数编辑器(item 列表 + 标题栏 + 关键帧控件)。
- **目标**:改为「检查器」面板(与「历史记录」同组标签)。自上而下线性排:
「媒体 · xxx.mp4」源卡 + 效果卡(变换、OCIO LUT、音量…)。**卡片规范**:
标题行 = ≡(拖拽排序) ▼(折叠) 名称 ✓(启停) ×(移除);底部「+ 添加效果」即搜即加。
每属性行右侧保留关键帧按钮(现 `nodeparamviewkeyframecontrol`)。
- **文件**`app/widget/nodeparamview/`nodeparamview、nodeparamviewitem、
nodeparamviewitemtitlebar、nodeparamviewdockarea、nodeparamviewwidgetbridge);
新增「检查器」容器/卡片模型。**前提:R5 已完成 Node 大族 facade 化,本 WP 在其上重构。**
- **验证**:卡片折叠/拖拽排序/启停/移除全部生效且写入节点图(undoable);
与节点编辑器视图数据一致;「+ 添加效果」可搜可加。
### WP5 节点编辑器移至中央最大面板 + 缩放/小地图
- **现状**`app/widget/nodeview/` 节点编辑器非中央主区,大图易迷路。
- **目标**:移到中央最大面板(与序列查看器同组切换);新增缩放控件(+/−/适配)
与右下角小地图。
- **文件**`app/widget/nodeview/`nodeview、nodeviewcontext、nodeviewminimap)、
`app/panel/node/``app/window/mainwindow/mainwindow.cpp`。**前提:R5 已完成 Node 大族 facade 化,本 WP 在其上重构。**
- **验证**:节点编辑器占中央;缩放/适配/小地图可用;大图导航不迷路。
### WP6 音频监视器 → 26px 电平条
- **现状**`app/widget/audiomonitor/``app/panel/audiomonitor/` 占一个完整面板。
- **目标**:改为 26px 超薄电平条,贴附在节目查看器右侧常显,释放一个面板。
- **文件**`app/widget/audiomonitor/``app/panel/sequenceviewer/`(宿主)、
`app/panel/audiomonitor/`(去面板化)。
- **验证**:电平条 26px 常显、随播放电平跳动;原面板释放;布局可恢复。
### WP7 新增全局状态栏
- **现状**`app/window/mainwindow/mainstatusbar.{h,cpp}` 仅显示 TaskManager 摘要。
- **目标**:全局状态栏显示:就绪状态、缓存、代理、自动保存时间(左);
当前时间码/时长、帧率、分辨率(右)。
- **文件**`app/window/mainwindow/mainstatusbar.{h,cpp}`、`app/window/mainwindow/
mainwindow.cpp`。
- **验证**:各项信息实时刷新;与序列状态/缓存/代理/自动保存一致。
### WP8 查看器细节
- **现状**:填充条为蓝色;缩放/安全框入口不全;信息芯片不全;有与时间线重复的标尺。
- **目标**:填充条改黑;查看器右上角提供缩放与安全框按钮;信息芯片标注
分辨率与帧率;移除与时间线重复的标尺。
- **文件**`app/panel/footageviewer/`、`app/panel/sequenceviewer/`、
`app/widget/viewer/`viewer、viewerdisplay)。
- **验证**:外观与信息符合 §1 描述;无重复标尺。
### WP9 菜单访问键补全
- **现状**`app/window/mainwindow/mainmenu.{h,cpp}` 的「窗口」无访问键 (W)。
- **目标**:「窗口」加 `(W)`,与系统及其他菜单项一致。
- **文件**`app/window/mainwindow/mainmenu.{h,cpp}`。
- **验证**:菜单访问键完整一致。
### WP10 文案与格式统一
- **现状**:History 未汉化;项目面板日期为英文格式;首选项有英文残留。
- **目标**:History → 历史记录;项目面板日期改 `YYYY-MM-DD HH:mm`(如
`2026-06-03 20:25`);首选项英文残留(Behavior、Enable hover focus、
`1 minute(s)` 等)全部汉化。
- **文件**`app/panel/history/`、项目面板(`app/widget/projectexplorer/`)、
首选项(`app/dialog/preferences/`)、`app/ts/*.ts` 翻译。
- **验证**:文案全部汉化、日期格式统一。
## 4. 执行顺序
R5 已验收完成(§2.1),无错峰约束。建议先做无依赖的布局项热身,再做
重构量大的三个 WP
```
第一波(布局类,互相独立): WP1 → WP3 → WP6 → WP7 → WP8 → WP9 → WP10
第二波(重构类,建议在 R5 facade 化后的干净边界上做):
WP4(检查器)→ WP5(节点编辑器)→ WP2(时间线轨道头)
```
**每 WP 闭环**:现状 grep → 实现 → 全量构建 0 error → 全量 ctest 44/44 绿
(UI 改动不得引入回归)→ 立即提交 → roadmap 补记。
## 5. 测试要求(沿用项目规则)
- 所有测试用 **Google Test**`CONTRIBUTING.md` 已立规)。
- 检查器卡片模型、效果栈↔节点图数据一致性、轨道头控件状态、状态栏信息、
工具条功能:补 Google Test 用例(`tests/gtest/``gtest_discover_tests`)。
- UI 行为改动以现有 `olive-gtest` 不回归为底线;新增可测逻辑(卡片模型、
视图模型)必须有单测。
- 需要显示的用例沿用 offscreen QPA;渲染相关用例沿用 `GTEST_SKIP` 模式。
## 6. 不做
- 不改 `oakengine_*` 公共 API(见 `riir.md` 的 API 冻结保证)。
- 不动 engine 内部实现、不动 R5 的 facade 工作。
- 不重写底层渲染/播放路径;本计划只改 UI 布局、容器与交互。
- 不做 AI 相关 UI(属 `ai-agent-design.md` 范围,另行)。