Files
XCEngine/docs/api/XCEngine/Editor/panels/ConsolePanel/ConsolePanel.md

4.7 KiB
Raw Blame History

ConsolePanel

命名空间: XCEngine::Editor

类型: class

源文件: editor/src/panels/ConsolePanel.h

描述: 编辑器控制台面板,负责显示 EditorConsoleSink 中的日志记录、维护过滤与搜索状态,并组织工具栏、日志列表、详情区与 play mode 错误暂停逻辑。

概述

ConsolePanel 当前已经不是一个“只调两个 helper 就结束”的薄面板。它实际串起了四层内容:

  1. 日志数据源: 来自 EditorConsoleSink 的记录数组与 revision。
  2. 本地视图状态: 由 ConsoleFilterState、搜索缓冲、选中 serial、详情区高度和 play mode 标志组成。
  3. 面板编排: 负责工具栏、日志列表、splitter、详情区和上下文菜单的布局。
  4. 编辑器协作: 通过 EventBus 订阅 play mode 事件,并在需要时发出 PlayModePauseRequestedEvent

因此它更像“Console 工作流容器”,而不只是一个简单的 ImGui 窗口包装器。

生命周期

  • Constructor 会把面板标题固定为 "Console"
  • OnAttach 会初始化详情区高度、记录当前 revision并向 EventBus 订阅 play mode 四类事件。
  • OnDetach 会注销这些事件订阅。
  • Render 会构建完整控制台 UI并在渲染尾部调用 Actions::ObserveInactiveActionRoute(...)

当前 Render 流程

按当前 ConsolePanel.cpp 的真实行为,Render() 大致遵循下面的顺序:

  1. 进入 UI::PanelWindowScope,处理面板可见性。
  2. 获取 EditorConsoleSink;若 sink 不可用,则直接显示 empty state。
  3. 读取日志记录与 revision并在启用 Error Pause 时扫描新增 error/fatal 日志。
  4. ConsoleFilterState + SearchQuery 生成可见行集合,并维护当前选中项。
  5. 绘制工具栏:
    • Clear
    • Collapse
    • Error Pause
    • source dropdown
    • 搜索框
    • severity toggle counters
  6. 绘制日志列表区,支持:
    • 选择
    • 双击打开源码
    • 右键菜单
    • Ctrl+C 复制
    • 上下方向键切换
  7. 绘制 splitter 与详情区展示完整消息、source location、thread、timestamp 和 occurrence count。
  8. 调用 ObserveInactiveActionRoute(...),保证该面板在未设置显式 action route 时仍能参与统一动作观察。

过滤、搜索与折叠

ConsolePanel 的本地过滤状态当前包括:

  • ShowLog / ShowWarning / ShowError
  • Collapse
  • ClearOnPlay
  • ErrorPause
  • 文本搜索缓冲 m_searchBuffer

其中:

  • 非折叠模式下,每条 EditorConsoleRecord 都会对应一行。
  • 折叠模式下,面板会按“等级 + 分类 + 消息 + 文件 + 行号 + 函数”构造 key把重复日志聚合为单行并累计 count
  • 搜索匹配不仅检查日志消息,也会把文件路径和函数名纳入 haystack。

Play Mode 事件与 Error Pause

OnAttach() 当前会订阅:

  • PlayModeStartedEvent
  • PlayModeStoppedEvent
  • PlayModePausedEvent
  • PlayModeResumedEvent

相关行为是:

  • 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。

相关文档