// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Widgets/Layout/SExpandableArea.h" #include "Layout/Containers/SlateBuilder.h" class SScrollBox; class SBox; class SImage; /** * The parameter objects for a FHeaderAndBodyContainer. */ class FHeaderAndBodyContainerArgs { public: FHeaderAndBodyContainerArgs( const FName& InIdentifier = "FHeaderAndBodyContainer", const TSharedRef& InHeader = MakeShared(), const TSharedRef& InBody = MakeShared(), const bool bInHasToggleButtonToCollapseBody = false, const bool bIsBodyHidden = false, const bool bIsHeaderHiddenOnCreate = false ); /** the identifier for the FHeaderAndBodyContainer */ FName Identifier; /** the FSlateBuilder that builds the header of this container */ TSharedRef HeaderBuilder; /** the FSlateBuilder that builds the body of this container */ TSharedRef BodyBuilder; /** whether or not this container has a button to toggle the body open and closed */ bool bHasToggleButtonToCollapseBody; /** if true, the body is initially hidden */ bool bIsBodyHidden; /** if true, the header is initially hidden */ bool bIsHeaderHiddenOnCreate; }; /** * A container which provides a header and a body, both of which can be any SWidget. */ class FHeaderAndBodyContainer : public FSlateBuilder { public: /** * an enum to tell whether the body has been added or removed */ enum class EBodyLifeCycleEventType { Added, Removed }; DECLARE_DELEGATE_OneParam( FOnBodyAddedOrRemoved, EBodyLifeCycleEventType LifeCycleEventType ); /** * Sets the FSlateBuilder InHeaderBuilder to build the widget for the header of this container */ void SetHeader( const TSharedRef& InHeaderBuilder ); /** * Converts the SWidget HeaderWidget to an FSlateBuilder which will build the widget for the header of this container */ void SetHeader( const TSharedRef& HeaderWidget ); /** * Sets the FSlateBuilder InBodyBuilder to build the widget for the body of this container */ void SetBody( const TSharedRef& InBodyBuilder ); /** * Converts the SWidget BodyWidget to an FSlateBuilder which will build the widget for the body of this container */ void SetBody( const TSharedRef& BodyWidget ); /** * Constructs this container. * * @param Args the FHeaderAndBodyContainerArgs which will initialize this FHeaderAndBodyContainer */ FHeaderAndBodyContainer( const FHeaderAndBodyContainerArgs& Args = FHeaderAndBodyContainerArgs() ); FOnBodyAddedOrRemoved OnBodyAddedOrRemoved; /** * Generates the widget for this header and body container and returns it */ virtual TSharedPtr GenerateWidget() override; /** Updates/reloads this widget. This should be called after a consumer has changed any Data in this */ virtual void UpdateWidget() override; /** * Sets the header content to be hidden * * @param bInIsHeaderHidden if true the header is hidden, else it is false */ void SetHeaderHidden(bool bInIsHeaderHidden ); /** @return true if the body is empty, else returns false */ bool IsBodyEmpty() { return BodyBuilder->IsEmpty(); } private: /** * called when the user toggles the expansion of the body */ FReply ToggleBodyExpansionState(); /*** Makes the body visible by adding it */ void UpdateToBodyAddedState(); /*** Makes the body invisible by removing it */ void UpdateToBodyRemovedState(); /*** Makes the header invisible by removing it */ void UpdateToHeaderRemovedState(); /*** Makes the header visible by adding it */ void UpdateToHeaderAddedState(); /** overriding to hide the method, as it is not needed */ virtual void ResetWidget() override; /** builds the header for this container */ TSharedRef HeaderBuilder; /** the SBox containing the header */ TSharedPtr HeaderContentSBox; /** the SBorder containing the header */ TSharedPtr HeaderContentSBorder; /** builds the body for this container */ TSharedRef BodyBuilder; /** the SBox containing the body */ TSharedPtr BodyContentSBox; /** the scrollbox for the body */ TSharedPtr BodyContentSScrollBox; /** the image for the toggle body button */ TSharedPtr ToggleExpansionImage; /** if true, this container has a toggle button to hide and show the body */ bool bHasToggleButtonToCollapseBody; /** if true, the body will not be viewable */ bool bIsBodyHidden; /** if true, the header will not be viewable */ bool bIsHeaderHidden; };