Files
PHY/Plugins/GCS/Source/GenericGameplayAbilitiesEditor/Private/GGA_AttributeGroupNameCustomization.cpp
2026-03-03 01:23:02 +08:00

178 lines
6.5 KiB
C++

// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#include "GGA_AttributeGroupNameCustomization.h"
#include "DetailWidgetRow.h"
#include "GGA_AbilitySystemGlobals.h"
#include "GGA_AbilitySystemStructLibrary.h"
#include "PropertyCustomizationHelpers.h"
TSharedRef<IPropertyTypeCustomization> FGGA_AttributeGroupNameCustomization::MakeInstance()
{
return MakeShareable(new FGGA_AttributeGroupNameCustomization());
}
void FGGA_AttributeGroupNameCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
const UGGA_AbilitySystemGlobals* Globals = Cast<UGGA_AbilitySystemGlobals>(IGameplayAbilitiesModule::Get().GetAbilitySystemGlobals());
if (Globals == nullptr)
{
return;
}
FNameMap.Reset();
for (const UCurveTable* CurTable : Globals->GetAttributeDefaultsTables())
{
if (!IsValid(CurTable))
{
continue;
}
for (const TPair<FName, FRealCurve*>& CurveRow : CurTable->GetRowMap())
{
FString RowName = CurveRow.Key.ToString();
TArray<FString> RowParts; //[0]GroupName [1]SetName [2]AttribueName
RowName.ParseIntoArray(RowParts, TEXT("."));
if (RowParts.Num() != 3)
{
continue;
}
TArray<FString> GroupParts; //[0]MainName [1]SubName
RowName.ParseIntoArray(GroupParts, TEXT("->"));
if (GroupParts.Num() != 2)
{
//Add class name as group.
FNameMap.FindOrAdd(FName(*RowParts[0]));
}
else if (GroupParts.Num() == 2)
{
TArray<FName>& Rows = FNameMap.FindOrAdd(FName(*GroupParts[0]));
Rows.AddUnique(FName(*GroupParts[1]));
}
}
}
PropertyUtilities = StructCustomizationUtils.GetPropertyUtilities();
MainNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FGGA_AttributeGroupName, MainName));
SubNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FGGA_AttributeGroupName, SubName));
if (MainNamePropertyHandle.IsValid() && SubNamePropertyHandle.IsValid())
{
HeaderRow
.NameContent()
[
StructPropertyHandle->CreatePropertyNameWidget()
]
.ValueContent()
.MinDesiredWidth(600)
.MaxDesiredWidth(4096)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.Padding(1.f, 0.f, 2.f, 0.f)
[
PropertyCustomizationHelpers::MakePropertyComboBox(MainNamePropertyHandle,
FOnGetPropertyComboBoxStrings::CreateStatic(&FGGA_AttributeGroupNameCustomization::GeneratePrimaryComboboxStrings, true,
false, &FNameMap),
FOnGetPropertyComboBoxValue::CreateSP(this, &FGGA_AttributeGroupNameCustomization::GenerateMainString),
FOnPropertyComboBoxValueSelected::CreateSP(this, &FGGA_AttributeGroupNameCustomization::OnMainValueSelected))
]
+ SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.Padding(2.f, 0.f, 2.f, 0.f)
[
PropertyCustomizationHelpers::MakePropertyComboBox(MainNamePropertyHandle,
FOnGetPropertyComboBoxStrings::CreateStatic(&FGGA_AttributeGroupNameCustomization::GenerateSubComboboxStrings, true,
false, &FNameMap,
MainNamePropertyHandle),
FOnGetPropertyComboBoxValue::CreateSP(this, &FGGA_AttributeGroupNameCustomization::GenerateSubString),
FOnPropertyComboBoxValueSelected::CreateSP(this, &FGGA_AttributeGroupNameCustomization::OnSubValueSelected))
]
]
];
}
}
void FGGA_AttributeGroupNameCustomization::GeneratePrimaryComboboxStrings(TArray<TSharedPtr<FString>>& OutComboBoxStrings, TArray<TSharedPtr<SToolTip>>& OutToolTips, TArray<bool>& OutRestrictedItems,
bool bAllowClear, bool bAllowAll,
TMap<FName, TArray<FName>>* InItems)
{
for (auto Iter = InItems->CreateConstIterator(); Iter; ++Iter)
{
OutComboBoxStrings.Add(MakeShared<FString>(Iter.Key().ToString()));
}
}
void FGGA_AttributeGroupNameCustomization::GenerateSubComboboxStrings(TArray<TSharedPtr<FString>>& OutComboBoxStrings, TArray<TSharedPtr<SToolTip>>& OutToolTips,
TArray<bool>& OutRestrictedItems, bool bAllowClear, bool bAllowAll,
TMap<FName, TArray<FName>>* InItems, TSharedPtr<IPropertyHandle> PrimaryKey)
{
void* TagDataPtr = nullptr;
PrimaryKey->GetValueData(TagDataPtr);
const FName* TagPtr = static_cast<FName*>(TagDataPtr);
if (!TagPtr || TagPtr->IsNone())
{
OutComboBoxStrings.Add(MakeShared<FString>("Invalid"));
}
else
{
const auto Arr = InItems->Find(*TagPtr);
if (Arr)
{
for (auto& Name : *Arr)
{
OutComboBoxStrings.Add(MakeShared<FString>(Name.ToString()));
}
}
}
}
FString FGGA_AttributeGroupNameCustomization::GenerateSubString()
{
void* TagDataPtr = nullptr;
SubNamePropertyHandle->GetValueData(TagDataPtr);
const FName* TagPtr = static_cast<FName*>(TagDataPtr);
FString TagString = TagPtr ? TagPtr->ToString() : "Invalid";
return TagString;
}
void FGGA_AttributeGroupNameCustomization::OnSubValueSelected(const FString& String)
{
SubNamePropertyHandle->SetValue(FName(*String));
}
FString FGGA_AttributeGroupNameCustomization::GenerateMainString()
{
void* TagDataPtr = nullptr;
MainNamePropertyHandle->GetValueData(TagDataPtr);
const FName* TagPtr = static_cast<FName*>(TagDataPtr);
FString TagString = TagPtr ? TagPtr->ToString() : "Invalid";
return TagString;
}
void FGGA_AttributeGroupNameCustomization::OnMainValueSelected(const FString& String)
{
MainNamePropertyHandle->SetValue(FName(*String));
SubNamePropertyHandle->ResetToDefault();
}
void FGGA_AttributeGroupNameCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder,
IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
}