104 lines
3.4 KiB
C++
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);
|
|
};
|
|
|
|
|