// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "EditorUtilityAssetPrototype.h" #include "Containers/Array.h" #include "Containers/Map.h" #include "Containers/Set.h" #include "Containers/SparseArray.h" #include "HAL/Platform.h" #include "Templates/Function.h" #include "UObject/Interface.h" #include "UObject/NameTypes.h" #include "UObject/ObjectMacros.h" #include "UObject/TopLevelAssetPath.h" #include "UObject/UObjectGlobals.h" class AActor; class FMenuBuilder; class FProperty; class FString; class FText; class IEditorUtilityExtension; struct FToolMenuSection; class UFunction; class UObject; class FAssetActionUtilityPrototype; // Blutility Menu extension helpers class FBlutilityMenuExtensions { public: /** Helper function to get all Blutility classes derived from the specified class name */ static void GetBlutilityClasses(TArray& OutAssets, FTopLevelAssetPath InClassName); /** Helper function that populates a menu based on the exposed functions in a set of Blutility objects */ static void CreateActorBlutilityActionsMenu(FToolMenuSection& InSection, TMap, TSet> Utils, const TArray SelectedSupportedActors); static void CreateAssetBlutilityActionsMenu(FToolMenuSection& InSection, TMap, TSet> Utils, const TArray SelectedSupportedAssets); protected: // Helper struct to track the util to call a function on struct FFunctionAndUtil { FFunctionAndUtil(const FBlutilityFunctionData& InFunctionData, const TSharedRef& InUtil, TSet& InSelection) : FunctionData(InFunctionData) , Util(InUtil) , SelectionIndices(InSelection) {} bool operator==(const FFunctionAndUtil& InFunction) const { return FunctionData == InFunction.FunctionData && Util == InFunction.Util; } UFunction* GetFunction() const { if (const UObject* UtilityCDO = Util->LoadUtilityAsset()) { if (const UClass* UtilityClass = UtilityCDO->GetClass()) { return UtilityClass->FindFunctionByName(FunctionData.Name); } } return nullptr; } FBlutilityFunctionData FunctionData; TSharedRef Util; /** Indices to original object selection array which are supported by this utility */ TSet SelectionIndices; }; protected: template static void CreateBlutilityActionsMenu(FMenuBuilder& MenuBuilder, TMap, TSet> Utils, const FText& MenuLabel, const FText& MenuToolTip, TFunction IsValidPropertyType, const TArray Selection, const FName& IconName = "GraphEditor.Event_16x"); template static void CreateBlutilityActionsMenu(FToolMenuSection& InSection, TMap, TSet> Utils, const FName& MenuName, const FText& MenuLabel, const FText& MenuToolTip, TFunction IsValidPropertyType, const TArray Selection, const FName& IconName = "GraphEditor.Event_16x"); static void OpenEditorForUtility(const FFunctionAndUtil& FunctionAndUtil); static void ExtractFunctions(TMap, TSet>& Utils, TMap>& OutCategoryFunctions); };