// Copyright Epic Games, Inc. All Rights Reserved. #include "BlueprintEditorSCSEditorUICustomization.h" #include "SubobjectData.h" #include "SubobjectDataHandle.h" TSharedPtr FFBlueprintEditorSCSEditorUICustomization::Instance; TSharedPtr FFBlueprintEditorSCSEditorUICustomization::GetInstance() { if (!Instance) { Instance = MakeShareable(new FFBlueprintEditorSCSEditorUICustomization()); } return Instance; } bool FFBlueprintEditorSCSEditorUICustomization::HideComponentsTree(TArrayView Context) const { for (const TSharedPtr& Customization : Customizations) { if (Customization->HideComponentsTree(Context)) { return true; } } return ISCSEditorUICustomization::HideComponentsTree(Context); } bool FFBlueprintEditorSCSEditorUICustomization::HideComponentsFilterBox(TArrayView Context) const { for (const TSharedPtr& Customization : Customizations) { if (Customization->HideComponentsFilterBox(Context)) { return true; } } return ISCSEditorUICustomization::HideComponentsFilterBox(Context); } bool FFBlueprintEditorSCSEditorUICustomization::HideAddComponentButton(TArrayView Context) const { for (const TSharedPtr& Customization : Customizations) { if (Customization->HideAddComponentButton(Context)) { return true; } } return ISCSEditorUICustomization::HideAddComponentButton(Context); } bool FFBlueprintEditorSCSEditorUICustomization::HideBlueprintButtons(TArrayView Context) const { for (const TSharedPtr& Customization : Customizations) { if (Customization->HideBlueprintButtons(Context)) { return true; } } return ISCSEditorUICustomization::HideBlueprintButtons(Context); } const FSlateBrush* FFBlueprintEditorSCSEditorUICustomization::GetIconBrush(const FSubobjectData& SubobjectData) const { for (const TSharedPtr& Customization : Customizations) { if (const FSlateBrush* IconBrush = Customization->GetIconBrush(SubobjectData)) { return IconBrush; } } return ISCSEditorUICustomization::GetIconBrush(SubobjectData); } TSharedPtr FFBlueprintEditorSCSEditorUICustomization::GetControlsWidget(const FSubobjectData& SubobjectData) const { for (const TSharedPtr& Customization : Customizations) { if (TSharedPtr ControlsWidget = Customization->GetControlsWidget(SubobjectData)) { return ControlsWidget; } } return ISCSEditorUICustomization::GetControlsWidget(SubobjectData); } EChildActorComponentTreeViewVisualizationMode FFBlueprintEditorSCSEditorUICustomization::GetChildActorVisualizationMode() const { for (const TSharedPtr& Customization : Customizations) { EChildActorComponentTreeViewVisualizationMode VisualizationMode = Customization->GetChildActorVisualizationMode(); if (VisualizationMode != EChildActorComponentTreeViewVisualizationMode::UseDefault) { return VisualizationMode; } } return ISCSEditorUICustomization::GetChildActorVisualizationMode(); } TSubclassOf FFBlueprintEditorSCSEditorUICustomization::GetComponentTypeFilter(TArrayView Context) const { for (const TSharedPtr& Customization : Customizations) { if(TSubclassOf SubClass = Customization->GetComponentTypeFilter(Context)) { return SubClass; } } return ISCSEditorUICustomization::GetComponentTypeFilter(Context); } void FFBlueprintEditorSCSEditorUICustomization::AddCustomization(TSharedPtr Customization) { Customizations.AddUnique(Customization); } void FFBlueprintEditorSCSEditorUICustomization::RemoveCustomization(TSharedPtr Customization) { Customizations.Remove(Customization); } bool FFBlueprintEditorSCSEditorUICustomization::SortSubobjectData(TArray& SubobjectData) { for (const TSharedPtr& Customization : Customizations) { if (Customization->SortSubobjectData(SubobjectData)) { return true; } } return ISCSEditorUICustomization::SortSubobjectData(SubobjectData); } FFBlueprintEditorSCSEditorUICustomization::FFBlueprintEditorSCSEditorUICustomization() { Customizations.Add(FFBlueprintEditorDefaultSortUICustomization::GetInstance()); } TSharedPtr FFBlueprintEditorDefaultSortUICustomization::Instance; TSharedPtr FFBlueprintEditorDefaultSortUICustomization::GetInstance() { if (!Instance) { Instance = MakeShareable(new FFBlueprintEditorDefaultSortUICustomization()); } return Instance; } bool FFBlueprintEditorDefaultSortUICustomization::SortSubobjectData(TArray& SubobjectData) { // Sort subobjects by parentage, type (always put scene components first in the tree), then display name SubobjectData.Sort([](const FSubobjectDataHandle& A, const FSubobjectDataHandle& B) { // If A is a child of B, sort B ahead if (A.GetData()->GetParentData() == B.GetData()) { return false; } // Scene components should sort ahead of non-scene components if (A.GetData()->IsSceneComponent()) { // If both are scene components, sort by display name if (B.GetData()->IsSceneComponent()) { return A.GetData()->GetDisplayName().CompareTo(B.GetData()->GetDisplayName()) < 0; } return !B.GetData()->IsActor(); } // Actors should go next if (A.GetData()->IsActor()) { // If both are actors, sort by display name if (B.GetData()->IsActor()) { return A.GetData()->GetDisplayName().CompareTo(B.GetData()->GetDisplayName()) < 0; } return true; } // Otherwise just sort by display name return A.GetData()->GetDisplayName().CompareTo(B.GetData()->GetDisplayName()) < 0; }); return true; }