Files
UnrealEngine/Engine/Plugins/Runtime/ZoneGraph/Source/ZoneGraphEditor/Private/ZoneLaneDescDetails.cpp
2025-05-18 13:04:45 +08:00

132 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ZoneLaneDescDetails.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Images/SImage.h"
#include "DetailWidgetRow.h"
#include "DetailLayoutBuilder.h"
#include "IPropertyUtilities.h"
#include "IDetailPropertyRow.h"
#include "IDetailChildrenBuilder.h"
#include "Widgets/Input/SComboButton.h"
#include "Widgets/Colors/SColorBlock.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "ScopedTransaction.h"
#include "ZoneGraphSettings.h"
#include "ZoneGraphTypes.h"
#include "ZoneGraphPropertyUtils.h"
#include "Modules/ModuleManager.h"
#include "ISettingsModule.h"
#define LOCTEXT_NAMESPACE "ZoneGraphEditor"
TSharedRef<IPropertyTypeCustomization> FZoneLaneDescDetails::MakeInstance()
{
return MakeShareable(new FZoneLaneDescDetails);
}
void FZoneLaneDescDetails::CustomizeHeader(TSharedRef<class IPropertyHandle> StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
StructProperty = StructPropertyHandle;
PropUtils = StructCustomizationUtils.GetPropertyUtilities().Get();
WidthProperty = StructProperty->GetChildHandle(TEXT("Width"));
DirectionProperty = StructProperty->GetChildHandle(TEXT("Direction"));
TagsProperty = StructProperty->GetChildHandle(TEXT("Tags"));
HeaderRow
.WholeRowContent()
[
SNew(SHorizontalBox)
// Tags Color
+ SHorizontalBox::Slot()
.AutoWidth()
.MaxWidth(25)
.VAlign(VAlign_Center)
[
SNew(SColorBlock)
.Color(this, &FZoneLaneDescDetails::GetTagColor)
.Size(FVector2D(16.0f, 16.0f))
]
// Tags Description
+ SHorizontalBox::Slot()
.FillWidth(1.0f)
.VAlign(VAlign_Center)
.Padding(FMargin(6.0f, 2.0f))
[
SNew(STextBlock)
.Text(this, &FZoneLaneDescDetails::GetTagDescription)
.Font(IDetailLayoutBuilder::GetDetailFont())
]
// Description
+ SHorizontalBox::Slot()
.FillWidth(1.0f)
.VAlign(VAlign_Center)
.Padding(FMargin(12.0f, 2.0f, 6.0f, 2.0f))
[
SNew(STextBlock)
.Text(this, &FZoneLaneDescDetails::GetDescription)
.Font(IDetailLayoutBuilder::GetDetailFont())
]
+ SHorizontalBox::Slot()
.Padding(FMargin(12.0f, 0.0f))
.HAlign(HAlign_Right)
[
StructPropertyHandle->CreateDefaultPropertyButtonWidgets()
]
];
}
void FZoneLaneDescDetails::CustomizeChildren(TSharedRef<class IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
uint32 ChildNum = 0;
if (StructPropertyHandle->GetNumChildren(ChildNum) == FPropertyAccess::Success)
{
for (uint32 ChildIndex = 0; ChildIndex < ChildNum; ++ChildIndex)
{
TSharedPtr<IPropertyHandle> ChildProperty = StructPropertyHandle->GetChildHandle(ChildIndex);
if (ChildProperty)
{
StructBuilder.AddProperty(ChildProperty.ToSharedRef());
}
}
}
}
FLinearColor FZoneLaneDescDetails::GetTagColor() const
{
return UE::ZoneGraph::PropertyUtils::GetMaskColor(TagsProperty);
}
FText FZoneLaneDescDetails::GetTagDescription() const
{
return UE::ZoneGraph::PropertyUtils::GetMaskDescription(TagsProperty);
}
FText FZoneLaneDescDetails::GetDescription() const
{
FText Desc;
FText Delimiter = FText::FromString(", ");
float Width = 0.0f;
if (WidthProperty && WidthProperty->GetValue(Width) == FPropertyAccess::Success)
{
FText WidthDesc = FText::AsNumber(Width);
Desc = Desc.IsEmpty() ? WidthDesc : FText::Join(Delimiter, Desc, WidthDesc);
}
uint8 Direction = 0;
if (DirectionProperty && DirectionProperty->GetValue(Direction) == FPropertyAccess::Success)
{
UEnum* Enum = StaticEnum<EZoneLaneDirection>();
if (Enum)
{
FText DirectionDesc = Enum->GetDisplayNameTextByValue(Direction);
Desc = Desc.IsEmpty() ? DirectionDesc : FText::Join(Delimiter, Desc, DirectionDesc);
}
}
return Desc;
}
#undef LOCTEXT_NAMESPACE