ek-ui 0.2.5

ek 生态常驻主界面(egui/eframe):插件即界面——观测页 + 日志页,车头与 UI 同插件
Documentation
# ek-ui

ek 生态的常驻主界面 crate(DV-1:egui/eframe 0.33)。**UI 即插件**:观测窗不是宿主外壳,
与 `dm`/`oms`/`sim`/`ctp` 同列的一个插件——总线面收事件维护共享快照,eframe 窗口面只读渲染。

**零配置口径(2026-10-17 定盘)**:ek-ui 不读任何配置文件,界面本身无设置;
宿主侧同样不预读配置。插件结构只由 `--from` 清单或 demo 缺省决定。需要配置的
插件(唯一 = ek-ctp 虚拟账号),配置面长在插件自身——菜单「网关」弹窗提供
**手工输入位**(9 格,密码掩码;无订阅字段),经 ask `ctp.configure` 进插件
(ek-ctp 自带配置口:0.3.0 引入,0.5.0 补 configure 强制重连);宿主与界面都不代读、不转发。
实连 CTP 需 `--features ctp-native`(默认关,日常构建不碰 C++)。

**界面框架(v4,BD-UI-27/28;0.2.0 BD-UI-31 体验轮;0.2.2 BD-UI-32 字号与独立窗)**:
全局字号 16px 面(apply_ui_style);菜单栏(运维|网关|查询合约
一键直达弹窗,帮助保留菜单)→ 行情带(全宽、无题字,tick 唯一源,按交易所二级
tab,单击行带入下单面板,双击行弹 K线窗)→ 交易带(左下单面板无题字 9 字段 +
「自动开平」勾选 + 委托/全撤 + 盘口无题字;右 2×2 监控格「委托|未成交」「成交」「持仓」
「资金|日志」,列面逐值抄录 Python 蓝图:委托 17 列含名称/交易所/类型/来源,
成交 12 列(方向上色),持仓 16 列;撤单 = 行钮或双击委托行);全表行选中跳色
(行内任意格单击 = 选中,悬停淡底,每表一行;行情带选中 = 当前合约;行情带
盘口四列带入带方向:买1 价/量 → 卖,卖1 价/量 → 买,价格列顺带填价,其余列
方向保持默认)——
查询合约窗与 K 线窗是**独立 OS 窗**(原生最小化/最大化/关闭,可拖出主窗放
屏幕任意处;不支持多窗的后端自动回退主窗内弹窗);运维/CTP 窗同为独立 OS 窗
(BD-UI-33 四窗一型),都不占主界面 tab。默认窗 1280×860。
**薄下单者(0.1.1,BD-UI-30)**:下单/撤单不直发网关——全部走 `oms.submit_order`
五段管线(拆单/风控/逐腿发送/记账)与 `oms.cancel_order`(守卫不可绕过);
「自动开平」勾选 = 拆单四态的 Auto/None 逐请求开关(风控与守卫不可旁)。
**订阅两入口(订阅不在网关窗定死)**:下单面板代码框回车即订阅(带 `EX.` 前缀
自动剥成裸码);菜单「查询合约」
弹窗(查询框留空 = 全部 + 勾选 + 订阅选中)。合约流由 ek-ctp 登录后自动查询,
UI 只收不催。

**中文渲染(BD-UI-26)**:启动时自动从系统字体目录装载 CJK 回退字体
(simhei 等,**只收纯 .ttf/.otf**);装载证据行 stderr 可 grep
(`[ek-ui] CJK 回退字体已装载: <path>`)。候选全空时中文显形为豆腐块并
在 stderr 警告——属环境侧字体缺失,非界面缺陷。

## 快速开始

```powershell
cargo run            # 无参:dm + oms + sim + ui demo 窗(开窗即见交易监控闭环演示)
cargo run -- --pick  # 启动器:勾选插件 → 写清单 → spawn 子进程 → boot-wait
```

```rust
use ek_station::StationConfig;
let mut cfg = StationConfig::demo(); // = dm + oms(不含 sim)
cfg.plugins.push("sim".into()); // 纸面网关(直接走 StationConfig::demo() 时必须自推;
                                // ek-ui 无参路径的 demo_cfg() 已内置这一推)
cfg.plugins.push("ui".into());
ek_ui::run_station_ui(&cfg, &ek_ui::runtime::RunOpts::plain())?;
```

launcher 协议(bin级):`ek-ui --from <清单> --ready-file <标记>`,start 成功即写
`ready\n`;`ek-station --from ...` 同 mate(清单由 `--pick` 窗生成)。
`ek-ui --pick` 走选窗 → 工作线程 spawn(30s 就绪上限;失败退 2,成功子进程分离脱管)。

## 自动化测试(S1b 起,人工核查 0 项)

- L1:`tests/ui_state.rs` —— 环形日志/快照/revision/停止位(线程面状态机)。
- L2:`render_body(ctx, &UiShared)` 单渲染入口(真实 App 与测试共用;面板组合
  在入口内,BD-UI-29:菜单/行情带 TopBottomPanel + 下单侧栏 SidePanel +
  CentralPanel 2×2 格 + 弹窗最后)。
- L3:`tests/ui_kittest.rs`(19 钉)—— `egui_kittest` 官方建构(ctx 级 `build`,
  render_body 自开顶层面板):AccessKit 节点断言、
  `清空日志` 就地交互、下单面板入列(委托钮/坏价红字/全撤扇出)、代码框回车
  订阅(s20:focus+type_text+key_press 全链)、委托行双击撤单(s11:建构用
  `with_step_dt(0.1)`,kittest 每事件一帧口径,BD-UI-28⑥)、行情带单击带入
  下单面板、查询合约窗勾选订阅、菜单开窗(运维/网关/查询合约)、行情带 tab
  切换、静态布局首帧快照(s3 含 BD-UI-29 结构钉:右列贴边不裁切/底行沉底
  无死区/侧栏在左/两列等宽随窗分配)与满表视觉钉 s21(委托 17/成交 12/
  持仓 16 列,布局泄漏与列面回归即快照 diff 爆红;`tests/snapshots/`,
  1280×860 基线,更新基线用
  `$env:UPDATE_SNAPSHOTS='true'` 后跑 `cargo test`;点击一律 `click_accesskit`
  (坐标点击只打可见钮,横向滚动面外控件用 AccessKit 动作),建构面统一
  `harness_for()` 实窗尺寸,见 BD-UI-23/27/28/29)。
- 装配链:`tests/ui_runtime.rs` —— ui 工厂可装配、eTimer 1s 快照回路、
  关窗协议(stop 位 → 观察线程 close_all → 全体 on_stop)。
- 行情面:`tests/ui_market.rs` —— DM 金样本回放逐位、回灌闭环(帧统计三钉)。
- 交易面:`tests/ui_sim.rs`(9 钉)—— 撮合金样本(FIFO/手数排队/双向/市价/撤单/拒单)、
  全链闭环 eTick→DM→eBar→Sim→eOrder/eTrade→ePosition→OMS→监控页帧逐位、
  流控计数与超限拒绝(u7:1s 窗第 7 笔被拒、被拒不进 oms)、tick_store/
  contract_store 总线落库(u8/u9)、tick/bar 预算与 bar 单调守卫(u5/u6)。
- 运维面:`tests/ui_ops.rs` —— 命令队列往返/两步确认/检疫检测(u0–u2)+
  移除重启环与未知工厂拒装(t0/t1)。
- 启动器:`tests/launch.rs` + `tests/pick_ui.rs` —— spawn/ready 协议、退出码、
  选窗勾选写清单与派生。
- 字体面:`src/fonts.rs` 单测 f0(22 常用汉字 has_glyph)+ kittest s16 汉字密集页
  快照(BD-UI-26 乱码根因钉;无 CJK 候选环境显形失败,属设计)。
- CTP 配置面:`tests/ui_ctp.rs` —— ui→ask `ctp.configure`/`ctp.subscribe` 总线
  闭环(空地址守卫日志、服务目录 5 口、校验拒面、ctp 不在场失败不炸链)+
  kittest s13(手工表单入列逐位、窗面无订阅字段口径)。
- CTP 实连(手工):`tests/ui_ctp_live.rs` —— `--features ctp-native` + `--ignored`
  才跑;12 步全流程(判据三态 PASS/OBSERVE/FAIL,账号 env 手工注入)。

## 门禁

```powershell
powershell -ExecutionPolicy Bypass -File scripts/gate.ps1
```

五闸:fmt --check / test / clippy -D warnings / doc / check-package(strict)。

## 依赖纪律

ek 生态件一律 crates.io 装版引用(运行时七件直接依赖:core/event/data/dm/ctp/oms/station;
0.1.1 起运行时还经 station 传递吃到第八件 ek-risk 0.1.x(风控三闸装配,见 CHANGELOG);
dev-dep converter 0.1.1 已随 0.1.1 退役——拆单器入驻 oms 管线,见 CHANGELOG);
三方库只在本 crate(eframe = egui = egui_kittest = 0.33.3 四件套锁定,见 DESIGN BD-UI-7)。
remote 授权(2026-10-17 建仓):`https://cnb.cool/enkeep/ek-ui`(本仓)与
`https://cnb.cool/enkeep/ek-station`;此前为纯本地提交(方案 §3 双启动矩阵:
ek-dm 同域纪律)。