// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Input/Reply.h" #include "Layout/Visibility.h" #include "MetasoundFrontendDocument.h" #include "Misc/Attribute.h" #include "SGraphNode.h" #include "SGraphNodeKnot.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/SOverlay.h" // Forward Declarations class SAudioInputWidget; class SGraphPin; class SVerticalBox; class UMetasoundEditorGraphMember; class UMetasoundEditorGraphMemberDefaultLiteral; class UMetasoundEditorGraphMemberNode; class UMetasoundEditorGraphNode; namespace Metasound { namespace Editor { class SMetaSoundGraphNode : public SGraphNode { public: SLATE_BEGIN_ARGS(SMetaSoundGraphNode) { } SLATE_END_ARGS() virtual ~SMetaSoundGraphNode(); void Construct(const FArguments& InArgs, class UEdGraphNode* InNode); protected: bool IsVariableAccessor() const; bool IsVariableMutator() const; // SGraphNode Interface virtual const FSlateBrush* GetShadowBrush(bool bSelected) const override; virtual void CreateInputSideAddButton(TSharedPtr InputBox) override; virtual void CreateOutputSideAddButton(TSharedPtr OutputBox) override; virtual TSharedPtr CreatePinWidget(UEdGraphPin* InPin) const override; virtual void CreateStandardPinWidget(UEdGraphPin* InPin) override; virtual TSharedRef CreateNodeContentArea() override; virtual TSharedRef CreateTitleWidget(TSharedPtr NodeTitle) override; virtual const FSlateBrush* GetNodeBodyBrush() const override; virtual TSharedRef CreateTitleRightWidget() override; virtual EVisibility IsAddPinButtonVisible() const override; virtual FReply OnAddPin() override; virtual void MoveTo(const FVector2D& NewPosition, FNodeSet& NodeFilter, bool bMarkDirty = true) override; virtual void SetDefaultTitleAreaWidget(TSharedRef DefaultTitleAreaWidget) override; virtual void GetOverlayBrushes(bool bSelected, const FVector2D WidgetSize, TArray& Brushes) const override; FLinearColor GetNodeTitleColorOverride() const; FName GetLiteralDataType() const; UMetasoundEditorGraphNode& GetMetaSoundNode(); const UMetasoundEditorGraphNode& GetMetaSoundNode() const; public: static void ExecuteTrigger(UMetasoundEditorGraphMemberDefaultLiteral& Literal); static TSharedRef CreateTriggerSimulationWidget(UMetasoundEditorGraphMemberDefaultLiteral& Literal, TAttribute&& InVisibility, TAttribute&& InEnablement, const FText* InToolTip = nullptr); private: // If this node represents a graph member node, returns corresponding member. UMetasoundEditorGraphMember* GetMetaSoundMember(); // If this node represents a graph member node, returns cast node. UMetasoundEditorGraphMemberNode* GetMetaSoundMemberNode(); TAttribute GetSimulationVisibilityAttribute() const; // Slider widget for float input TSharedPtr InputWidget; // Handle for on value changed delegate for input slider FDelegateHandle InputSliderOnValueChangedDelegateHandle; // Handle for on input slider range changed FDelegateHandle InputSliderOnRangeChangedDelegateHandle; // Whether the input widget is currently transacting // for keeping track of transaction state across delegates to only commit transaction on value commit bool bIsInputWidgetTransacting = false; EMetasoundFrontendClassType ClassType; }; class SMetaSoundGraphNodeKnot : public SGraphNodeKnot { public: SLATE_BEGIN_ARGS(SMetaSoundGraphNode) { } SLATE_END_ARGS() void Construct(const FArguments& InArgs, class UEdGraphNode* InNode); virtual TSharedPtr CreatePinWidget(UEdGraphPin* Pin) const override; virtual void MoveTo(const FVector2D& NewPosition, FNodeSet& NodeFilter, bool bMarkDirty) override; UMetasoundEditorGraphNode& GetMetaSoundNode(); const UMetasoundEditorGraphNode& GetMetaSoundNode() const; }; } // namespace Editor } // namespace Metasound