初始化流程
创建窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FGlobalTabmanager::Get()->TryInvokeTab(ReferenceViewerTabName);
FAssetManagerEditorModule::SpawnReferenceViewerTab();
SAssignNew(ReferenceViewerTab, SDockTab);
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);
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输入
搜索过滤按钮
- 在SReferenceViewer内的SSearchBox输入搜索关键词,触发文本改变事件
- 清空SGraphEditor选中的Node
- 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
- 遍历所有Node,选中名称匹配成功的Node
显示选项按钮
以Show Hard References为例
- 点击SReferenceViewer内的SCheckBox控件,触发点击事件
- 修改UEdGraph_ReferenceViewer的显示硬引用状态
- 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
- RecursivelyGatherSizes内部的过滤选项将会改变
紧密模式选择
- 点击SReferenceViewer内的SCheckBox控件,触发点击事件
- 修改UEdGraph_ReferenceViewer的紧密模式选择状态
- 通过UEdGraph_ReferenceViewer重新构建网络(参考RebuildGraph函数)
- RecursivelyConstructNodes内Node的布局将会改变
- Node->SetupReferenceNode参数改变,SReferenceNode绘制时将不显示图片
SGraphEditor输入
代码结构
SReferenceViewer
引用查看器窗口本身,是整个引用查看器的核心模块,包括窗口显示、用户输入响应、子功能模块管理
SReferenceNode
UReferenceViewerSchema
HistoryManager
EdGraphNode_Reference
EdGraph_ReferenceViewer