// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Framework/Docking/TabManager.h" #include "Framework/Docking/SDockingNode.h" class SDockingTabStack; /** Dynamic N-way splitter that provides the resizing functionality in the docking framework. */ class SDockingSplitter : public SDockingNode { public: SLATE_BEGIN_ARGS(SDockingSplitter){} SLATE_END_ARGS() SLATE_API void Construct( const FArguments& InArgs, const TSharedRef& PersistentNode ); virtual Type GetNodeType() const override { return SDockingNode::DockSplitter; } /** * Add a new child dock node at the desired location. * Assumes this DockNode is a splitter. * * @param InChild The DockNode child to add. * @param InLocation Index at which to add; INDEX_NONE (default) adds to the end of the list */ SLATE_API void AddChildNode( const TSharedRef& InChild, int32 InLocation = INDEX_NONE); /** * Replace the child InChildToReplace with Replacement * * @param InChildToReplace The child of this node to replace * @param Replacement What to replace with */ SLATE_API void ReplaceChild( const TSharedRef& InChildToReplace, const TSharedRef& Replacement ); /** * Remove a child node from the splitter * * @param ChildToRemove The child node to remove from this splitter */ SLATE_API void RemoveChild( const TSharedRef& ChildToRemove ); /** * Remove a child at this index * * @param IndexOfChildToRemove Remove a child at this index */ SLATE_API void RemoveChildAt( int32 IndexOfChildToRemove ); /** * Inserts NodeToPlace next to RelativeToMe. * Next to means above, below, left or right of RelativeToMe. * * @param NodeToPlace The node to insert. * @param Direction Where to insert relative to the other node * @param RelativeToMove Insert relative to this node. */ SLATE_API void PlaceNode( const TSharedRef& NodeToPlace, SDockingNode::RelativeDirection Direction, const TSharedRef& RelativeToMe ); /** Sets the orientation of this splitter */ SLATE_API void SetOrientation(EOrientation NewOrientation); /** Gets an array of all child dock nodes */ SLATE_API const TArray< TSharedRef >& GetChildNodes() const; /** Gets an array of all child dock nodes and all of their child dock nodes and so on */ SLATE_API TArray< TSharedRef > GetChildNodesRecursively() const; /** Recursively searches through all children looking for child tabs */ SLATE_API virtual TArray< TSharedRef > GetAllChildTabs() const override; /** Gets the number of tabs in all children recursively */ SLATE_API virtual int32 GetNumTabs() const override; /** Should this node auto-size or be a percentage of its parent size */ SLATE_API virtual SSplitter::ESizeRule GetSizeRule() const override; /** Gets the size coefficient of a given child dock node */ SLATE_API float GetSizeCoefficientForSlot(int32 Index) const; /** Gets the orientation of this splitter */ SLATE_API EOrientation GetOrientation() const; SLATE_API virtual TSharedPtr GatherPersistentLayout() const override; /** * The tab stack which would be appropriate to use for showing the minimize/maximize/close buttons. * On Windows it is the upper right most. On Mac the upper left most. */ SLATE_API TSharedRef FindTabStackToHouseWindowControls() const; /** Which tab stack is appropriate for showing the app icon. */ SLATE_API TSharedRef FindTabStackToHouseWindowIcon() const; protected: /** Is the docking direction (left, right, above, below) match the orientation (horizontal vs. vertical) */ static SLATE_API bool DoesDirectionMatchOrientation( SDockingNode::RelativeDirection InDirection, EOrientation InOrientation ); static SLATE_API SDockingNode::ECleanupRetVal MostResponsibility( SDockingNode::ECleanupRetVal A, SDockingNode::ECleanupRetVal B ); SLATE_API virtual SDockingNode::ECleanupRetVal CleanUpNodes() override; SLATE_API virtual void OnResized() override; SLATE_API float ComputeChildCoefficientTotal() const; enum class ETabStackToFind { UpperLeft, UpperRight }; /** Helper: Finds the upper left or the upper right tab stack in the hierarchy */ SLATE_API TSharedRef FindTabStack(ETabStackToFind FindMe) const; /** The SSplitter widget that SDockingSplitter wraps. */ TSharedPtr Splitter; /** The DockNode children. All these children are kept in sync with the SSplitter's children via the use of the public interface for adding, removing and replacing children. */ TArray< TSharedRef > Children; /** * As the Dock area is updating after clean up of any added, removed, or newly shown Dock areas or tabs, * the tabs/tab well may need adjusting. Use this for post clean up docked tab adjustments. */ SLATE_API void AdjustDockedTabsIfNeeded(); };