Enum handling is now centralized
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user