//////////////////////////////////////////////////////////// // // FormatMessage.h // // Two K2Nodes: FormatMessage and FormatLogMessage. // FormatMessage outputs a formatted string as a pin. // FormatLogMessage outputs it to the log instead. // // FormatLogMessage is a derived class that just sets // a flag to alter the base class behavior. // //////////////////////////////////////////////////////////// #pragma once #include "BreakToDebugger.h" #include "FormatDataLibrary.h" #include "Containers/Array.h" #include "CoreMinimal.h" #include "EdGraph/EdGraphNode.h" #include "EdGraph/EdGraphPin.h" #include "HAL/Platform.h" #include "Internationalization/Text.h" #include "K2Node.h" #include "UObject/NameTypes.h" #include "UObject/ObjectMacros.h" #include "UObject/UObjectGlobals.h" #include "FormatMessage.generated.h" //////////////////////////////////////////////////////////// // // ElxFormatLogVerbosity // // Controls the ELogVerbosity of the UE_LOG directive inside // FormatLogMessage. Also controls the throttling of log // messages. // // Fatal is deliberately placed at the end so that the // editor defaults to Error (value 0) when the dropdown is // uninitialized. The numeric values don't match // ELogVerbosity, so a conversion function is needed. // //////////////////////////////////////////////////////////// UENUM(BlueprintType) enum class ElxFormatLogVerbosity : uint8 { /** Prints an error to the console and log file. The editor collects and reports errors. */ Error, /** Prints a warning to the console and log file. The editor collects and reports warnings. */ Warning, /** Prints a message to the console and log file. */ Display, /** Prints a message to the log file, but not to the console. */ Log, /** Like Display, but suppresses repeated messages with the same format pattern (at most once per second). */ ThrottledDisplay, /** Like Log, but suppresses repeated messages with the same format pattern (at most once per second). */ ThrottledLog, /** Prints a message to the log file only if Verbose logging is enabled for the given category. */ Verbose, /** Prints a message to the log file only if VeryVerbose logging is enabled. */ VeryVerbose, /** Prints a fatal error to the console and log file, then crashes (this crashes the editor too). */ Fatal, }; class FBlueprintActionDatabaseRegistrar; class FString; class UEdGraph; class UObject; //////////////////////////////////////////////////////////// // // UK2Node_FormatMessage // //////////////////////////////////////////////////////////// UCLASS(MinimalAPI) class UK2Node_FormatMessage : public UK2Node { GENERATED_UCLASS_BODY() //~ Begin UObject Interface virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override; //~ End UObject Interface //~ Begin UEdGraphNode Interface. virtual void AllocateDefaultPins() override; virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override; virtual bool ShouldShowNodeProperties() const override { return true; } virtual void PinConnectionListChanged(UEdGraphPin* Pin) override; virtual void PinDefaultValueChanged(UEdGraphPin* Pin) override; virtual void PinTypeChanged(UEdGraphPin* Pin) override; virtual FText GetTooltipText() const override; virtual FText GetPinDisplayName(const UEdGraphPin* Pin) const override; //~ End UEdGraphNode Interface. //~ Begin UK2Node Interface. virtual bool IsNodePure() const override { return false; } virtual void PostReconstructNode() override; virtual bool NodeCausesStructuralBlueprintChange() const override { return true; } virtual void ExpandNode(class FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph) override; virtual ERedirectType DoPinsMatchForReconstruction(const UEdGraphPin* NewPin, int32 NewPinIndex, const UEdGraphPin* OldPin, int32 OldPinIndex) const override; virtual bool IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const override; virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override; virtual FText GetMenuCategory() const override; virtual int32 GetNodeRefreshPriority() const override { return EBaseNodeRefreshPriority::Low_UsesDependentWildcard; } //~ End UK2Node Interface. protected: // Create all necessary pins. // void CreateCorrectPins(); // Synchronize the type of the given argument pin // with the type its connected to, or reset it to // a wildcard pin if there's no connection. // void SynchronizeArgumentPinType(UEdGraphPin* Pin); // Derived class sets this to true, altering // the behavior of this K2Node. // virtual bool IsFormatErrorMessage() const { return false; } // When IsFormatErrorMessage is true, the K2Node // macroexpands to call this function, which // formats the message and outputs it to the log. // UFUNCTION(BlueprintCallable, meta=(WorldContext = "Context", BlueprintInternalUseOnly = "true")) static void FormatLogMessageInternal(UObject *Context, ElxFormatLogVerbosity Verbosity, const FString &InPattern, TArray InArgs); private: static ELogVerbosity::Type ConvertElxFormatLogVerbosity(ElxFormatLogVerbosity Verbosity); protected: // Argument names added to the node, generated as pins // during construction. // UPROPERTY() TArray PinNames; // Tooltip text for this node. // FText NodeTooltip; }; //////////////////////////////////////////////////////////// // // UK2Node_FormatLogMessage // // Derives from FormatMessage. Sets a flag to make // the base class output to the log instead of to // a pin. // //////////////////////////////////////////////////////////// UCLASS(MinimalAPI) class UK2Node_FormatLogMessage : public UK2Node_FormatMessage { GENERATED_UCLASS_BODY() virtual bool IsFormatErrorMessage() const override { return true; } };