// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. #pragma once #include "ClassViewerFilter.h" enum class EComboActionBlueprintOpenType : uint8 { None = 0, Function, Event }; class FComboActionClassViewerFilter : public IClassViewerFilter { public: // All children of these classes will be included unless filtered out by another setting. TSet AllowedChildrenOfClasses; virtual bool IsClassAllowed(const FClassViewerInitializationOptions &InInitOptions, const UClass *InClass, TSharedRef InFilterFuncs) override { return !InClass->HasAnyClassFlags(this->DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(this->AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed; } virtual bool IsUnloadedClassAllowed(const FClassViewerInitializationOptions &InInitOptions, const TSharedRef InUnloadedClassData, TSharedRef InFilterFuncs) override { return !InUnloadedClassData->HasAnyClassFlags(this->DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(this->AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed; } private: // Disallowed class flags. EClassFlags DisallowedClassFlags = CLASS_Deprecated; }; class FComboActionGraphEditorUtilities { public: static bool PickChildrenOfClass(const FText &TitleText, UClass *&OutChosenClass, UClass *Class); static bool OpenBlueprintEditor ( UBlueprint *Blueprint, EComboActionBlueprintOpenType OpenType = EComboActionBlueprintOpenType::None, FName FunctionNameToOpen = NAME_None, bool bForceFullEditor = true, bool bAddBlueprintFunctionIfItDoesNotExist = false ); static UEdGraph *BlueprintGetOrAddFunction(UBlueprint *Blueprint, FName FunctionName, UClass *FunctionClassSignature); static UEdGraph *BlueprintGetFunction(UBlueprint *Blueprint, FName FunctionName, UClass *FunctionClassSignature); static class UK2Node_Event *BlueprintGetOrAddEvent(UBlueprint *Blueprint, FName EventName, UClass *EventClassSignature); static class UK2Node_Event *BlueprintGetEvent(UBlueprint *Blueprint, FName EventName, UClass *EventClassSignature); static bool OpenEditorForAsset(const UObject *Asset); static bool IsABlueprintClass(const UClass *Class) { return Cast(Class) != nullptr; } static bool GetAllChildClassesOf(const UClass *ParentClass, TArray &OutNativeClasses, TArray &OutBlueprintClasses) { // Iterate over UClass, this might be heavy on performance for (TObjectIterator It; It; ++It) { UClass *ChildClass = *It; if (!ChildClass->IsChildOf(ParentClass)) { continue; } // It is a child of the Parent Class // make sure we don't include our parent class in the array if (ChildClass == ParentClass) { continue; } if (FComboActionGraphEditorUtilities::IsABlueprintClass(ChildClass)) { // Blueprint OutBlueprintClasses.Add(ChildClass); } else { // Native OutNativeClasses.Add(ChildClass); } } return OutNativeClasses.Num() > 0 || OutBlueprintClasses.Num() > 0; } static bool OpenEditorAndJumpToGraphNode(TWeakPtr DialogueEditorPtr, const UEdGraphNode *GraphNode, bool bFocusIfOpen = false); static class UComboActionGraph *GetActionFromGraphNode(const UEdGraphNode *GraphNode); static IAssetEditorInstance *FindEditorForAsset(UObject *Asset, bool bFocusIfOpen); };