4.7 KiB
4.7 KiB
ConsolePanel
命名空间: XCEngine::Editor
类型: class
源文件: editor/src/panels/ConsolePanel.h
描述: 编辑器控制台面板,负责显示 EditorConsoleSink 中的日志记录、维护过滤与搜索状态,并组织工具栏、日志列表、详情区与 play mode 错误暂停逻辑。
概述
ConsolePanel 当前已经不是一个“只调两个 helper 就结束”的薄面板。它实际串起了四层内容:
- 日志数据源: 来自 EditorConsoleSink 的记录数组与 revision。
- 本地视图状态: 由 ConsoleFilterState、搜索缓冲、选中 serial、详情区高度和 play mode 标志组成。
- 面板编排: 负责工具栏、日志列表、splitter、详情区和上下文菜单的布局。
- 编辑器协作:
通过
EventBus订阅 play mode 事件,并在需要时发出PlayModePauseRequestedEvent。
因此它更像“Console 工作流容器”,而不只是一个简单的 ImGui 窗口包装器。
生命周期
- Constructor 会把面板标题固定为
"Console"。 - OnAttach 会初始化详情区高度、记录当前 revision,并向
EventBus订阅 play mode 四类事件。 - OnDetach 会注销这些事件订阅。
- Render 会构建完整控制台 UI,并在渲染尾部调用
Actions::ObserveInactiveActionRoute(...)。
当前 Render 流程
按当前 ConsolePanel.cpp 的真实行为,Render() 大致遵循下面的顺序:
- 进入
UI::PanelWindowScope,处理面板可见性。 - 获取 EditorConsoleSink;若 sink 不可用,则直接显示 empty state。
- 读取日志记录与 revision,并在启用
Error Pause时扫描新增 error/fatal 日志。 - 用
ConsoleFilterState + SearchQuery生成可见行集合,并维护当前选中项。 - 绘制工具栏:
ClearCollapseError Pause- source dropdown
- 搜索框
- severity toggle counters
- 绘制日志列表区,支持:
- 选择
- 双击打开源码
- 右键菜单
- Ctrl+C 复制
- 上下方向键切换
- 绘制 splitter 与详情区,展示完整消息、source location、thread、timestamp 和 occurrence count。
- 调用
ObserveInactiveActionRoute(...),保证该面板在未设置显式 action route 时仍能参与统一动作观察。
过滤、搜索与折叠
ConsolePanel 的本地过滤状态当前包括:
ShowLog / ShowWarning / ShowErrorCollapseClearOnPlayErrorPause- 文本搜索缓冲
m_searchBuffer
其中:
- 非折叠模式下,每条
EditorConsoleRecord都会对应一行。 - 折叠模式下,面板会按“等级 + 分类 + 消息 + 文件 + 行号 + 函数”构造 key,把重复日志聚合为单行,并累计
count。 - 搜索匹配不仅检查日志消息,也会把文件路径和函数名纳入 haystack。
Play Mode 事件与 Error Pause
OnAttach() 当前会订阅:
PlayModeStartedEventPlayModeStoppedEventPlayModePausedEventPlayModeResumedEvent
相关行为是:
ClearOnPlay打开时,进入 play mode 会立即清空 sink、重置选择状态。ErrorPause打开且当前未暂停时,Render()会扫描自上次 play mode 边界之后新增的Error/Fatal日志,并发布PlayModePauseRequestedEvent。m_lastErrorPauseScanSerial用来避免重复对旧错误记录再次触发暂停。
当前实现边界
- 当前过滤和搜索状态完全保存在面板实例内,不是跨窗口共享配置。
- source dropdown 当前仍是占位 UI:
Editor选项固定选中Player选项禁用
- 主要渲染逻辑现在直接写在
ConsolePanel.cpp中;ConsoleActionRouter 仍存在,但已不是控制台主渲染路径的唯一承载点。 - 该面板依赖 EditorConsoleSink 的内存日志快照,不是无限日志历史浏览器。
公开方法
| 方法 | 说明 |
|---|---|
| Constructor | 创建名为 "Console" 的面板。 |
| OnAttach | 绑定上下文后的初始化与事件订阅。 |
| OnDetach | 注销 play mode 事件订阅。 |
| Render | 绘制完整控制台 UI。 |