Enum handling is now centralized

This commit is contained in:
2026-03-19 11:19:31 -04:00
parent 23c096b614
commit a9258f3a86
4 changed files with 26 additions and 47 deletions

View File

@@ -29,31 +29,6 @@ FString FWingProperty::GetText() const
return Result; return Result;
} }
bool FWingProperty::TryParseEnum(UEnum* Enum, const FString& Text, int64 &OutValue)
{
int Index = Enum->GetIndexByNameString(Text);
if (Index == INDEX_NONE)
{
FString Prefix = Enum->GenerateEnumPrefix();
if (!Prefix.IsEmpty())
{
Index = Enum->GetIndexByNameString(Prefix + TEXT("_") + Text);
}
}
if (Index == INDEX_NONE)
{
UWingServer::Printf(TEXT("ERROR: '%s' is not a valid value for %s\n"),
*Text, *Enum->GetName());
OutValue = 0;
return false;
}
else
{
OutValue = Enum->GetValueByIndex(Index);
return true;
}
}
bool FWingProperty::SetText(const FString &Value) bool FWingProperty::SetText(const FString &Value)
{ {
void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(Container); void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(Container);
@@ -66,23 +41,23 @@ bool FWingProperty::SetText(const FString &Value)
if (IsPinTypeProperty(Prop)) if (IsPinTypeProperty(Prop))
return UWingTypes::TextToType(Value, *static_cast<FEdGraphPinType*>(ValuePtr)); return UWingTypes::TextToType(Value, *static_cast<FEdGraphPinType*>(ValuePtr));
// Byte Enum types get parsed by TryParseEnum, above. // Byte Enum types.
if (FByteProperty* ByteProp = CastField<FByteProperty>(Prop)) if (FByteProperty* ByteProp = CastField<FByteProperty>(Prop))
{ {
if (UEnum* Enum = ByteProp->Enum) if (UEnum* Enum = ByteProp->Enum)
{ {
int64 EnumValue; int64 EnumValue;
if (!TryParseEnum(Enum, Value, EnumValue)) return false; if (!WingUtils::StringToEnum(Enum, Value, EnumValue)) return false;
ByteProp->SetPropertyValue(ValuePtr, (uint8)EnumValue); ByteProp->SetPropertyValue(ValuePtr, (uint8)EnumValue);
return true; return true;
} }
} }
// Regular Enum types get parsed by TryParseEnum, above. // Regular Enum types.
if (FEnumProperty* EnumProp = CastField<FEnumProperty>(Prop)) if (FEnumProperty* EnumProp = CastField<FEnumProperty>(Prop))
{ {
int64 EnumValue; int64 EnumValue;
if (!TryParseEnum(EnumProp->GetEnum(), Value, EnumValue)) return false; if (!WingUtils::StringToEnum(EnumProp->GetEnum(), Value, EnumValue)) return false;
EnumProp->GetUnderlyingProperty()->SetIntPropertyValue(ValuePtr, EnumValue); EnumProp->GetUnderlyingProperty()->SetIntPropertyValue(ValuePtr, EnumValue);
return true; return true;
} }

View File

@@ -267,22 +267,27 @@ FString WingUtils::WrapText(const FString& Text, int32 ColLimit, const FString&
// Enum helpers // Enum helpers
// ============================================================ // ============================================================
FString WingUtils::EnumToString(UEnum* Enum, int64 Value, const FString& Prefix) FString WingUtils::EnumToString(UEnum* Enum, int64 Value)
{ {
FString Full = Enum->GetNameStringByValue(Value); return Enum->GetNameStringByValue(Value);
if (!Prefix.IsEmpty() && Full.StartsWith(Prefix))
return Full.Mid(Prefix.Len());
return Full;
} }
bool WingUtils::StringToEnum(UEnum* Enum, const FString& Str, int64& OutValue, const FString& Prefix) bool WingUtils::StringToEnum(UEnum* Enum, const FString& Str, int64& OutValue)
{ {
OutValue = Enum->GetValueByNameString(Prefix + Str); int32 Index = Enum->GetIndexByNameString(Str);
if (OutValue == INDEX_NONE) if (Index == INDEX_NONE)
{ {
UWingServer::Printf(TEXT("ERROR: Invalid value '%s' for %s\n"), *Str, *Enum->GetName()); FString Prefix = Enum->GenerateEnumPrefix();
if (!Prefix.IsEmpty())
Index = Enum->GetIndexByNameString(Prefix + TEXT("_") + Str);
}
if (Index == INDEX_NONE)
{
UWingServer::Printf(TEXT("ERROR: '%s' is not a valid value for %s\n"), *Str, *Enum->GetName());
OutValue = 0;
return false; return false;
} }
OutValue = Enum->GetValueByIndex(Index);
return true; return true;
} }

View File

@@ -27,7 +27,6 @@ struct FWingProperty
static FWingProperty FindOneExactMatch(const TArray<FWingProperty>& Props, const FString& Name); static FWingProperty FindOneExactMatch(const TArray<FWingProperty>& Props, const FString& Name);
private: private:
bool TryParseEnum(UEnum* Enum, const FString& Text, int64 &OutValue);
static void Collect(UStruct* StructType, void* Container, TArray<FWingProperty> &Props, EPropertyFlags Flags); static void Collect(UStruct* StructType, void* Container, TArray<FWingProperty> &Props, EPropertyFlags Flags);
static void Collect(UObject* Container, TArray<FWingProperty> &Props, EPropertyFlags Flags); static void Collect(UObject* Container, TArray<FWingProperty> &Props, EPropertyFlags Flags);
}; };

View File

@@ -128,20 +128,20 @@ public:
static FString FormatNodeTitle(const UEdGraphNode *Node); static FString FormatNodeTitle(const UEdGraphNode *Node);
// ----- Enum helpers ----- // ----- Enum helpers -----
static FString EnumToString(UEnum* Enum, int64 Value, const FString& Prefix = FString()); static FString EnumToString(UEnum* Enum, int64 Value);
static bool StringToEnum(UEnum* Enum, const FString& Str, int64& OutValue, const FString& Prefix = FString()); static bool StringToEnum(UEnum* Enum, const FString& Str, int64& OutValue);
template<typename T> template<typename T>
static FString EnumToString(TEnumAsByte<T> Value, const FString& Prefix = FString()) static FString EnumToString(TEnumAsByte<T> Value)
{ return EnumToString(StaticEnum<T>(), (int64)Value, Prefix); } { return EnumToString(StaticEnum<T>(), (int64)Value); }
template<typename T> template<typename T>
static FString EnumToString(T Value, const FString& Prefix = FString()) static FString EnumToString(T Value)
{ return EnumToString(StaticEnum<T>(), (int64)Value, Prefix); } { return EnumToString(StaticEnum<T>(), (int64)Value); }
template<typename T> template<typename T>
static bool StringToEnum(const FString& Str, T& OutValue, const FString& Prefix = FString()) static bool StringToEnum(const FString& Str, T& OutValue)
{ int64 V; if (!StringToEnum(StaticEnum<T>(), Str, V, Prefix)) return false; OutValue = (T)V; return true; } { int64 V; if (!StringToEnum(StaticEnum<T>(), Str, V)) return false; OutValue = (T)V; return true; }
// ----- Blueprint helpers ----- // ----- Blueprint helpers -----
static TArray<UEdGraph*> AllGraphs(UBlueprint* BP); static TArray<UEdGraph*> AllGraphs(UBlueprint* BP);