97 lines
2.9 KiB
C++
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);
|
|
}
|
|
|