0%

引用查看器

初始化流程

创建窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//通过Tabmanager创建新的标签页
FGlobalTabmanager::Get()->TryInvokeTab(ReferenceViewerTabName);

//响应引用查看器开启事件
FAssetManagerEditorModule::SpawnReferenceViewerTab();

//创建一个新窗口
SAssignNew(ReferenceViewerTab, SDockTab);

//在新窗口内创建引用查看器的Slate控件,执行Construct函数
NewTab->SetContent(SAssignNew(ReferenceViewerUI, SReferenceViewer));

//设置引用查看器的根节点,触发引用数据的创建
ReferenceViewer->SetGraphRootIdentifiers(SelectedIdentifiers, ReferenceViewerParams);

ReferenceViewer的Construct函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//绑定多种快捷键
RegisterActions();

//初始化历史记录管理器
HistoryManager.SetOnApplyHistoryData();
HistoryManager.SetOnUpdateHistoryData();

//创建引用关系图数据
GraphObj = NewObject<UEdGraph_ReferenceViewer>();

//设置右键菜单功能
GraphObj->Schema = UReferenceViewerSchema::StaticClass();

//创建引用关系图编辑器界面
GraphEditorPtr = SNew(SGraphEditor);

//创建ReDo UnDo Refresh、按钮选项、搜索框、引用关系图等控件的页面布局
ChildSlot[
...
];

//初始化集合筛选器选项列表
UpdateCollectionsComboList();

ReferenceViewer的SetGraphRootIdentifiers函数

1
2
3
4
5
6
7
8
9
10
11
//设置引用根节点,可以是多个资源
GraphObj->SetGraphRoot(NewGraphRootIdentifiers);

//设置引用查找属性、被引用资源、依赖资源、递归深度、遍历广度、包类型过滤、名称过滤等
...

//加载资产注册模块
FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));

//开始构造引用关系依赖图数据
GraphObj->RebuildGraph();

引用关系图数据(UEdGraph_ReferenceViewer)的RebuildGraph函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//移除旧的引用节点
RemoveAllNodes();

//按照依赖关系查找选项,递归计算引用或依赖的节点数量、引用资产包名称、每个资产引用的节点数量
RecursivelyGatherSizes();

//通过资产包找到资产数据,大多数包里只有一个资产
GatherAssetData();

//创建引用根节点,初始化节点位置、标题、引脚
CreateReferenceNode();

//递归创建引用或依赖的每一个节点
RecursivelyConstructNodes();

//通知编辑器界面更新
NotifyGraphChanged();

SGraphEditor响应更新事件

输入响应流程

SReferenceViewer输入

搜索过滤按钮

  1. 在SReferenceViewer内的SSearchBox输入搜索关键词,触发文本改变事件
  2. 清空SGraphEditor选中的Node
  3. 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
  4. 遍历所有Node,选中名称匹配成功的Node

显示选项按钮

以Show Hard References为例

  1. 点击SReferenceViewer内的SCheckBox控件,触发点击事件
  2. 修改UEdGraph_ReferenceViewer的显示硬引用状态
  3. 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
    • RecursivelyGatherSizes内部的过滤选项将会改变

紧密模式选择

  1. 点击SReferenceViewer内的SCheckBox控件,触发点击事件
  2. 修改UEdGraph_ReferenceViewer的紧密模式选择状态
  3. 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
    • RecursivelyConstructNodes内Node的布局将会改变
    • Node->SetupReferenceNode参数改变,SReferenceNode绘制时将不显示图片

SGraphEditor输入

代码结构

SReferenceViewer

引用查看器窗口本身,是整个引用查看器的核心模块,包括窗口显示、用户输入响应、子功能模块管理

SReferenceNode

UReferenceViewerSchema

HistoryManager

EdGraphNode_Reference

EdGraph_ReferenceViewer