// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Misc/Attribute.h" #include "Styling/SlateColor.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/SWidget.h" #include "Layout/Margin.h" #include "Widgets/SCompoundWidget.h" #include "Styling/CoreStyle.h" #include "Styling/SlateTypes.h" class FPaintArgs; class FSlateWindowElementList; /** * A border is an widget that can be used to contain other widgets. * It has a BorderImage property, which allows it to take on different appearances. * Border also has a Content() slot as well as some parameters controlling the * arrangement of said content. */ class SBorder : public SCompoundWidget { SLATE_DECLARE_WIDGET_API(SBorder, SCompoundWidget, SLATE_API) public: SLATE_BEGIN_ARGS(SBorder) : _Content() , _HAlign( HAlign_Fill ) , _VAlign( VAlign_Fill ) , _Padding( FMargin(2.0f) ) , _OnMouseButtonDown() , _OnMouseButtonUp() , _OnMouseMove() , _OnMouseDoubleClick() , _BorderImage( FCoreStyle::Get().GetBrush( "Border" ) ) , _ContentScale( FVector2D(1,1) ) , _DesiredSizeScale( FVector2D(1,1) ) , _ColorAndOpacity( FLinearColor(1,1,1,1) ) , _BorderBackgroundColor( FLinearColor::White ) , _ForegroundColor( FSlateColor::UseForeground() ) , _ShowEffectWhenDisabled( true ) , _FlipForRightToLeftFlowDirection(false) {} SLATE_DEFAULT_SLOT( FArguments, Content ) SLATE_ARGUMENT( EHorizontalAlignment, HAlign ) SLATE_ARGUMENT( EVerticalAlignment, VAlign ) SLATE_ATTRIBUTE( FMargin, Padding ) SLATE_EVENT( FPointerEventHandler, OnMouseButtonDown ) SLATE_EVENT( FPointerEventHandler, OnMouseButtonUp ) SLATE_EVENT( FPointerEventHandler, OnMouseMove ) SLATE_EVENT( FPointerEventHandler, OnMouseDoubleClick ) SLATE_ATTRIBUTE( const FSlateBrush*, BorderImage ) SLATE_ATTRIBUTE( FVector2D, ContentScale ) SLATE_ATTRIBUTE( FVector2D, DesiredSizeScale ) /** ColorAndOpacity is the color and opacity of content in the border */ SLATE_ATTRIBUTE( FLinearColor, ColorAndOpacity ) /** BorderBackgroundColor refers to the actual color and opacity of the supplied border image.*/ SLATE_ATTRIBUTE( FSlateColor, BorderBackgroundColor ) /** The foreground color of text and some glyphs that appear as the border's content. */ SLATE_ATTRIBUTE( FSlateColor, ForegroundColor ) /** Whether or not to show the disabled effect when this border is disabled */ SLATE_ATTRIBUTE( bool, ShowEffectWhenDisabled ) /** Flips the background image if the localization's flow direction is RightToLeft */ SLATE_ARGUMENT(bool, FlipForRightToLeftFlowDirection) FArguments& Padding(float Uniform) { _Padding = FMargin(Uniform); return *this; } FArguments& Padding(float Horizontal, float Vertical) { _Padding = FMargin(Horizontal, Vertical); return *this; } FArguments& Padding(float Left, float Top, float Right, float Bottom) { _Padding = FMargin(Left, Top, Right, Bottom); return *this; } SLATE_END_ARGS() /** * Default constructor. */ SLATE_API SBorder(); SLATE_API virtual ~SBorder(); /** * Construct this widget * * @param InArgs The declaration data for this widget */ SLATE_API void Construct( const FArguments& InArgs ); /** * Sets the content for this border * * @param InContent The widget to use as content for the border */ SLATE_API virtual void SetContent( TSharedRef< SWidget > InContent ); /** * Gets the content for this border * * @return The widget used as content for the border */ SLATE_API const TSharedRef< SWidget >& GetContent() const; /** Clears out the content for the border */ SLATE_API void ClearContent(); /** Sets the color and opacity of the background image of this border. */ SLATE_API void SetBorderBackgroundColor(TAttribute InColorAndOpacity); /** Gets the color and opacity of the background image of this border. */ FSlateColor GetBorderBackgroundColor() const { return BorderBackgroundColorAttribute.Get(); } /** Set the desired size scale multiplier */ SLATE_API void SetDesiredSizeScale(TAttribute InDesiredSizeScale); /** See HAlign argument */ SLATE_API void SetHAlign(EHorizontalAlignment HAlign); /** See VAlign argument */ SLATE_API void SetVAlign(EVerticalAlignment VAlign); /** See Padding attribute */ SLATE_API void SetPadding(TAttribute InPadding); /** Set whether or not to show the disabled effect when this border is disabled */ SLATE_API void SetShowEffectWhenDisabled(TAttribute InShowEffectWhenDisabled); /** Set the image to draw for this border. */ SLATE_API void SetBorderImage(TAttribute InBorderImage); /** Get the image to draw for this border. */ const FSlateBrush* GetBorderImage() const { return BorderImageAttribute.Get(); } public: // SWidget interface SLATE_API virtual int32 OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const override; // End of SWidget interface protected: //~Begin SWidget overrides. SLATE_API virtual FVector2D ComputeDesiredSize(float) const override; //~End SWidget overrides. /** Get whether or not to show the disabled effect when this border is disabled */ bool GetShowDisabledEffect() const { return ShowDisabledEffectAttribute.Get(); } /** Get the desired size scale multiplier */ FVector2D GetDesiredSizeScale() const { return DesiredSizeScaleAttribute.Get(); } TSlateAttributeRef GetBorderImageAttribute() const { return TSlateAttributeRef(SharedThis(this), BorderImageAttribute); } TSlateAttributeRef GetBorderBackgroundColorAttribute() const { return TSlateAttributeRef(SharedThis(this), BorderBackgroundColorAttribute); } TSlateAttributeRef GetDesiredSizeScaleAttribute() const { return TSlateAttributeRef(SharedThis(this), DesiredSizeScaleAttribute); } TSlateAttributeRef GetShowDisabledEffectAttribute() const { return TSlateAttributeRef(SharedThis(this), ShowDisabledEffectAttribute); } private: TSlateAttribute BorderImageAttribute; TSlateAttribute BorderBackgroundColorAttribute; TSlateAttribute DesiredSizeScaleAttribute; /** Whether or not to show the disabled effect when this border is disabled */ TSlateAttribute ShowDisabledEffectAttribute; /** Flips the image if the localization's flow direction is RightToLeft */ bool bFlipForRightToLeftFlowDirection; };