Files
UnrealEngineUWP/Engine/Plugins/Runtime/ModelViewViewModel/Source/ModelViewViewModelBlueprint/Private/MVVMViewBlueprintCompiler.h
Patrick Boutot 5cc291be88 MVVM: Move the ModelViewViewModel plugin to //UE5/Main/
#preflight 62471b2edc6183e3f51a8a07
#preflight 62473c85f73c316f680acef9

[CL 19592606 by Patrick Boutot in ue5-main branch]
2022-04-01 14:21:11 -04:00

131 lines
4.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Bindings/MVVMCompiledBindingLibraryCompiler.h"
#include "MVVMBlueprintViewBinding.h"
#include "MVVMBlueprintViewModelContext.h"
#include "Templates/ValueOrError.h"
#include "Types/MVVMFieldVariant.h"
#include "UObject/Object.h"
#include "WidgetBlueprintCompiler.h"
struct FMVVMCachedPropertyPath;
struct FMVVMBlueprintViewBinding;
class FWidgetBlueprintCompilerContext;
class UEdGraph;
class UMVVMBlueprintView;
class UMVVMViewClass;
class UWidgetBlueprintGeneratedClass;
namespace UE::MVVM::Private
{
struct FMVVMViewBlueprintCompiler
{
private:
struct FCompilerSourceContext;
struct FCompilerSourceCreatorContext;
struct FCompilerBinding;
public:
FMVVMViewBlueprintCompiler(FWidgetBlueprintCompilerContext& InCreationContext)
: WidgetBlueprintCompilerContext(InCreationContext)
{}
FWidgetBlueprintCompilerContext& GetCompilerContext()
{
return WidgetBlueprintCompilerContext;
}
void AddExtension(UWidgetBlueprintGeneratedClass* Class, UMVVMViewClass* ViewExtension);
void CleanOldData(UWidgetBlueprintGeneratedClass* ClassToClean, UObject* OldCDO);
/** Generate function that are hidden from the user (not on the Skeleton class). */
void CreateFunctions(UMVVMBlueprintView* BlueprintView);
/** Generate variable in the Skeleton class */
void CreateVariables(const FWidgetBlueprintCompilerContext::FCreateVariableContext& Context, UMVVMBlueprintView* BlueprintView);
/** Add all the field path and the bindings to the library compiler. */
bool PreCompile(UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView);
/** Compile the library and fill the view and viewclass */
bool Compile(UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView, UMVVMViewClass* ViewExtension);
private:
void CreateWidgetMap(const FWidgetBlueprintCompilerContext::FCreateVariableContext& Context, UMVVMBlueprintView* BlueprintView);
void CreateSourceLists(const FWidgetBlueprintCompilerContext::FCreateVariableContext& Context, UMVVMBlueprintView* BlueprintView);
void CreateFunctionsDeclaration(const FWidgetBlueprintCompilerContext::FCreateVariableContext& Context, UMVVMBlueprintView* BlueprintView);
bool PreCompileSourceCreators(UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView);
bool CompileSourceCreators(const FCompiledBindingLibraryCompiler::FCompileResult& CompileResult, UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView, UMVVMViewClass* ViewExtension);
bool PreCompileBindings(UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView);
bool CompileBindings(const FCompiledBindingLibraryCompiler::FCompileResult& CompileResult, UWidgetBlueprintGeneratedClass* Class, UMVVMBlueprintView* BlueprintView, UMVVMViewClass* ViewExtension);
const FCompilerSourceCreatorContext* FindViewModelSource(FGuid Id) const;
void AddErrorForBinding(FMVVMBlueprintViewBinding& Binding, const FString& Message) const;
private:
struct FCompilerSourceContext
{
UClass* Class = nullptr;
FName PropertyName;
FString DisplayName;
FString CategoryName;
FString BlueprintSetter;
FMVVMConstFieldVariant Field;
bool bExposeOnSpawn = false;
};
TArray<FCompilerSourceContext> SourceContexts;
enum class ECompilerSourceCreatorType
{
ViewModel,
};
struct FCompilerSourceCreatorContext
{
FMVVMBlueprintViewModelContext ViewModelContext;
FCompiledBindingLibraryCompiler::FFieldPathHandle ReadPropertyPath;
ECompilerSourceCreatorType Type = ECompilerSourceCreatorType::ViewModel;
FString SetterFunctionName;
UEdGraph* SetterGraph = nullptr;
};
TArray<FCompilerSourceCreatorContext> SourceCreatorContexts;
enum class ECompilerBindingType
{
PropertyBinding, // normal binding
};
struct FCompilerBinding
{
int32 BindingIndex = INDEX_NONE;
int32 SourceContextIndex = INDEX_NONE;
bool bSourceIsUserWidget = false;
FCompiledBindingLibraryCompiler::FBindingHandle BindingHandle;
// At runtime, when TriggerFields changes
//if the ConversionFunction exist
// then we need to read all the inputs of the ConversionFunction
// then we copy the result of the ConversionFunction to DestinationWrite
//else we read the same property that TriggerField changed
// then we copy TriggerField to DestiantionWrite.
FCompiledBindingLibraryCompiler::FFieldIdHandle FieldIdHandle;
TArray<FCompiledBindingLibraryCompiler::FFieldPathHandle> SourceRead;
FCompiledBindingLibraryCompiler::FFieldPathHandle DestinationWrite;
FCompiledBindingLibraryCompiler::FFieldPathHandle ConversionFunction;
};
TArray<FCompilerBinding> Bindings;
TMap<FName, UWidget*> WidgetNameToWidgetPointerMap;
FWidgetBlueprintCompilerContext& WidgetBlueprintCompilerContext;
FCompiledBindingLibraryCompiler BindingLibraryCompiler;
bool bAreSourcesCreatorValid = true;
bool bAreSourceContextsValid = true;
bool bIsBindingsValid = true;
};
} //namespace