2026/6/10 3:26:51
网站建设
项目流程
打开DataTable中RowEditor的SearchBox后发现,搜索Category的子串,会将该类下所有属性都显示出来,有点怪,所以结合AI梳理了更新的流程,备忘。
可见性由两方面决定
- 属性名/子属性名 匹配搜索串
- 属性Category/属性值 匹配搜索串
更新逻辑流程
核心逻辑:FDetailItemNode::FilterNode()
- 其中的关键属性是 bShouldBeVisibleDueToFiltering,由 PassesAllFilters() 负责更新,FDetailItemNode::GetVisibility() 中使用。
核心逻辑:PassesAllFilters()
- 核心的可见性判断是 const bool bPassesSearchFilter = bPassesCategoryFilter || bPassesValueFilter || bSearchFilterIsEmpty || ( bIsNotBeingFiltered || bIsSeenDueToFiltering || bIsParentSeenDueToFiltering );
- 不过滤 或 Category匹配 或 属性值匹配
- 自定义细节面板这里不考虑,走的是另外的逻辑
- bIsSeenDueToFiltering 和 bIsParentSeenDueToFiltering 由 PropertyNodeFlags 确定,在 FPropertyNode::FilterNodes() 中更新。
调用栈
- SDetailsViewBase::OnFilterTextChanged(const FText& InFilterText)
- SDetailsViewBase::FilterView(const FString& InFilter)
- SDetailsViewBase::UpdateFilteredDetails()
- FPropertyNode::FilterNodes(...)
- FDetailLayoutBuilderImpl::FilterDetailLayout( const FDetailFilter& InFilter )