You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
94 lines
3.3 KiB
C++
94 lines
3.3 KiB
C++
|
|
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
||
|
|
|
||
|
|
#include "DetailCustomizationsPrivatePCH.h"
|
||
|
|
#include "StringClassReferenceCustomization.h"
|
||
|
|
|
||
|
|
void FStringClassReferenceCustomization::CustomizeStructHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle, FDetailWidgetRow& HeaderRow, IStructCustomizationUtils& StructCustomizationUtils)
|
||
|
|
{
|
||
|
|
// If we are part of an array, we need to take our meta-data from the array property
|
||
|
|
const UProperty* MetaDataProperty = InStructPropertyHandle->GetProperty();
|
||
|
|
if(InStructPropertyHandle->GetIndexInArray() != INDEX_NONE)
|
||
|
|
{
|
||
|
|
TSharedPtr<IPropertyHandle> ParentPropertyHandle = InStructPropertyHandle->GetParentHandle();
|
||
|
|
check(ParentPropertyHandle.IsValid() && ParentPropertyHandle->AsArray().IsValid());
|
||
|
|
MetaDataProperty = ParentPropertyHandle->GetProperty();
|
||
|
|
}
|
||
|
|
|
||
|
|
StructPropertyHandle = InStructPropertyHandle;
|
||
|
|
|
||
|
|
ClassNamePropertyHandle = InStructPropertyHandle->GetChildHandle("ClassName");
|
||
|
|
check(ClassNamePropertyHandle.IsValid());
|
||
|
|
|
||
|
|
const FString& MetaClassName = MetaDataProperty->GetMetaData("MetaClass");
|
||
|
|
const FString& RequiredInterfaceName = MetaDataProperty->GetMetaData("RequiredInterface");
|
||
|
|
const bool bAllowAbstract = MetaDataProperty->GetBoolMetaData("AllowAbstract");
|
||
|
|
const bool bIsBlueprintBaseOnly = MetaDataProperty->GetBoolMetaData("IsBlueprintBaseOnly");
|
||
|
|
const bool bAllowNone = !(MetaDataProperty->PropertyFlags & CPF_NoClear);
|
||
|
|
|
||
|
|
check(!MetaClassName.IsEmpty());
|
||
|
|
const UClass* const MetaClass = StringToClass(MetaClassName);
|
||
|
|
const UClass* const RequiredInterface = StringToClass(RequiredInterfaceName);
|
||
|
|
|
||
|
|
HeaderRow
|
||
|
|
.NameContent()
|
||
|
|
[
|
||
|
|
InStructPropertyHandle->CreatePropertyNameWidget()
|
||
|
|
]
|
||
|
|
.ValueContent()
|
||
|
|
.MinDesiredWidth(250.0f)
|
||
|
|
.MaxDesiredWidth(0.0f)
|
||
|
|
[
|
||
|
|
// Add a class entry box. Even though this isn't an class entry, we will simulate one
|
||
|
|
SNew(SClassPropertyEntryBox)
|
||
|
|
.MetaClass(MetaClass)
|
||
|
|
.RequiredInterface(RequiredInterface)
|
||
|
|
.AllowAbstract(bAllowAbstract)
|
||
|
|
.IsBlueprintBaseOnly(bIsBlueprintBaseOnly)
|
||
|
|
.AllowNone(bAllowNone)
|
||
|
|
.SelectedClass(this, &FStringClassReferenceCustomization::OnGetClass)
|
||
|
|
.OnSetClass(this, &FStringClassReferenceCustomization::OnSetClass)
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
void FStringClassReferenceCustomization::CustomizeStructChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IStructCustomizationUtils& StructCustomizationUtils)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
const UClass* FStringClassReferenceCustomization::OnGetClass() const
|
||
|
|
{
|
||
|
|
FString ClassName;
|
||
|
|
ClassNamePropertyHandle->GetValue(ClassName);
|
||
|
|
|
||
|
|
// Do we have a valid cached class pointer?
|
||
|
|
const UClass* Class = CachedClassPtr.Get();
|
||
|
|
if(!Class || Class->GetPathName() != ClassName)
|
||
|
|
{
|
||
|
|
Class = StringToClass(ClassName);
|
||
|
|
CachedClassPtr = Class;
|
||
|
|
}
|
||
|
|
return Class;
|
||
|
|
}
|
||
|
|
|
||
|
|
void FStringClassReferenceCustomization::OnSetClass(const UClass* NewClass)
|
||
|
|
{
|
||
|
|
if(ClassNamePropertyHandle->SetValueFromFormattedString((NewClass) ? NewClass->GetPathName() : "None") == FPropertyAccess::Result::Success)
|
||
|
|
{
|
||
|
|
CachedClassPtr = NewClass;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const UClass* FStringClassReferenceCustomization::StringToClass(const FString& ClassName)
|
||
|
|
{
|
||
|
|
if(ClassName.IsEmpty() || ClassName == "None")
|
||
|
|
{
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
const UClass* Class = FindObject<UClass>(ANY_PACKAGE, *ClassName);
|
||
|
|
if(!Class)
|
||
|
|
{
|
||
|
|
Class = LoadObject<UClass>(nullptr, *ClassName);
|
||
|
|
}
|
||
|
|
return Class;
|
||
|
|
}
|