You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#test MVVM asset in QAGame #rb Yohann.DosSantos #preflight 64089d788c0039bbf73e80d8 [CL 24574634 by patrick boutot in ue5-main branch]
252 lines
6.6 KiB
C++
252 lines
6.6 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "MVVMBlueprintViewBinding.h"
|
|
|
|
#include "Bindings/MVVMConversionFunctionHelper.h"
|
|
#include "K2Node_CallFunction.h"
|
|
#include "MVVMBlueprintView.h"
|
|
#include "MVVMWidgetBlueprintExtension_View.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(MVVMBlueprintViewBinding)
|
|
|
|
FName FMVVMBlueprintViewBinding::GetFName() const
|
|
{
|
|
return *BindingId.ToString(EGuidFormats::DigitsWithHyphensLower);
|
|
}
|
|
|
|
namespace UE::MVVM::Private
|
|
{
|
|
void AppendViewModelPathString(const UMVVMBlueprintView* BlueprintView, const FMVVMBlueprintPropertyPath& ViewModelPath, FStringBuilderBase& PathBuilder)
|
|
{
|
|
if (ViewModelPath.IsEmpty())
|
|
{
|
|
PathBuilder << TEXT("<none>");
|
|
return;
|
|
}
|
|
|
|
const FMVVMBlueprintViewModelContext* ViewModel = BlueprintView != nullptr ? BlueprintView->FindViewModel(ViewModelPath.GetViewModelId()) : nullptr;
|
|
if (ViewModel)
|
|
{
|
|
PathBuilder << ViewModel->GetDisplayName().ToString();
|
|
}
|
|
else
|
|
{
|
|
PathBuilder << TEXT("<none>");
|
|
}
|
|
|
|
const FString PropertyPath = ViewModelPath.GetBasePropertyPath();
|
|
if (!PropertyPath.IsEmpty())
|
|
{
|
|
PathBuilder << TEXT(".");
|
|
PathBuilder << PropertyPath;
|
|
}
|
|
}
|
|
|
|
FString GetBindingViewModelName(const UWidgetBlueprint* WidgetBlueprint, const FMVVMBlueprintViewBinding& Binding)
|
|
{
|
|
UMVVMWidgetBlueprintExtension_View* ExtensionView = UMVVMWidgetBlueprintExtension_View::GetExtension<UMVVMWidgetBlueprintExtension_View>(WidgetBlueprint);
|
|
UMVVMBlueprintView* BlueprintView = ExtensionView->GetBlueprintView();
|
|
|
|
TStringBuilder<256> NameBuilder;
|
|
|
|
if (UEdGraph* Graph = ConversionFunctionHelper::GetGraph(WidgetBlueprint, Binding, true))
|
|
{
|
|
if (const UK2Node_CallFunction* CallFunctionNode = ConversionFunctionHelper::GetFunctionNode(Graph))
|
|
{
|
|
NameBuilder << CallFunctionNode->GetFunctionName();
|
|
NameBuilder << TEXT("(");
|
|
|
|
bool bFirst = true;
|
|
|
|
for (const UEdGraphPin* Pin : CallFunctionNode->Pins)
|
|
{
|
|
if (Pin->PinName == UEdGraphSchema_K2::PN_Self ||
|
|
Pin->Direction != EGPD_Input)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!bFirst)
|
|
{
|
|
NameBuilder << TEXT(", ");
|
|
}
|
|
|
|
FMVVMBlueprintPropertyPath ArgumentPath = ConversionFunctionHelper::GetPropertyPathForArgument(WidgetBlueprint, CallFunctionNode, Pin->GetFName(), true);
|
|
if (!ArgumentPath.IsEmpty())
|
|
{
|
|
AppendViewModelPathString(BlueprintView, ArgumentPath, NameBuilder);
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << Pin->GetDefaultAsString();
|
|
}
|
|
|
|
bFirst = false;
|
|
}
|
|
|
|
NameBuilder << TEXT(")");
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << TEXT("<error>");
|
|
}
|
|
}
|
|
else if (!Binding.Conversion.SourceToDestinationFunction.GetMemberName().IsNone())
|
|
{
|
|
if (const UFunction* SourceToDestFunction = Binding.Conversion.SourceToDestinationFunction.ResolveMember<UFunction>(WidgetBlueprint->SkeletonGeneratedClass))
|
|
{
|
|
NameBuilder << SourceToDestFunction->GetName();
|
|
NameBuilder << TEXT("(");
|
|
|
|
AppendViewModelPathString(BlueprintView, Binding.SourcePath, NameBuilder);
|
|
|
|
NameBuilder << TEXT(")");
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << Binding.Conversion.SourceToDestinationFunction.GetMemberName();
|
|
NameBuilder << TEXT("()");
|
|
}
|
|
}
|
|
else if (!Binding.SourcePath.IsEmpty())
|
|
{
|
|
AppendViewModelPathString(BlueprintView, Binding.SourcePath, NameBuilder);
|
|
}
|
|
|
|
FString Name = NameBuilder.ToString();
|
|
if (Name.IsEmpty())
|
|
{
|
|
Name = TEXT("<none>");
|
|
}
|
|
|
|
return Name;
|
|
}
|
|
|
|
void AppendWidgetPathString(const UWidgetBlueprint* WidgetBlueprint, const FMVVMBlueprintPropertyPath& WidgetPath, FStringBuilderBase& PathBuilder)
|
|
{
|
|
if (WidgetBlueprint == nullptr || WidgetPath.GetWidgetName().IsNone())
|
|
{
|
|
PathBuilder << TEXT("<none>");
|
|
}
|
|
else if (WidgetBlueprint->GetFName() == WidgetPath.GetWidgetName())
|
|
{
|
|
PathBuilder << TEXT("self");
|
|
}
|
|
else
|
|
{
|
|
PathBuilder << WidgetPath.GetWidgetName();
|
|
}
|
|
|
|
const FString PropertyPath = WidgetPath.GetBasePropertyPath();
|
|
if (!PropertyPath.IsEmpty())
|
|
{
|
|
PathBuilder << TEXT(".");
|
|
PathBuilder << PropertyPath;
|
|
}
|
|
}
|
|
|
|
FString GetBindingWidgetName(const UWidgetBlueprint* WidgetBlueprint, const FMVVMBlueprintViewBinding& Binding)
|
|
{
|
|
TStringBuilder<256> NameBuilder;
|
|
|
|
if (UEdGraph* Graph = ConversionFunctionHelper::GetGraph(WidgetBlueprint, Binding, false))
|
|
{
|
|
if (const UK2Node_CallFunction* CallFunctionNode = ConversionFunctionHelper::GetFunctionNode(Graph))
|
|
{
|
|
NameBuilder << CallFunctionNode->GetFunctionName();
|
|
NameBuilder << TEXT("(");
|
|
|
|
bool bFirst = true;
|
|
|
|
for (const UEdGraphPin* Pin : CallFunctionNode->Pins)
|
|
{
|
|
if (Pin->Direction == EGPD_Input)
|
|
{
|
|
if (!bFirst)
|
|
{
|
|
NameBuilder << TEXT(", ");
|
|
}
|
|
|
|
FMVVMBlueprintPropertyPath ArgumentPath = ConversionFunctionHelper::GetPropertyPathForArgument(WidgetBlueprint, CallFunctionNode, Pin->GetFName(), true);
|
|
if (!ArgumentPath.IsEmpty())
|
|
{
|
|
AppendWidgetPathString(WidgetBlueprint, ArgumentPath, NameBuilder);
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << Pin->GetDefaultAsString();
|
|
}
|
|
}
|
|
|
|
bFirst = false;
|
|
}
|
|
|
|
NameBuilder << TEXT(")");
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << TEXT("<error>");
|
|
}
|
|
}
|
|
else if (!Binding.Conversion.DestinationToSourceFunction.GetMemberName().IsNone())
|
|
{
|
|
if (const UFunction* DestToSourceFunction = Binding.Conversion.DestinationToSourceFunction.ResolveMember<UFunction>(WidgetBlueprint->SkeletonGeneratedClass))
|
|
{
|
|
NameBuilder << DestToSourceFunction->GetName();
|
|
NameBuilder << TEXT("(");
|
|
|
|
AppendWidgetPathString(WidgetBlueprint, Binding.DestinationPath, NameBuilder);
|
|
|
|
NameBuilder << TEXT(")");
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << Binding.Conversion.SourceToDestinationFunction.GetMemberName();
|
|
NameBuilder << TEXT("()");
|
|
}
|
|
}
|
|
else if (!Binding.DestinationPath.IsEmpty())
|
|
{
|
|
AppendWidgetPathString(WidgetBlueprint, Binding.DestinationPath, NameBuilder);
|
|
}
|
|
|
|
FString Name = NameBuilder.ToString();
|
|
if (Name.IsEmpty())
|
|
{
|
|
Name = TEXT("<none>");
|
|
}
|
|
|
|
return Name;
|
|
}
|
|
}
|
|
|
|
FString FMVVMBlueprintViewBinding::GetDisplayNameString(const UWidgetBlueprint* WidgetBlueprint) const
|
|
{
|
|
check(WidgetBlueprint);
|
|
|
|
TStringBuilder<256> NameBuilder;
|
|
|
|
NameBuilder << UE::MVVM::Private::GetBindingWidgetName(WidgetBlueprint, *this);
|
|
|
|
if (BindingType == EMVVMBindingMode::TwoWay)
|
|
{
|
|
NameBuilder << TEXT(" <-> ");
|
|
}
|
|
else if (UE::MVVM::IsForwardBinding(BindingType))
|
|
{
|
|
NameBuilder << TEXT(" <- ");
|
|
}
|
|
else if (UE::MVVM::IsBackwardBinding(BindingType))
|
|
{
|
|
NameBuilder << TEXT(" -> ");
|
|
}
|
|
else
|
|
{
|
|
NameBuilder << TEXT(" ??? "); // shouldn't happen
|
|
}
|
|
|
|
NameBuilder << UE::MVVM::Private::GetBindingViewModelName(WidgetBlueprint, *this);
|
|
|
|
return NameBuilder.ToString();
|
|
}
|