4.5 KiB
ProjectActionRouter
命名空间: XCEngine::Editor::Actions
类型: header-helper
源文件: editor/src/Actions/ProjectActionRouter.h
描述: Project 面板交互路由 helper,负责资源拖拽载荷、资源打开、返回上级导航、背景清选和项目项右键菜单目标建立。
概述
ProjectActionRouter 当前不是一个“大而全的项目面板行为中心”,而是一组比较薄的交互 helper。
它的职责边界和 ProjectPanel / ProjectCommands 的分工很明确:
ProjectPanel负责目录树、面包屑、资源网格和上下文菜单的具体布局ProjectActionRouter负责把少量通用交互翻译成稳定动作ProjectCommands负责真正修改项目内容
因此当前这页不应再描述成“承载创建文件夹弹窗、重命名、复制粘贴等完整资源 workflow”。那些语义如今主要已经在面板层和命令层展开了。
当前覆盖的能力
按 editor/src/Actions/ProjectActionRouter.h 当前实现,这组 helper 主要覆盖:
- 资源拖拽 payload 协议
- 判断某个资源是否正处于拖拽中
- 打开资源
- 工具栏返回上级导航
- Project 背景左键清选
- Project 空白区右键菜单请求
- Project 资源项右键菜单目标记录
关键 helper
拖拽载荷
当前项目资源拖拽协议固定为:
ProjectAssetPayloadType() -> "ASSET_ITEM"
拖拽数据本身不是 AssetItemPtr,而是:
item->fullPath.c_str()
也就是说,当前 Project 拖拽协议使用的是“资源全路径字符串载荷”,而不是对象指针。
这和 Hierarchy 里的实体拖拽不同,也更适合项目资源这种需要跨刷新定位的对象。
相关 helper 包括:
GetDraggedProjectAssetPath()IsProjectAssetBeingDragged(item)BeginProjectAssetDrag(item, iconKind)
打开资源
OpenProjectAsset(...) 当前只是一个薄封装:
- 先调用
Commands::CanOpenAsset(item) - 合法时再调用
Commands::OpenAsset(context, item)
因此“什么资源可以打开”的判定权并不在 action router,而在命令层。
返回上级
DrawProjectNavigateBackAction(...) 当前负责:
- 基于
projectManager.CanNavigateBack()计算按钮是否启用 - 点击后调用
projectManager.NavigateBack()
这是 Project 工具栏里少量直接在 action 层完成的导航动作之一。
背景清选
HandleProjectBackgroundPrimaryClick(...) 的当前语义是:
- 只有窗口悬停
- 左键点击
- 当前没有悬停任意 item
- 当前不处于 rename 状态
时,才调用:
projectManager.ClearSelection()
这让 ProjectPanel 可以在“空白处点一下取消选中”和“行内重命名期间不要误清选”之间保持一致行为。
右键菜单目标
当前 router 提供了两组与上下文菜单相关的 helper:
RequestProjectEmptyContextPopup(...)HandleProjectItemContextRequest(...)
前者只负责在空白区域右键时请求 popup;后者则会:
- 先把该项设为当前选中资源
- 再把它写入
TargetedPopupState<AssetItemPtr>
这样项目项右键菜单在打开时,选择状态和 popup target 是同步的。
当前没有负责什么
为了避免和旧文档混淆,需要明确当前这组 helper 不 负责:
- 资源重命名提交
- 创建文件夹 / 创建材质
- 删除资源
- 移动资源到目录
- 复制路径
这些行为如今分别在:
中完成。
设计说明
当前 ProjectActionRouter 的设计取向是合理的,因为它只保留那些真正适合抽成共享交互协议的部分:
- 拖拽 payload
- 打开资源入口
- 背景清选
- 右键菜单目标建立
而把更强业务语义留给 ProjectPanel 和命令层。这比把所有资源 workflow 都堆进一个 router header 更容易维护。
当前限制
- 当前动作层本身不提供资源复制 / 粘贴协议。
iconKind参数在BeginProjectAssetDrag(...)里当前没有实际参与绘制,拖拽预览被关闭。- 这组 helper 仍然假设调用点位于 Project 面板即时模式 UI 主循环中。