-
Notifications
You must be signed in to change notification settings - Fork 349
Expand file tree
/
Copy pathFlowAssetFactory.cpp
More file actions
126 lines (99 loc) · 3.78 KB
/
FlowAssetFactory.cpp
File metadata and controls
126 lines (99 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright https://github.com/MothCocoon/FlowGraph/graphs/contributors
#include "Asset/FlowAssetFactory.h"
#include "FlowAsset.h"
#include "Graph/FlowGraph.h"
#include "Graph/FlowGraphSettings.h"
#include "ClassViewerFilter.h"
#include "ClassViewerModule.h"
#include "Kismet2/KismetEditorUtilities.h"
#include "Kismet2/SClassPickerDialog.h"
#include "Modules/ModuleManager.h"
#define LOCTEXT_NAMESPACE "FlowAssetFactory"
class FAssetClassParentFilter final : public IClassViewerFilter
{
public:
FAssetClassParentFilter()
: DisallowedClassFlags(CLASS_None)
, bDisallowBlueprintBase(false)
{
}
/** All children of these classes will be included unless filtered out by another setting. */
TSet<const UClass*> AllowedChildrenOfClasses;
/** Disallowed class flags. */
EClassFlags DisallowedClassFlags;
/** Disallow blueprint base classes. */
bool bDisallowBlueprintBase;
virtual bool IsClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const UClass* InClass, const TSharedRef<FClassViewerFilterFuncs> InFilterFuncs) override
{
const bool bAllowed = !InClass->HasAnyClassFlags(DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed;
if (bAllowed && bDisallowBlueprintBase)
{
if (FKismetEditorUtilities::CanCreateBlueprintOfClass(InClass))
{
return false;
}
}
return bAllowed;
}
virtual bool IsUnloadedClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const TSharedRef<const IUnloadedBlueprintData> InUnloadedClassData, TSharedRef<FClassViewerFilterFuncs> InFilterFuncs) override
{
if (bDisallowBlueprintBase)
{
return false;
}
return !InUnloadedClassData->HasAnyClassFlags(DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed;
}
};
UFlowAssetFactory::UFlowAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UFlowAsset::StaticClass();
bCreateNew = true;
bEditorImport = false;
bEditAfterNew = true;
}
bool UFlowAssetFactory::ConfigureProperties()
{
const FText TitleText = LOCTEXT("CreateFlowAssetOptions", "Pick Flow Asset Class");
return ConfigurePropertiesInternal(TitleText);
}
bool UFlowAssetFactory::ConfigurePropertiesInternal(const FText& TitleText)
{
AssetClass = GetDefault<UFlowGraphSettings>()->DefaultFlowAssetClass.LoadSynchronous();
if (AssetClass) // Class was set in settings
{
return true;
}
// Load the Class Viewer module to display a class picker
FModuleManager::LoadModuleChecked<FClassViewerModule>("ClassViewer");
// Fill in options
FClassViewerInitializationOptions Options;
Options.Mode = EClassViewerMode::ClassPicker;
const TSharedPtr<FAssetClassParentFilter> Filter = MakeShareable(new FAssetClassParentFilter);
Filter->DisallowedClassFlags = CLASS_Abstract | CLASS_Deprecated | CLASS_NewerVersionExists | CLASS_HideDropDown;
Filter->AllowedChildrenOfClasses.Add(SupportedClass);
Options.ClassFilters = {Filter.ToSharedRef()};
UClass* ChosenClass = nullptr;
const bool bPressedOk = SClassPickerDialog::PickClass(TitleText, Options, ChosenClass, SupportedClass);
if (bPressedOk)
{
AssetClass = ChosenClass;
}
return bPressedOk;
}
UObject* UFlowAssetFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
UFlowAsset* NewFlowAsset;
if (AssetClass)
{
NewFlowAsset = NewObject<UFlowAsset>(InParent, AssetClass, Name, Flags | RF_Transactional, Context);
}
else
{
// if we have no asset class, use the passed-in class instead
NewFlowAsset = NewObject<UFlowAsset>(InParent, Class, Name, Flags | RF_Transactional, Context);
}
UFlowGraph::CreateGraph(NewFlowAsset);
return NewFlowAsset;
}
#undef LOCTEXT_NAMESPACE