You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#rnx #rb none #ROBOMERGE-SOURCE: CL 10869241 via CL 10869527 via CL 10869904 #ROBOMERGE-BOT: (v613-10869866) [CL 10870586 by ryan durand in Main branch]
160 lines
5.3 KiB
C++
160 lines
5.3 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "AIDataProviderValueDetails.h"
|
|
#include "Widgets/DeclarativeSyntaxSupport.h"
|
|
#include "Engine/GameViewportClient.h"
|
|
#include "Widgets/SBoxPanel.h"
|
|
#include "Textures/SlateIcon.h"
|
|
#include "Framework/Commands/UIAction.h"
|
|
#include "Widgets/Text/STextBlock.h"
|
|
#include "Framework/MultiBox/MultiBoxBuilder.h"
|
|
#include "SlateOptMacros.h"
|
|
#include "Widgets/Input/SComboButton.h"
|
|
#include "IDetailChildrenBuilder.h"
|
|
#include "DetailWidgetRow.h"
|
|
#include "DetailLayoutBuilder.h"
|
|
#include "DataProviders/AIDataProvider.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "AIDataProviderValueDetails"
|
|
|
|
TSharedRef<IPropertyTypeCustomization> FAIDataProviderValueDetails::MakeInstance()
|
|
{
|
|
return MakeShareable(new FAIDataProviderValueDetails);
|
|
}
|
|
|
|
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|
void FAIDataProviderValueDetails::CustomizeHeader(TSharedRef<class IPropertyHandle> StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
|
|
{
|
|
DataBindingProperty = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FAIDataProviderValue, DataBinding));
|
|
DataFieldProperty = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FAIDataProviderValue, DataField));
|
|
DefaultValueProperty = StructPropertyHandle->GetChildHandle(TEXT("DefaultValue"));
|
|
|
|
DataBindingProperty->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FAIDataProviderValueDetails::OnBindingChanged));
|
|
|
|
TArray<void*> StructPtrs;
|
|
StructPropertyHandle->AccessRawData(StructPtrs);
|
|
DataPtr = (StructPtrs.Num() == 1) ? reinterpret_cast<FAIDataProviderValue*>(StructPtrs[0]) : nullptr;
|
|
OnBindingChanged();
|
|
|
|
TSharedRef<SWidget> DefPropWidget = DefaultValueProperty->CreatePropertyValueWidget();
|
|
DefPropWidget->SetVisibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FAIDataProviderValueDetails::GetDefaultValueVisibility)));
|
|
|
|
HeaderRow
|
|
.NameContent()
|
|
[
|
|
StructPropertyHandle->CreatePropertyNameWidget()
|
|
]
|
|
.ValueContent()
|
|
.VAlign(VAlign_Center)
|
|
.MinDesiredWidth(300.0f)
|
|
[
|
|
SNew(SHorizontalBox)
|
|
+ SHorizontalBox::Slot()
|
|
.Padding(0.0f, 2.0f, 5.0f, 2.0f)
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(this, &FAIDataProviderValueDetails::GetValueDesc)
|
|
.Font(IDetailLayoutBuilder::GetDetailFont())
|
|
.Visibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FAIDataProviderValueDetails::GetBindingDescVisibility)))
|
|
]
|
|
+ SHorizontalBox::Slot()
|
|
.Padding(0.0f, 2.0f, 5.0f, 2.0f)
|
|
[
|
|
DefPropWidget
|
|
]
|
|
];
|
|
}
|
|
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|
|
|
void FAIDataProviderValueDetails::CustomizeChildren(TSharedRef<class IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
|
|
{
|
|
if (StructPropertyHandle->IsValidHandle())
|
|
{
|
|
StructBuilder.AddProperty(DataBindingProperty.ToSharedRef());
|
|
|
|
StructBuilder.AddCustomRow(LOCTEXT("PropertyField", "Property"))
|
|
.Visibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FAIDataProviderValueDetails::GetDataFieldVisibility)))
|
|
.NameContent()
|
|
[
|
|
DataFieldProperty->CreatePropertyNameWidget()
|
|
]
|
|
.ValueContent()
|
|
[
|
|
SNew(SComboButton)
|
|
.OnGetMenuContent(this, &FAIDataProviderValueDetails::OnGetDataFieldContent)
|
|
.ContentPadding(FMargin(2.0f, 2.0f))
|
|
.ButtonContent()
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(this, &FAIDataProviderValueDetails::GetDataFieldDesc)
|
|
.Font(IDetailLayoutBuilder::GetDetailFont())
|
|
]
|
|
];
|
|
}
|
|
}
|
|
|
|
void FAIDataProviderValueDetails::OnBindingChanged()
|
|
{
|
|
MatchingProperties.Reset();
|
|
if (DataPtr)
|
|
{
|
|
DataPtr->GetMatchingProperties(MatchingProperties);
|
|
|
|
FName NameValue;
|
|
DataFieldProperty->GetValue(NameValue);
|
|
if (MatchingProperties.Num() && !MatchingProperties.Contains(NameValue))
|
|
{
|
|
OnDataFieldNameChange(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
TSharedRef<SWidget> FAIDataProviderValueDetails::OnGetDataFieldContent()
|
|
{
|
|
FMenuBuilder MenuBuilder(true, NULL);
|
|
|
|
for (int32 i = 0; i < MatchingProperties.Num(); i++)
|
|
{
|
|
FUIAction ItemAction(FExecuteAction::CreateSP(this, &FAIDataProviderValueDetails::OnDataFieldNameChange, i));
|
|
MenuBuilder.AddMenuEntry(FText::FromName(MatchingProperties[i]), TAttribute<FText>(), FSlateIcon(), ItemAction);
|
|
}
|
|
|
|
return MenuBuilder.MakeWidget();
|
|
}
|
|
|
|
void FAIDataProviderValueDetails::OnDataFieldNameChange(int32 Index)
|
|
{
|
|
FName NameValue = MatchingProperties[Index];
|
|
DataFieldProperty->SetValue(NameValue);
|
|
}
|
|
|
|
FText FAIDataProviderValueDetails::GetDataFieldDesc() const
|
|
{
|
|
FName NameValue;
|
|
DataFieldProperty->GetValue(NameValue);
|
|
|
|
return FText::FromString(NameValue.ToString());
|
|
}
|
|
|
|
FText FAIDataProviderValueDetails::GetValueDesc() const
|
|
{
|
|
return DataPtr ? FText::FromString(DataPtr->ToString()) : LOCTEXT("EmptyValue", "empty");
|
|
}
|
|
|
|
EVisibility FAIDataProviderValueDetails::GetDataFieldVisibility() const
|
|
{
|
|
return (DataPtr && DataPtr->DataBinding && (MatchingProperties.Num() > 1)) ? EVisibility::Visible : EVisibility::Collapsed;
|
|
}
|
|
|
|
EVisibility FAIDataProviderValueDetails::GetBindingDescVisibility() const
|
|
{
|
|
return (DataPtr && DataPtr->DataBinding) ? EVisibility::Visible : EVisibility::Collapsed;
|
|
}
|
|
|
|
EVisibility FAIDataProviderValueDetails::GetDefaultValueVisibility() const
|
|
{
|
|
return (!DataPtr || !DataPtr->DataBinding) ? EVisibility::Visible : EVisibility::Collapsed;
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE
|