Lots more work on FormatErrorMessage
This commit is contained in:
Binary file not shown.
@@ -58,6 +58,16 @@ static FString ArgumentNameRemovePrefix(const FName &name) {
|
|||||||
return name.ToString().Mid(2, FName::StringBufferSize);
|
return name.ToString().Mid(2, FName::StringBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const FName VerbosityPinName(TEXT("Verbosity"));
|
||||||
|
static bool IsVerbosityPin(const UEdGraphPin *Pin) {
|
||||||
|
return (Pin->PinName == VerbosityPinName);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const FName DisplayDurationPinName(TEXT("DisplayDuration"));
|
||||||
|
static bool IsDisplayDurationPin(const UEdGraphPin *Pin) {
|
||||||
|
return (Pin->PinName == DisplayDurationPinName);
|
||||||
|
}
|
||||||
|
|
||||||
static const FName FormatPinName(TEXT("Format"));
|
static const FName FormatPinName(TEXT("Format"));
|
||||||
static bool IsFormatPin(const UEdGraphPin *Pin) {
|
static bool IsFormatPin(const UEdGraphPin *Pin) {
|
||||||
return (Pin->PinName == FormatPinName);
|
return (Pin->PinName == FormatPinName);
|
||||||
@@ -78,15 +88,28 @@ void UK2Node_FormatError::AllocateDefaultPins()
|
|||||||
void UK2Node_FormatError::CreateCorrectPins()
|
void UK2Node_FormatError::CreateCorrectPins()
|
||||||
{
|
{
|
||||||
if (FindPin(UEdGraphSchema_K2::PN_Execute) == nullptr) {
|
if (FindPin(UEdGraphSchema_K2::PN_Execute) == nullptr) {
|
||||||
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Execute);
|
CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FindPin(UEdGraphSchema_K2::PN_Then) == nullptr) {
|
if (FindPin(UEdGraphSchema_K2::PN_Then) == nullptr) {
|
||||||
UEdGraphPin *P = CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Then);
|
CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Then);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FindPin(FormatPinName, EGPD_Input) == nullptr) {
|
if (FindPin(FormatPinName, EGPD_Input) == nullptr) {
|
||||||
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Text, FormatPinName);
|
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Text, FormatPinName);
|
||||||
|
P->DefaultTextValue = LOCTEXT("FormatErrorMessage_DefaultMessage", "Error Message");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FindPin(VerbosityPinName, EGPD_Input) == nullptr) {
|
||||||
|
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Byte, StaticEnum<ElxLogVerbosity>(), VerbosityPinName);
|
||||||
|
P->DefaultValue = TEXT("Error");
|
||||||
|
P->AutogeneratedDefaultValue = P->DefaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FindPin(DisplayDurationPinName, EGPD_Input) == nullptr) {
|
||||||
|
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Byte, StaticEnum<ElxDisplayDuration>(), DisplayDurationPinName);
|
||||||
|
P->DefaultValue = TEXT("No_Display");
|
||||||
|
P->AutogeneratedDefaultValue = P->DefaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transfer all Existing Argument pins to the Old Pins Map.
|
// Transfer all Existing Argument pins to the Old Pins Map.
|
||||||
@@ -110,7 +133,7 @@ void UK2Node_FormatError::CreateCorrectPins()
|
|||||||
OldPins.Remove(Name);
|
OldPins.Remove(Name);
|
||||||
} else {
|
} else {
|
||||||
FName PrefixedName = ArgumentNameAddPrefix(Name);
|
FName PrefixedName = ArgumentNameAddPrefix(Name);
|
||||||
UEdGraphPin *P = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Wildcard, PrefixedName);
|
CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Wildcard, PrefixedName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,9 +198,15 @@ FText UK2Node_FormatError::GetNodeTitle(ENodeTitleType::Type TitleType) const
|
|||||||
|
|
||||||
FText UK2Node_FormatError::GetPinDisplayName(const UEdGraphPin* Pin) const
|
FText UK2Node_FormatError::GetPinDisplayName(const UEdGraphPin* Pin) const
|
||||||
{
|
{
|
||||||
// These pins should be unlabeled.
|
// Many pins can go unlabeled if they have default values.
|
||||||
if ((Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Exec) || (IsFormatPin(Pin))) {
|
if ((Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Exec) ||
|
||||||
return FText::GetEmpty();
|
IsFormatPin(Pin) || IsVerbosityPin(Pin) || IsDisplayDurationPin(Pin))
|
||||||
|
{
|
||||||
|
if (Pin->LinkedTo.Num() == 0) {
|
||||||
|
return FText::GetEmpty();
|
||||||
|
} else {
|
||||||
|
return FText::FromName(Pin->PinName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For argument pins, we must strip off the Argument Pin Prefix.
|
// For argument pins, we must strip off the Argument Pin Prefix.
|
||||||
@@ -443,6 +472,8 @@ void UK2Node_FormatError::ExpandNode(class FKismetCompilerContext& CompilerConte
|
|||||||
|
|
||||||
// Move connection of "Format" pin to the call function's "InPattern" pin
|
// Move connection of "Format" pin to the call function's "InPattern" pin
|
||||||
CompilerContext.MovePinLinksToIntermediate(*FindPinChecked(FormatPinName), *CallFormatFunction->FindPinChecked(TEXT("InPattern")));
|
CompilerContext.MovePinLinksToIntermediate(*FindPinChecked(FormatPinName), *CallFormatFunction->FindPinChecked(TEXT("InPattern")));
|
||||||
|
CompilerContext.MovePinLinksToIntermediate(*FindPinChecked(VerbosityPinName), *CallFormatFunction->FindPinChecked(TEXT("Verbosity")));
|
||||||
|
CompilerContext.MovePinLinksToIntermediate(*FindPinChecked(DisplayDurationPinName), *CallFormatFunction->FindPinChecked(TEXT("DisplayDuration")));
|
||||||
|
|
||||||
// Link up the Exec pins.
|
// Link up the Exec pins.
|
||||||
CompilerContext.MovePinLinksToIntermediate(*GetExecPin(), *CallFormatFunction->GetExecPin());
|
CompilerContext.MovePinLinksToIntermediate(*GetExecPin(), *CallFormatFunction->GetExecPin());
|
||||||
@@ -499,7 +530,7 @@ UK2Node::ERedirectType UK2Node_FormatError::DoPinsMatchForReconstruction(const U
|
|||||||
|
|
||||||
bool UK2Node_FormatError::IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const
|
bool UK2Node_FormatError::IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const
|
||||||
{
|
{
|
||||||
// The format pin cannot be connected to anything. It must be a constant string.
|
// The following pins cannot be connected. They are meant to be hardwired constants.
|
||||||
if (IsFormatPin(MyPin))
|
if (IsFormatPin(MyPin))
|
||||||
{
|
{
|
||||||
OutReason = LOCTEXT("Error_FormatStringMustBeHardwired", "Format string must be a hardwired constant.").ToString();
|
OutReason = LOCTEXT("Error_FormatStringMustBeHardwired", "Format string must be a hardwired constant.").ToString();
|
||||||
@@ -565,10 +596,41 @@ FText UK2Node_FormatError::GetMenuCategory() const
|
|||||||
return FEditorCategoryUtils::GetCommonCategory(FCommonEditorCategory::Text);
|
return FEditorCategoryUtils::GetCommonCategory(FCommonEditorCategory::Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UlxFormatErrorLibrary::FormatErrorInternal(FText InPattern, TArray<FFormatArgumentData> InArgs)
|
void UlxFormatErrorLibrary::FormatErrorInternal(ElxLogVerbosity Verbosity, ElxDisplayDuration DisplayDuration, FText InPattern, TArray<FFormatArgumentData> InArgs)
|
||||||
{
|
{
|
||||||
|
// Generate the formatted string.
|
||||||
FText Message = FTextFormatter::Format(MoveTemp(InPattern), MoveTemp(InArgs), false, false);
|
FText Message = FTextFormatter::Format(MoveTemp(InPattern), MoveTemp(InArgs), false, false);
|
||||||
UKismetSystemLibrary::PrintString(NULL, Message.ToString(), true, true, FLinearColor(0.0, 0.66, 1.0), 30.0, NAME_None);
|
FString MessageString = Message.ToString();
|
||||||
|
|
||||||
|
// Convert the DisplayDuration enum into a number of seconds.
|
||||||
|
int Seconds = int(DisplayDuration);
|
||||||
|
if (Seconds > 100) Seconds = (Seconds - 100) * 60;
|
||||||
|
|
||||||
|
// Choose a color appropriate to the verbosity level.
|
||||||
|
FLinearColor Color;
|
||||||
|
switch (Verbosity) {
|
||||||
|
case ElxLogVerbosity::Fatal : Color = FLinearColor(1.0, 0.6, 0.6); break;
|
||||||
|
case ElxLogVerbosity::Error : Color = FLinearColor(1.0, 0.6, 0.6); break;
|
||||||
|
case ElxLogVerbosity::Warning : Color = FLinearColor(0.9, 0.9, 0.6); break;
|
||||||
|
default: Color = FLinearColor(0.8, 0.8, 0.8); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output to Log
|
||||||
|
switch (Verbosity) {
|
||||||
|
case ElxLogVerbosity::Fatal: UE_LOG(LogBlueprint, Fatal, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::Error: UE_LOG(LogBlueprint, Error, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::Warning: UE_LOG(LogBlueprint, Warning, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::Display: UE_LOG(LogBlueprint, Display, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::Log: UE_LOG(LogBlueprint, Log, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::Verbose: UE_LOG(LogBlueprint, Verbose, TEXT("%s"), *MessageString); break;
|
||||||
|
case ElxLogVerbosity::VeryVerbose: UE_LOG(LogBlueprint, VeryVerbose, TEXT("%s"), *MessageString); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output to Screen (Maybe)
|
||||||
|
if (Seconds != 0) {
|
||||||
|
UKismetSystemLibrary::PrintText(NULL, Message, true, false, Color, Seconds, NAME_None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#undef LOCTEXT_NAMESPACE
|
#undef LOCTEXT_NAMESPACE
|
||||||
|
|||||||
@@ -20,6 +20,51 @@ class FString;
|
|||||||
class UEdGraph;
|
class UEdGraph;
|
||||||
class UObject;
|
class UObject;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Export log verbosity to blueprints.
|
||||||
|
//
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ElxLogVerbosity : uint8 {
|
||||||
|
Fatal,
|
||||||
|
Error,
|
||||||
|
Warning,
|
||||||
|
Display,
|
||||||
|
Log,
|
||||||
|
Verbose,
|
||||||
|
VeryVerbose,
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Display Duration - how long to show a message on-screen.
|
||||||
|
//
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ElxDisplayDuration : uint8 {
|
||||||
|
No_Display = 0,
|
||||||
|
Display_1_Seconds = 1,
|
||||||
|
Display_2_Seconds = 2,
|
||||||
|
Display_3_Seconds = 3,
|
||||||
|
Display_4_Seconds = 4,
|
||||||
|
Display_5_Seconds = 5,
|
||||||
|
Display_10_Seconds = 10,
|
||||||
|
Display_20_Seconds = 20,
|
||||||
|
Display_30_Seconds = 30,
|
||||||
|
Display_40_Seconds = 40,
|
||||||
|
Display_50_Seconds = 50,
|
||||||
|
Display_60_Seconds = 60,
|
||||||
|
Display_70_Seconds = 70,
|
||||||
|
Display_80_Seconds = 80,
|
||||||
|
Display_90_Seconds = 90,
|
||||||
|
Display_1_Minute = 101,
|
||||||
|
Display_2_Minutes = 102,
|
||||||
|
Display_3_Minutes = 103,
|
||||||
|
Display_4_Minutes = 104,
|
||||||
|
Display_5_Minutes = 105,
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Library functions used by Format Error Message.
|
||||||
|
//
|
||||||
UCLASS(MinimalAPI)
|
UCLASS(MinimalAPI)
|
||||||
class UlxFormatErrorLibrary : public UBlueprintFunctionLibrary
|
class UlxFormatErrorLibrary : public UBlueprintFunctionLibrary
|
||||||
{
|
{
|
||||||
@@ -27,9 +72,13 @@ class UlxFormatErrorLibrary : public UBlueprintFunctionLibrary
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true"))
|
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true"))
|
||||||
static void FormatErrorInternal(FText InPattern, TArray<FFormatArgumentData> InArgs);
|
static void FormatErrorInternal(ElxLogVerbosity Verbosity, ElxDisplayDuration DisplayDuration, FText InPattern, TArray<FFormatArgumentData> InArgs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Library functions used by Format Error Message, and also
|
||||||
|
// by scripters writing their own Error Message Handler classes.
|
||||||
|
//
|
||||||
UCLASS(MinimalAPI)
|
UCLASS(MinimalAPI)
|
||||||
class UK2Node_FormatError : public UK2Node
|
class UK2Node_FormatError : public UK2Node
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user