// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Engine/DeveloperSettings.h" #include "Misc/NamePermissionList.h" #include "MVVMDeveloperProjectSettings.generated.h" class UK2Node; class UListViewBase; class UMVVMViewModelContextResolver; class UPanelWidget; enum class EMVVMBlueprintViewModelContextCreationType : uint8; enum class EMVVMExecutionMode : uint8; /** * */ USTRUCT() struct FMVVMDeveloperProjectWidgetSettings { GENERATED_BODY() /** Properties or functions name that should not be use for binding (read or write). */ UPROPERTY(EditAnywhere, config, Category = "Viewmodel") TSet DisallowedFieldNames; /** Properties or functions name that are displayed in the advanced category. */ UPROPERTY(EditAnywhere, config, Category = "Viewmodel") TSet AdvancedFieldNames; }; UENUM() enum class EFilterFlag : uint8 { None = 0, All = 1 << 0 }; ENUM_CLASS_FLAGS(EFilterFlag) USTRUCT() struct FMVVMViewBindingFilterSettings { GENERATED_BODY() /** Filter out the properties and functions that are not valid in the context of the binding. */ UPROPERTY(EditAnywhere, config, Category = "Viewmodel") EFilterFlag FilterFlags = EFilterFlag::None; }; /** * */ UENUM() enum class EMVVMDeveloperConversionFunctionFilterType : uint8 { BlueprintActionRegistry, AllowedList UMETA(DisplayName="Conversion Function Library"), }; /** * Implements the settings for the MVVM Editor */ UCLASS(config=ModelViewViewModel, defaultconfig) class MODELVIEWVIEWMODELBLUEPRINT_API UMVVMDeveloperProjectSettings : public UDeveloperSettings { GENERATED_BODY() public: UMVVMDeveloperProjectSettings(); virtual FName GetCategoryName() const override; virtual FText GetSectionText() const override; #if WITH_EDITOR virtual void PostEditChangeChainProperty(FPropertyChangedChainEvent& PropertyChangedEvent) override; #endif bool PropertyHasFiltering(const UStruct* ObjectStruct, const FProperty* Property) const; bool IsPropertyAllowed(const UBlueprint* Context, const UStruct* ObjectStruct, const FProperty* Property) const; bool IsFunctionAllowed(const UBlueprint* Context, const UClass* ObjectClass, const UFunction* Function) const; bool IsConversionFunctionAllowed(const UBlueprint* Context, const UFunction* Function) const; bool IsConversionFunctionAllowed(const UBlueprint* Context, const TSubclassOf Function) const; bool IsExecutionModeAllowed(EMVVMExecutionMode ExecutionMode) const { return AllowedExecutionMode.Contains(ExecutionMode); } bool IsContextCreationTypeAllowed(EMVVMBlueprintViewModelContextCreationType ContextCreationType) const { return AllowedContextCreationType.Contains(ContextCreationType); } EMVVMDeveloperConversionFunctionFilterType GetConversionFunctionFilter() const { return ConversionFunctionFilter; } TArray GetAllowedConversionFunctionClasses() const; TArray GetDeniedConversionFunctionClasses() const; bool IsExtensionSupportedForPanelClass(TSubclassOf ClassToSupport) const; bool IsExtensionSupportedForListViewBaseClass(TSubclassOf ClassToSupport) const; /** Get generated functions permission list. */ FPathPermissionList& GetGeneratedFunctionPermissions() { return GeneratedFunctionPermissions; } private: /** Permission list for filtering which properties are visible in UI. */ UPROPERTY(EditAnywhere, config, Category = "UX", meta=(AllowAbstract = true)) TMap FieldSelectorPermissions; /** Permission list for filtering which execution mode is allowed. */ UPROPERTY(EditAnywhere, config, Category = "Defaults") TSet AllowedExecutionMode; /** Permission list for filtering which context creation type is allowed. */ UPROPERTY(EditAnywhere, config, Category = "Defaults") TSet AllowedContextCreationType; public: /** Binding can be made from the DetailView Bind option. */ UPROPERTY(EditAnywhere, config, Category = "UX") bool bAllowBindingFromDetailView = true; /** When generating a source in the viewmodel editor, allow the compiler to generate a setter function. */ UPROPERTY(EditAnywhere, config, Category = "Features", meta=(DisplayName="Allow Generated Viewmodel Setter")) bool bAllowGeneratedViewModelSetter = true; /** When generating a binding with a long source path, allow the compiler to generate a new viewmodel source. */ UPROPERTY(EditAnywhere, config, Category = "Features") bool bAllowLongSourcePath = true; /** For the binding list widget, allow the user to edit the binding in the detail view. */ UPROPERTY(EditAnywhere, config, Category = "UX") bool bShowDetailViewOptionInBindingPanel = true; /** For the binding list widget and the viewmodel panel, allow the user to edit the view settings in the detail view. */ UPROPERTY(EditAnywhere, config, Category = "UX") bool bShowViewSettings = true; /** For the binding list widget, allow the user to generate a copy of the binding/event graph. */ UPROPERTY(EditAnywhere, config, Category = "UX") bool bShowDeveloperGenerateGraphSettings = true; UE_DEPRECATED(5.5, "MVVM AllowConversionFunctionGeneratedGraphInEditor feature is disable. The graphs are now transient.") /** * When a conversion function requires a wrapper graph, add and save the generated graph to the blueprint. * It is strongly suggested to not use this feature. It can easly break deprecation and the graph will not auto update with new features. */ UPROPERTY() bool bAllowConversionFunctionGeneratedGraphInEditor_DEPRECATED = false; /** When binding to a multicast delegate property, allow to create an event. */ UPROPERTY(EditAnywhere, config, Category = "Features") bool bAllowBindingEvent = true; UPROPERTY(EditAnywhere, config, Category = "Features") bool bAllowConditionBinding = true; /** Allow to create an instanced viewmodel directly in the view editor. */ UPROPERTY(EditAnywhere, config, Category = "Features", meta=(DisplayName="Experimental - Can Create Viewmodel In View")) bool bCanCreateViewModelInView = false; /** * When a viewmodel is set to Create Instance, allow modifying the viewmodel instance in the editor on all instances of the owning widget. * The per-viewmodel setting "Expose Instance In Editor" overrides this. */ UPROPERTY(EditAnywhere, config, Category = "Features") bool bExposeViewModelInstanceInEditor = false; /** Permission list for filtering which execution mode is allowed. */ UPROPERTY(EditAnywhere, config, Category = "Defaults") EMVVMDeveloperConversionFunctionFilterType ConversionFunctionFilter = EMVVMDeveloperConversionFunctionFilterType::BlueprintActionRegistry; /** Classes to include in conversion function list. It includes the child class. */ UPROPERTY(EditAnywhere, config, Category = "Defaults", meta = (AllowAbstract = true, EditCondition = "ConversionFunctionFilter == EMVVMDeveloperConversionFunctionFilterType::AllowedList")) TSet AllowedClassForConversionFunctions; /** Classes excluded for conversion function list. */ UPROPERTY(EditAnywhere, config, Category = "Defaults", meta = (AllowAbstract = true, EditCondition = "ConversionFunctionFilter == EMVVMDeveloperConversionFunctionFilterType::AllowedList")) TSet DeniedClassForConversionFunctions; /** Modules excluded for conversion function list. ie. "/Script/MyModule" */ UPROPERTY(EditAnywhere, config, Category = "Defaults", meta = (EditCondition = "ConversionFunctionFilter == EMVVMDeveloperConversionFunctionFilterType::AllowedList")) TSet DeniedModuleForConversionFunctions; FSimpleMulticastDelegate OnLibrarySettingChanged; /** The default value of UMVVMBlueprintViewSettings::bForceExecuteBindingOnSetSource. */ UPROPERTY(EditAnywhere, config, Category = "Defaults") bool bForceExecuteBindingsOnSetSource = false; /** Settings for filtering the list of available properties and functions on binding creation. */ UPROPERTY(EditAnywhere, config, Category = "UX") FMVVMViewBindingFilterSettings FilterSettings; /** Sub-classes of panel widget that are supported to have an extension for binding their entries to viewmodels. */ UPROPERTY(EditAnywhere, config, Category = "Widget Extension") TSet> SupportedPanelClassesForExtension; /** Sub-classes of ListViewBase that are supported to have an extension for binding their entries to viewmodels. */ UPROPERTY(EditAnywhere, config, Category = "Widget Extension") TSet> SupportedListViewBaseClassesForExtension; /** Resolver class to use as the default value when selecting resolver creation mode */ UPROPERTY(EditAnywhere, config, Category = "Defaults") TSoftClassPtr DefaultResolverValue; private: /** MVVM Generated function permission list */ FPathPermissionList GeneratedFunctionPermissions; };