text: #include "GenericGraphFactory.h"
  #include "GenericGraph.h"
  
  #include "ClassViewerModule.h"
  #include "ClassViewerFilter.h"
  #include "Kismet2/SClassPickerDialog.h"
  
  #define LOCTEXT_NAMESPACE "GenericGraphFactory"
  
  class FAssetClassParentFilter : 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, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs) override
  	{
  		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;
  	}
  };
  
  
  UGenericGraphFactory::UGenericGraphFactory()
  {
  	bCreateNew = true;
  	bEditAfterNew = true;
  	SupportedClass = UGenericGraph::StaticClass();
  }
  
  UGenericGraphFactory::~UGenericGraphFactory()
  {
  
  }
  
  bool UGenericGraphFactory::ConfigureProperties()
  {
  	// nullptr the GenericGraphClass so we can check for selection
  	GenericGraphClass = nullptr;
  
  	// Load the classviewer module to display a class picker
  	FClassViewerModule& ClassViewerModule = FModuleManager::LoadModuleChecked<FClassViewerModule>("ClassViewer");
  
  	// Fill in options
  	FClassViewerInitializationOptions Options;
  	Options.Mode = EClassViewerMode::ClassPicker;
  
  	TSharedPtr<FAssetClassParentFilter> Filter = MakeShareable(new FAssetClassParentFilter);
  	Options.ClassFilter = Filter;
  
  	Filter->DisallowedClassFlags = CLASS_Abstract | CLASS_Deprecated | CLASS_NewerVersionExists | CLASS_HideDropDown;
  	Filter->AllowedChildrenOfClasses.Add(UGenericGraph::StaticClass());
  
  	const FText TitleText = LOCTEXT("CreateGenericGraphAssetOptions", "Pick Generic Graph Class");
  	UClass* ChosenClass = nullptr;
  	const bool bPressedOk = SClassPickerDialog::PickClass(TitleText, Options, ChosenClass, UGenericGraph::StaticClass());
  
  	if ( bPressedOk )
  	{
  		GenericGraphClass = ChosenClass;
  	}
  
  	return bPressedOk;
  }
  
  UObject* UGenericGraphFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
  {
  	if (GenericGraphClass != nullptr)
  	{
  		return NewObject<UGenericGraph>(InParent, GenericGraphClass, Name, Flags | RF_Transactional);
  	}
  	else
  	{
  		check(Class->IsChildOf(UGenericGraph::StaticClass()));
  		return NewObject<UObject>(InParent, Class, Name, Flags | RF_Transactional);
  	}
  
  }
  
  #undef LOCTEXT_NAMESPACE
  