#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 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> Objects; DetailBuilder.GetObjectsBeingCustomized(Objects); if (Objects.Num() > 0) { if (UItemDataAsset* DataAsset = Cast(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> Objects; DetailBuilder.GetObjectsBeingCustomized(Objects); if (Objects.Num() == 0) return; UItemDataAsset* DataAsset = Cast(Objects[0].Get()); if (!DataAsset) return; // Load your widget const FString WidgetPath = TEXT("/Game/Scripts/BookOfAlchemy/WBP_PropertyMapWidget.WBP_PropertyMapWidget_C"); UClass* WidgetClass = LoadClass(nullptr, *WidgetPath); if (!WidgetClass) return; UWorld* World = GEditor->GetEditorWorldContext().World(); if (!World) return; PropertyMapWidget = CreateWidget(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(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); }