背景
PR #174 (feat(core): 绘图交互硬化) 已成功将 fork 侧验证的绘图交互能力(OHLC 磁吸、locked 强制语义、Shift 多选、hitTestAt 与编辑路径磁吸)下沉至核心引擎层。
由于该 PR 严格遵循“纯引擎改动”原则,未包含任何宿主或 UI 层的接入代码,导致当前上游呈现“引擎能力就绪,但界面无入口”的状态。开发者无法直接在 <KLineChart> 组件上进行可视化操作或手工测试,必须依赖自定义宿主或控制台指令触发。
本 Issue 旨在系统性地登记上述能力缺口,作为后续任务拆分、UI 接入及架构决策的追踪清单。当前评估基于 PR #174 分支(head 2cba8a7f)的工作区状态。
A. 宿主层接入缺口 (引擎已就绪,亟待 UI 消费)
以下功能在引擎层已实现,但缺乏宿主层的调用入口或 UI 控件。
| 编号 |
缺失功能 |
当前现状 / 证据 |
补齐行动项 (Action Item) |
| A1 |
磁吸模式切换入口 |
DrawingInteractionController.setMagnetMode 全仓库无调用点;左侧工具栏 (LeftToolbar.vue) 缺失对应控件。 |
在工具栏新增 off / weak / strong 档位开关,并绑定对应 API。 |
| A2 |
磁吸修饰键交互提示 |
Ctrl/Cmd 临时取反与 Shift 互斥逻辑仅在引擎层实现,UI 层缺乏用户引导。 |
在磁吸开关旁补充 Tooltip 或状态栏文案说明。 |
| A3 |
图元锁定/解锁操作入口 |
locked 属性目前仅能通过底层 API (updateBatch / updateDrawing / 导入配置) 写入。 |
在右键菜单或属性面板中新增锁定/解锁的可视化操作入口。 |
| A4 |
橡皮擦与对象树 Hover 支持 |
hitTestAt 接口目前无任何调用点。 |
宿主层接入 hitTestAt,或补充对象树/橡皮擦的 UI 交互逻辑。 |
| A5 |
分步绘制状态提示 |
getAnchorCountForTool 及锚点数表已从引擎导出,但 UI 层未消费(此前由宿主自行维护副本)。 |
在绘制过程中接入该数据,展示“第 n / N 次点击”的进度提示。 |
| A6 |
填充样式 (Fill) 控件 |
DrawingStyleToolbar.vue 目前仅支持颜色、线宽、线型与删除操作,缺失 fill 与 fillOpacity 控件。 |
补充填充控件(注:引擎层 getBatchStyleKeys 已确保对全通道类集合无条件包含 fill 键)。 |
| A7 |
公共 API 暴露规范 |
hitTestAt 与 setMagnetMode 仅存在于 DrawingInteractionController 内部,ChartController 未暴露,useDrawingManager 亦非公开导出。 |
需决策是否将其提升至 ChartController 公共接口层(见下方“待拍板”)。 |
B. 引擎层能力缺口 (PR 未覆盖或明确延后)
以下功能在当前 PR 中未完全覆盖,或基于设计考量被明确延后,需持续追踪。
| 编号 |
缺失功能 |
当前现状 / 证据 |
备注 / 影响 |
| B1 |
水平/垂直线整线拖拽的磁吸 |
设计文档已明确:整线拖拽采用位移增量语义,暂不吸附。 |
属后续任务,需先行定义 delta 到 snap 的映射语义。 |
| B2 |
锁定图元的标签编辑未拦截 |
DrawingInteractionController.getLineLabelTarget (packages/core/src/engine/drawing/interaction.ts:167-182) 的候选列表未过滤 locked 状态。 |
存在锁定语义漏洞,锁定的线或区域标签仍可被 hover 并触发编辑。 |
| B3 |
未来区域 (Future Area) 的磁吸行为 |
磁吸 X 轴无条件吸附至 Bar 中心并夹取到有效 Bar 范围,导致最后一根 K 线右侧的落点被强制拉回,丢失 futureOffset。 |
属设计取舍,需确认当前行为是否符合产品预期。 |
| B4 |
框选 (box-select) 模式下的 Shift 多选 |
Shift 多选逻辑目前仅在 cursor 分支 (handleCursorDown) 生效。 |
需根据产品实际需求评估是否扩展至框选模式。 |
待拍板决策 (需架构/产品确认)
- API 暴露边界 (对应 A7)
上述交互能力是应统一收敛至 ChartController 作为公共接口暴露,还是保持现状,仅允许高级宿主自行实例化或访问 DrawingInteractionController?
- 锁定语义与未来区域行为 (对应 B2 / B3)
- 锁定状态 (
locked) 是否应严格拦截所有交互,包括标签的 Hover 与编辑?
- 未来区域(最后一根 K 线右侧)是否允许磁吸?若允许,如何兼容
futureOffset 的偏移量计算?
验收标准 (Definition of Done)
- 交互闭环:A1 至 A6 每一项补齐后,必须能够在上游
<KLineChart> 组件上直接进行手工测试,无需依赖自定义宿主或控制台指令。
- 测试覆盖:引擎侧的任何补充改动必须配套相应的单元测试;涉及视觉或交互行为的变更,必须补充视觉回归或行为回归测试。
- 文档同步:A1 至 A6 任一项合入主分支后,需同步更新对应手工测试步骤与相关用户文档。
背景
PR #174 (
feat(core): 绘图交互硬化) 已成功将 fork 侧验证的绘图交互能力(OHLC 磁吸、locked 强制语义、Shift 多选、hitTestAt 与编辑路径磁吸)下沉至核心引擎层。由于该 PR 严格遵循“纯引擎改动”原则,未包含任何宿主或 UI 层的接入代码,导致当前上游呈现“引擎能力就绪,但界面无入口”的状态。开发者无法直接在
<KLineChart>组件上进行可视化操作或手工测试,必须依赖自定义宿主或控制台指令触发。本 Issue 旨在系统性地登记上述能力缺口,作为后续任务拆分、UI 接入及架构决策的追踪清单。当前评估基于 PR #174 分支(head
2cba8a7f)的工作区状态。A. 宿主层接入缺口 (引擎已就绪,亟待 UI 消费)
以下功能在引擎层已实现,但缺乏宿主层的调用入口或 UI 控件。
DrawingInteractionController.setMagnetMode全仓库无调用点;左侧工具栏 (LeftToolbar.vue) 缺失对应控件。locked属性目前仅能通过底层 API (updateBatch/updateDrawing/ 导入配置) 写入。hitTestAt接口目前无任何调用点。hitTestAt,或补充对象树/橡皮擦的 UI 交互逻辑。getAnchorCountForTool及锚点数表已从引擎导出,但 UI 层未消费(此前由宿主自行维护副本)。DrawingStyleToolbar.vue目前仅支持颜色、线宽、线型与删除操作,缺失fill与fillOpacity控件。getBatchStyleKeys已确保对全通道类集合无条件包含fill键)。hitTestAt与setMagnetMode仅存在于DrawingInteractionController内部,ChartController未暴露,useDrawingManager亦非公开导出。ChartController公共接口层(见下方“待拍板”)。B. 引擎层能力缺口 (PR 未覆盖或明确延后)
以下功能在当前 PR 中未完全覆盖,或基于设计考量被明确延后,需持续追踪。
DrawingInteractionController.getLineLabelTarget(packages/core/src/engine/drawing/interaction.ts:167-182) 的候选列表未过滤locked状态。futureOffset。handleCursorDown) 生效。待拍板决策 (需架构/产品确认)
上述交互能力是应统一收敛至
ChartController作为公共接口暴露,还是保持现状,仅允许高级宿主自行实例化或访问DrawingInteractionController?locked) 是否应严格拦截所有交互,包括标签的 Hover 与编辑?futureOffset的偏移量计算?验收标准 (Definition of Done)
<KLineChart>组件上直接进行手工测试,无需依赖自定义宿主或控制台指令。