ComboInput/Source/ComboInputEditor/Private/Helpers/ComboActionGraphEditorUtilities.h

104 lines
3.4 KiB
C++

// ©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<const UClass*> AllowedChildrenOfClasses;
virtual bool IsClassAllowed(const FClassViewerInitializationOptions &InInitOptions, const UClass *InClass, TSharedRef<FClassViewerFilterFuncs> InFilterFuncs) override
{
return !InClass->HasAnyClassFlags(this->DisallowedClassFlags)
&& InFilterFuncs->IfInChildOfClassesSet(this->AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed;
}
virtual bool IsUnloadedClassAllowed(const FClassViewerInitializationOptions &InInitOptions, const TSharedRef<const IUnloadedBlueprintData> InUnloadedClassData, TSharedRef<FClassViewerFilterFuncs> 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<UBlueprintGeneratedClass>(Class) != nullptr; }
static bool GetAllChildClassesOf(const UClass *ParentClass, TArray<UClass*> &OutNativeClasses, TArray<UClass*> &OutBlueprintClasses)
{
// Iterate over UClass, this might be heavy on performance
for (TObjectIterator<UClass> 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<class FAssetEditor_ComboActionGraph> DialogueEditorPtr, const UEdGraphNode *GraphNode, bool bFocusIfOpen = false);
static class UComboActionGraph *GetActionFromGraphNode(const UEdGraphNode *GraphNode);
static IAssetEditorInstance *FindEditorForAsset(UObject *Asset, bool bFocusIfOpen);
};