Files
ProjectEleri/Source/ProjectEleriEditor/Private/ItemDataAssetCustomization.cpp
2026-07-11 10:43:52 +02:00

97 lines
2.9 KiB
C++

#include "ItemDataAssetCustomization.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "Widgets/SNullWidget.h"
#include "Blueprint/UserWidget.h"
#include "Editor.h"
#include "ProjectEleri/Items/DataAssets/ItemDataAsset.h"
#include "DetailWidgetRow.h"
#include "ProjectEleri/Public/UI/PropertyMapWidget.h"
TSharedRef<IDetailCustomization> FItemDataAssetCustomization::MakeInstance() {
return MakeShareable(new FItemDataAssetCustomization());
}
void FItemDataAssetCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) {
IDetailCategoryBuilder& Category = DetailBuilder.EditCategory("Property Map");
// --- Add a Button Row ---
Category.AddCustomRow(FText::FromString("Property Map Action Buttons"))
.ValueContent()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SButton)
.Text(FText::FromString("Generate new map"))
.OnClicked_Lambda([&DetailBuilder, this]() {
// Get the first asset being customized
TArray<TWeakObjectPtr<UObject>> Objects;
DetailBuilder.GetObjectsBeingCustomized(Objects);
if (Objects.Num() > 0) {
if (UItemDataAsset* DataAsset = Cast<UItemDataAsset>(Objects[0].Get())) {
DataAsset->BuildPropertyMap();
if (PropertyMapWidget) {
PropertyMapWidget->UpdateData(DataAsset->PropertyMap);
}
}
}
return FReply::Handled();
})
]
+ SHorizontalBox::Slot()
.AutoWidth()
.Padding(5, 0)
[
SNew(SButton)
.Text(FText::FromString("Refresh map display"))
.OnClicked_Lambda([&DetailBuilder, this]() {
if (PropertyMapWidget) {
PropertyMapWidget->RefreshData();
}
return FReply::Handled();
})
]
];
// Get the first asset being edited
TArray<TWeakObjectPtr<UObject>> Objects;
DetailBuilder.GetObjectsBeingCustomized(Objects);
if (Objects.Num() == 0) return;
UItemDataAsset* DataAsset = Cast<UItemDataAsset>(Objects[0].Get());
if (!DataAsset) return;
// Load your widget
const FString WidgetPath = TEXT("/Game/Scripts/BookOfAlchemy/WBP_PropertyMapWidget.WBP_PropertyMapWidget_C");
UClass* WidgetClass = LoadClass<UUserWidget>(nullptr, *WidgetPath);
if (!WidgetClass) return;
UWorld* World = GEditor->GetEditorWorldContext().World();
if (!World) return;
PropertyMapWidget = CreateWidget<UPropertyMapWidget>(World, WidgetClass);
if (!PropertyMapWidget) return;
// Set the TargetAsset property if it exists
FProperty* Prop = PropertyMapWidget->GetClass()->FindPropertyByName(TEXT("TargetAsset"));
if (Prop && Prop->IsA(FObjectProperty::StaticClass())) {
FObjectProperty* ObjProp = CastField<FObjectProperty>(Prop);
ObjProp->SetObjectPropertyValue_InContainer(PropertyMapWidget, DataAsset);
}
Category.AddCustomRow(FText::FromString("Custom Widget"))
.ValueContent()
[
SNew(SBox)
.WidthOverride(480)
.HeightOverride(480)
[
PropertyMapWidget->TakeWidget()
]
];
PropertyMapWidget->UpdateData(DataAsset->PropertyMap);
}