// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Array.h" #include "Containers/Set.h" #include "Containers/UnrealString.h" #include "Delegates/Delegate.h" #include "Fonts/SlateFontInfo.h" #include "HAL/PlatformMath.h" #include "Input/CursorReply.h" #include "Input/DragAndDrop.h" #include "Input/Reply.h" #include "Internationalization/Text.h" #include "Layout/Children.h" #include "Layout/Geometry.h" #include "Math/Color.h" #include "Math/Vector2D.h" #include "Misc/Attribute.h" #include "Styling/AppStyle.h" #include "Styling/SlateColor.h" #include "Templates/SharedPointer.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/SCompoundWidget.h" #include "Widgets/SPanel.h" #include "DragAndDrop/AssetDragDropOp.h" class FArrangedChildren; class FChildren; class FMenuBuilder; class FPaintArgs; class FSlateRect; class FSlateWindowElementList; class FUICommandList; class FWidgetStyle; class SWidget; class UObject; class UAnimSequenceBase; struct FPointerEvent; struct FSlateBrush; ////////////////////////////////////////////////////////////////////////// DECLARE_DELEGATE_OneParam( FOnSelectionChanged, const TArray& ) DECLARE_DELEGATE( FOnNodeSelectionChanged ) DECLARE_DELEGATE( FOnUpdatePanel ) DECLARE_DELEGATE_RetVal_TwoParams( bool, FOnGetBarPos, int32, float& ) DECLARE_DELEGATE_OneParam( FOnBarClicked, int32) DECLARE_DELEGATE_TwoParams( FOnBarDrag, int32, float) DECLARE_DELEGATE_OneParam( FOnBarDrop, int32 ) DECLARE_DELEGATE_TwoParams( FOnTrackDragDop, TSharedPtr, float ) DECLARE_DELEGATE_RetVal_OneParam( bool, FOnAssetDragDrop, TSharedPtr) DECLARE_DELEGATE_RetVal_TwoParams(bool, FIsAnimAssetValid, const UAnimSequenceBase*, FText* OutReason) DECLARE_DELEGATE_RetVal( FString, FOnGetNodeName ) DECLARE_DELEGATE_OneParam( FOnTrackNodeDragged, float ) DECLARE_DELEGATE( FOnTrackNodeDropped ) DECLARE_DELEGATE( FOnTrackNodeClicked ) DECLARE_DELEGATE( FOnTrackNodeDoubleClicked ) DECLARE_DELEGATE_RetVal_TwoParams( TSharedPtr, FOnSummonContextMenu, const FGeometry&, const FPointerEvent& ); DECLARE_DELEGATE_ThreeParams( FOnTrackRightClickContextMenu, FMenuBuilder&, float, int32 ) DECLARE_DELEGATE_OneParam( FOnNodeRightClickContextMenu, FMenuBuilder& ) typedef TSet STrackNodeSelectionSet; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class FTrackNodeDragDropOp : public FDragDropOperation { public: DRAG_DROP_OPERATOR_TYPE(FTrackNodeDragDropOp, FDragDropOperation) virtual void OnDrop( bool bDropWasHandled, const FPointerEvent& MouseEvent ) override; virtual void OnDragged( const class FDragDropEvent& DragDropEvent ) override; static TSharedRef New(TSharedRef TrackNode, const FVector2D &CursorPosition, const FVector2D &ScreenPositionOfNode); /** Gets the widget that will serve as the decorator unless overridden. If you do not override, you will have no decorator */ virtual TSharedPtr GetDefaultDecorator() const override; protected: /** The window that shows hover text */ FVector2D Offset; FVector2D StartingScreenPos; TWeakPtr OriginalTrackNode; TWeakPtr OriginalTrack; FString GetHoverText() const { FString HoverText = TEXT("Invalid"); return HoverText; } friend class STrack; friend class STrackNode; }; /** class STrackNode for STrack. * This is Children for STrack */ class STrackNode : public SCompoundWidget { public: SLATE_BEGIN_ARGS( STrackNode ) : _ViewInputMin() , _ViewInputMax() , _DataLength() , _DataStartPos() , _NodeName() , _NodeColor() , _SelectedNodeColor() , _NodeSelectionSet(NULL) , _AllowDrag(true) , _OnTrackNodeDragged() , _OnTrackNodeDropped() , _OnSelectionChanged() , _OnNodeRightClickContextMenu() , _OnTrackNodeClicked() , _OnTrackNodeDoubleClicked() , _CenterOnPosition(false) { } // have delegates for update functions SLATE_ATTRIBUTE( float, ViewInputMin ) SLATE_ATTRIBUTE( float, ViewInputMax ) SLATE_ATTRIBUTE( float, DataLength ) SLATE_ATTRIBUTE( float, DataStartPos ) SLATE_ATTRIBUTE( FString, NodeName ) SLATE_ATTRIBUTE( FLinearColor, NodeColor ) SLATE_ATTRIBUTE( FLinearColor, SelectedNodeColor ) SLATE_ARGUMENT( STrackNodeSelectionSet *, NodeSelectionSet ) SLATE_ARGUMENT( bool, AllowDrag ) SLATE_EVENT( FOnTrackNodeDragged, OnTrackNodeDragged ) SLATE_EVENT( FOnTrackNodeDropped, OnTrackNodeDropped ) SLATE_EVENT( FOnNodeSelectionChanged, OnSelectionChanged ) SLATE_EVENT( FOnNodeRightClickContextMenu, OnNodeRightClickContextMenu ) SLATE_EVENT( FOnTrackNodeClicked, OnTrackNodeClicked ) SLATE_EVENT( FOnTrackNodeDoubleClicked, OnTrackNodeDoubleClicked) SLATE_ARGUMENT( bool, CenterOnPosition ) SLATE_NAMED_SLOT(FArguments, OverrideContent) SLATE_END_ARGS() void Construct(const FArguments& Declaration); // mouse interface for tooltip/selection virtual FReply OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual FReply OnMouseMove( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual void OnMouseEnter( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual void OnMouseLeave( const FPointerEvent& MouseEvent ) override; virtual void OnDragged(const class FDragDropEvent& DragDropEvent ); virtual FReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override; // virtual draw related functions virtual FVector2D GetOffsetRelativeToParent(const FGeometry& ParentAllottedGeometry) const; virtual FVector2D GetSizeRelativeToParent(const FGeometry& ParentAllottedGeometry) const; // drag drop relationship virtual FReply OnDragDetected( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual FReply OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; void OnDropCancelled(const FPointerEvent& MouseEvent); virtual FReply BeginDrag( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ); virtual FVector2D GetDragDropScreenSpacePosition(const FGeometry& ParentAllottedGeometry, const FDragDropEvent& DragDropEvent) const; bool HitTest(const FGeometry& AllottedGeometry, FVector2D MouseLocalPose) const; virtual FVector2D GetSize() const; float GetDataStartPos() const; /** Return whether this node should snap to the tracks draggable bars when being dragged */ virtual bool SnapToDragBars() const {return false;} /** Called when the nodes position has been 'snapped' to something */ virtual void OnSnapNodeDataPosition(float OriginalX, float SnappedX) {} /** Cache the supplied geometry as our track geometry */ void CacheTrackGeometry(const FGeometry& TrackGeometry) { CachedTrackGeometry = TrackGeometry; } const FGeometry& GetTrackGeometry() const {return CachedTrackGeometry;} bool IsBeingDragged() const {return bBeingDragged;} protected: // Begin SWidget overrides. virtual FVector2D ComputeDesiredSize(float) const override; // End SWidget overrides. FSlateColor GetNodeColor() const; FText GetNodeText() const; // Temp, remove and replace with correct attribute void ToggleSelect(); void Select(); void Deselect(); bool IsSelected() const; bool bSelectedFallback; // only use this if the selection set isnt set STrackNodeSelectionSet * NodeSelectionSet; TAttribute NodeName; TAttribute DataStartPos; TAttribute DataLength; TAttribute ViewInputMin; TAttribute ViewInputMax; FOnNodeSelectionChanged OnNodeSelectionChanged; TAttribute NodeColor; TAttribute SelectedNodeColor; FOnTrackNodeDragged OnTrackNodeDragged; FOnTrackNodeDropped OnTrackNodeDropped; FOnTrackNodeClicked OnTrackNodeClicked; FOnTrackNodeDoubleClicked OnTrackNodeDoubleClicked; FOnNodeRightClickContextMenu OnNodeRightClickContextMenu; FSlateFontInfo Font; mutable FVector2D LastSize; //HACK Fixme: Need to update in OnPaint in case we are drag/dropped FGeometry CachedTrackGeometry; //Our parent tracks geometry, so we can calculate scale/position float DistanceDragged; bool bBeingDragged; bool bCenterOnPosition; bool bAllowDrag; bool bContentOverriden; friend class STrack; }; ////////////////////////////////////////////////////////////////////////// // STrack class STrack : public SPanel { public: SLATE_BEGIN_ARGS( STrack ) : _ViewInputMin() , _ViewInputMax() , _TrackMaxValue() , _TrackMinValue() , _TrackNumDiscreteValues() , _TrackColor(FLinearColor::White) , _OnSelectionChanged() , _DraggableBars() , _DraggableBarSnapPositions() , _DraggableBarLabels() , _OnBarDrag() , _OnTrackDragDrop() , _OnSummonContextMenu() , _OnTrackRightClickContextMenu() , _StyleInfo(FAppStyle::GetBrush( TEXT( "Persona.NotifyEditor.NotifyTrackBackground" ))) {} SLATE_ATTRIBUTE( float, ViewInputMin ) SLATE_ATTRIBUTE( float, ViewInputMax ) SLATE_ATTRIBUTE( float, TrackMaxValue ) SLATE_ATTRIBUTE( float, TrackMinValue ) SLATE_ATTRIBUTE( int32, TrackNumDiscreteValues ) SLATE_ARGUMENT( FLinearColor, TrackColor ) SLATE_EVENT( FOnNodeSelectionChanged, OnSelectionChanged ) SLATE_ATTRIBUTE( TArray, DraggableBars ) SLATE_ATTRIBUTE( TArray, DraggableBarSnapPositions ) SLATE_ATTRIBUTE( TArray, DraggableBarLabels ) SLATE_EVENT( FOnBarDrag, OnBarDrag) SLATE_EVENT( FOnBarClicked, OnBarClicked) SLATE_EVENT( FOnTrackDragDop, OnTrackDragDrop ) SLATE_EVENT( FOnAssetDragDrop, OnAssetDragDrop ) SLATE_EVENT( FOnBarDrop, OnBarDrop ) SLATE_EVENT( FOnSummonContextMenu, OnSummonContextMenu ) SLATE_EVENT( FOnTrackRightClickContextMenu, OnTrackRightClickContextMenu ) SLATE_ARGUMENT( const FSlateBrush*, StyleInfo ) SLATE_END_ARGS() STrack(); void Construct( const FArguments& InArgs ); virtual void OnArrangeChildren( const FGeometry& AllottedGeometry, FArrangedChildren& ArrangedChildren ) const override; virtual int32 OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const override; virtual FReply OnDrop( const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent ) override; virtual FReply OnDragOver( const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent ) override; virtual FReply OnDragDetected( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual void OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; virtual void OnDragLeave(const FDragDropEvent& DragDropEvent) override; int32 GetHitNode(const FGeometry& MyGeometry, const FVector2D& CursorPosition); FReply OnMouseMove( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; FReply OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; FReply OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual void OnMouseLeave( const FPointerEvent& MouseEvent ) override; virtual void OnMouseEnter( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override; virtual FCursorReply OnCursorQuery( const FGeometry& MyGeometry, const FPointerEvent& CursorEvent ) const override; void AddTrackNode( TSharedRef Node ); void ClearTrack(); FVector2D ComputeDesiredSize(float) const override; virtual FChildren* GetChildren() override; void GetSelectedNodeIndices(TArray& OutIndices); protected: bool GetDraggableBarSnapPosition(const FGeometry& MyGeometry, float &OutPosition) const; virtual TSharedPtr SummonContextMenu(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent); float GetNodeDragDropDataPos( const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent ) const; float GetSnappedPosForLocalPos( const FGeometry& MyGeometry, float TrackPos) const; void UpdateDraggableBarIndex( const FGeometry& MyGeometry, FVector2D CursorScreenPos ); float DataToLocalX( float Data, const FGeometry& MyGeometry ) const; float LocalToDataX( float Input, const FGeometry& MyGeometry ) const; TSlotlessChildren< STrackNode > TrackNodes; TAttribute> DraggableBars; TAttribute> DraggableBarSnapPositions; TAttribute> DraggableBarLabels; FOnBarDrag OnBarDrag; FOnBarDrop OnBarDrop; FOnBarClicked OnBarClicked; TAttribute DraggableBarColor; int32 DraggableBarIndex; bool bDraggingBar; TAttribute TrackMaxValue; TAttribute TrackMinValue; TAttribute TrackNumDiscreteValues; // Discrete values (such as "number of frames in animation" used for accurate grid lines) TAttribute ViewInputMin; TAttribute ViewInputMax; TAttribute TrackColor; FOnNodeSelectionChanged OnSelectionChanged; FOnGetBarPos OnGetDraggableBarPos; FOnTrackDragDop OnTrackDragDrop; FOnAssetDragDrop OnAssetDragDrop; TAttribute StyleInfo; FOnSummonContextMenu OnSummonContextMenu; FOnTrackRightClickContextMenu OnTrackRightClickContextMenu; TSharedPtr EditorActions; FSlateFontInfo Font; };